操作之间的差异有超时和(504)网关超时

use*_*965 15 .net c# system.net.webexception

HttpWebRequest在我的应用程序中使用,它检查多个线程中的一些URI.我得到了多种类型的超时异常.

  • 操作已超时
  • 远程服务器返回错误:(504)网关超时.

他们的细节如下:

System.Net.WebException:操作已在System.Net.HttpWebRequest.GetResponse()处于超时时间......

System.Net.WebException:远程服务器返回错误:(504)Gateway Timeout.在System.Net.HttpWebRequest.GetResponse()at ....

这两者之间有什么不同.

我的功能如下:

public bool CheckUri(Uri m_url)
{
    try
    {
        HttpWebRequest request = HttpWebRequest.Create(m_url) as HttpWebRequest;
        request.UserAgent = "MyUserAgent";

        //For: The underlying connection was closed: An unexpected error occurred on a receive.
        request.KeepAlive = false; 
        request.ProtocolVersion = HttpVersion.Version10;

        request.Method = "HEAD"; //Get only the header information 
        using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
        {
            int statusCode = (int)response.StatusCode;
            if (statusCode >= 100 && statusCode < 400) //Good requests
            {
                string sContent = null;
                using (var stream = response.GetResponseStream())
                using (StreamReader loResponseStream = new StreamReader(stream))
                    sContent = loResponseStream.ReadToEnd();
                return true;

            }
            else
            {
                return false;
                //hard to reach here
            }
        }
    }
    //vexing exception
    catch (WebException ex)
    {
        if (ex.Status == WebExceptionStatus.ProtocolError) //400 errors
        {
            var response = ex.Response as HttpWebResponse;

            if (response != null)
            {
                Console.WriteLine("HTTP Status Code: " + (int)response.StatusCode);
                Console.WriteLine(response.StatusCode);
            }
        }
        else
        {
            Console.WriteLine(ex.Message);
        }
        return false;

    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

此外,如果有人可以告诉我,如果多个线程使用不同的URI调用此方法,是否会出现问题.我没有得到任何跨线程异常.此方法实际上是Windows服务的一部分,它监视近200个URI的列表.

小智 27

用蹩脚的话说......

"操作超时"表示发送请求的程序已超时,等待响应.这可能意味着:

  1. 糟糕的互联网连接(如果他们都抛出这个错误,那么很可能).
  2. 主机连接错误(您连接的任何人都有问题).
  3. 糟糕的DNS(如果主机是域名,这可能是罪魁祸首).
  4. 糟糕的主机代理(主机端的某些东西没有正确响应).

在这些情况下,我将手动测试与受影响主机的连接,并以这种方式解决这些问题.首先尝试测试您自己的连接以及其他主机.如果问题是特定主机,那么他们可能会遇到与您联系的问题.

当您获得"504 - 网关超时"时,表示您的程序已成功连接到主机,但主机端出现问题并且无法返回所需的响应.这不是连接问题,而是请求或主机本身的问题.可能是主机陷入无限循环试图处理您的请求,或者只是"挂起",处理您请求的代理放弃并发回您的请求.

在这些情况下,我会查看主机,可能正在运行主机将接受的测试请求.如果主机不在您的控制之内,则联系任何人并报告错误.

所以 - 简而言之.第一个超时可能与连接有关,而504超时可能是主机处理.希望这可以帮助.


Ath*_*ari 16

操作已超时客户端错误.它通常是由各种引起*Timeout的特性WebRequest:(及其后代)Timeout,ContinueTimeout,ReadWriteTimeout.如果您发送请求的服务器在您设置的超时时间内没有响应,则可以获得TimeoutException.

要避免此错误,可以增加超时.但是,默认情况下它们非常大,所以增加不太可能有所帮助.你可以尝试几次.如果它没有帮助,服务器可能已关闭.

504 Gateway Timeout服务器错误.它通常是由您发送请求的服务器基础结构中的错误或过载引起的.这是黑盒子.

您无法对此错误执行任何操作,只有服务器管理员才能解决此问题.如果错误是由超载引起的,你可以尝试多次请求,但显然这样做往往会带来更多弊大于利.

通常,如果您没有获得HTTP代码,那么它是.NET的一个例外.如果您确实获得了HTTP代码,则可以查看第一个数字:

2**确定
3**重定向客户端错误服务器错误
4**
5**

  • 2**OK 3**重定向4**客户端错误5**服务器错误+1! (3认同)