Обработка тайм-аута HttpWebRequest

У меня действительно простой вопрос. Я загружаю файлы на сервер с помощью HTTP POST. Дело в том, что мне нужно специально обрабатывать таймауты соединений и добавлять бит алгоритма ожидания после того, как произошел перерыв в перезагрузке сервера.

Мой код довольно прост:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("SomeURI");
request.Method = "POST";
request.ContentType = "application/octet-stream";
request.KeepAlive = true;
request.Accept = "*/*";
request.Timeout = 300000;
request.AllowWriteStreamBuffering = false;

try
{
      using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
      {
            WebHeaderCollection headers = response.Headers;    
            using (Stream Answer = response.GetResponseStream())
            {
                // Handle.
            }
      }
}
catch (WebException e)
{
    if (Timeout_exception)
    {
       //Handle timeout exception
    }
}

Я пропустил код чтения файла, поскольку это не наша проблема. Теперь мне нужно убедиться, что после создания WebException я фильтрую исключение, чтобы увидеть, действительно ли это исключение тайм-аута. Я думал о сравнении с сообщением об исключении, но я не уверен, правильно ли это, так как это приложение является коммерческим приложением, и я боюсь, что сообщение меняется между разными языками. И какое сообщение я должен искать.

Любые предложения?

Ответы

Ответ 1

Вы можете посмотреть WebException.Status. Обозначение WebExceptionStatus имеет флаг Timeout:

try
{
   using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
   {
      WebHeaderCollection headers = response.Headers;    
      using (Stream answer = response.GetResponseStream())
      {
          // Do stuff
      }
   }
}
catch (WebException e)
{
   if (e.Status == WebExceptionStatus.Timeout)
   {
      // Handle timeout exception
   }
   else throw;
}

Использование фильтров исключений С# 6 может пригодиться здесь:

try
{
    var request = WebRequest.Create("http://www.google.com");
    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
    {
        WebHeaderCollection headers = response.Headers;
        using (Stream answer = response.GetResponseStream())
        {
            // Do stuff
        }
    }
}
catch (WebException e) when (e.Status == WebExceptionStatus.Timeout)
{
    // If we got here, it was a timeout exception.
}