操作超时和(504)网关超时之间的区别

21

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

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

它们的细节如下:

System.Net.WebException: 操作已超时 at System.Net.HttpWebRequest.GetResponse() at ......

System.Net.WebException: 远程服务器返回错误: (504) 网关超时 at 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;
    }
}

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


1
一个是直接超时,即您的特定操作;另一个意味着网关(通往目标的路线)遭受了超时。你有谷歌吗?有很多参考资料。 - Grant Thomas
@GrantThomas,我尝试了,但我不确定它们是相同的还是不同的。 - user2711965
4个回答

37
用最简单的语言来讲,“Operation Timed Out”就是你的程序发送请求后等待响应超时了。这可能是因为以下原因之一:
1.网络连接不好(如果所有人都遇到此错误,则很可能如此)。 2.主机连接出现问题(你正在连接的主机有问题)。 3.DNS解析出现问题(如果主机是域名,这可能是罪魁祸首)。 4.主机代理出现问题(主机端的某个内容未能正确响应)。
在这些情况下,我会手动测试受影响主机的连接并以这种方式解决问题。首先尝试测试自己的连接和其他主机。如果问题是特定的主机,则可能需要联系他们解决问题。
当你遇到“504 - 网关超时”时,这意味着您的程序已经成功连接到主机,但主机端出现问题,无法返回所需的响应。这不是连接问题,而是请求或主机本身中的问题。可能是主机陷入了无限循环中,试图处理您的请求,或者主机出现了问题,并且处理您的请求的代理已放弃并将其退回。
在这些情况下,我会检查主机,可能运行主机接受的测试请求。如果主机不在您的控制范围内,请联系相应的人员并报告错误。
简而言之,“Operation Timed Out”可能与连接有关,而“504 - 网关超时”可能与主机处理相关。希望这可以帮到你。

22

操作已超时是一种客户端错误。通常由WebRequest(及其派生类)的各种 *Timeout 属性引起: Timeout, ContinueTimeout, ReadWriteTimeout。如果您发送的请求到服务器没有在设置的超时时间内响应,则会出现TimeoutException

要避免此错误,您可以增加超时时间。但是,默认情况下它们已经很大了,因此增加不太可能有所帮助。你可以尝试多次。如果这样做没有帮助,那么服务器可能已经停止运行。

504网关超时是一种服务器错误。通常是由于您发送请求的服务器基础设施中存在错误或过载造成的。对于您来说,这是一个黑匣子。

您无法处理此错误,只有服务器管理员才能解决。如果错误是由过载引起的,您可以尝试多次请求,但这样做太频繁会造成更多的损害,显然不好。

一般情况下,如果你没有得到HTTP状态码,那么就是.NET异常。如果你得到了HTTP状态码,你可以看第一个数字:

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


4
2** OK 3** 重定向 4** 客户端错误 5** 服务器错误 +1 ! - Hichem

3
您可以参考这个链接,来解决“操作超时”的问题,此问题可能是由于服务器正在繁忙地处理某些任务所致。 而(504)网关超时意味着在浏览器尝试加载网页或执行其他请求时,一个服务器没有及时收到另一个服务器的响应。

0

操作已超时 当定义了特定的时间并且服务器不能在该特定时间内回复时出现(出现在远程服务器内部)

HTTP周期中的504错误 (发生在客户端和服务器之间的通信中) 任何客户端(例如您的Web浏览器或我们的CheckUpDown机器人),在与Web服务器通信时都会经历以下循环:

从站点的IP名称(去掉前导的“http://”的站点URL)获取IP地址。这种查找(将IP名称转换为IP地址)由域名服务器(DNSs)提供。 打开与该IP地址的IP套接字连接。 通过该套接字编写HTTP数据流。 在响应中从Web服务器接收HTTP数据流返回。此数据流包含状态代码,其值由HTTP协议确定。解析此数据流以获取状态代码和其他有用信息。 当客户端收到一个它识别为“504”的HTTP状态代码时,即出现上述最后一步中的错误。(最近更新:2012年3月)。

修复504错误-常规

这个问题完全是由于后端计算机之间的IP通信缓慢造成的,可能包括Web服务器。只有在托管Web服务器的站点设置网络的人才能解决这个问题。


5
你的答案不正确且具有误导性。“操作超时”可以由服务器未响应引起,但由于客户端超时而在客户端上发生。至于第二部分,从Google复制粘贴第一个结果且没有任何参考资料几乎是无用的。 - Athari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接