HttpWebRequest超时处理

Zai*_*mir 24 .net c# timeout exception 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
    }
}
Run Code Online (Sandbox Code Playgroud)

我省略了文件读取代码,因为它不是我们关注的问题.现在我需要确保一旦抛出WebException,我会过滤异常以查看它是否确实是超时异常.我想与异常消息进行比较但我不确定这是否是正确的方法,因为有问题的应用程序是商业应用程序,我担心消息在不同语言之间有所不同.我应该寻找什么信息.

有什么建议?

Yuv*_*kov 41

你可以看看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;
}
Run Code Online (Sandbox Code Playgroud)

使用C#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.
}
Run Code Online (Sandbox Code Playgroud)