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

时间:2013-09-06 20:03:29

标签: c# .net system.net.webexception

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

  • 操作已超时
  • 远程服务器返回错误:(504)Gateway Timeout。

他们的详细信息如下:

  

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

  

System.Net.WebException:远程服务器返回错误:(504)   网关超时。在System.Net.HttpWebRequest.GetResponse()处   ....

这两者之间有什么不同。

我的功能如下:

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的列表。

4 个答案:

答案 0 :(得分:25)

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

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

  1. 互联网连接不良(如果他们都抛出这个错误,那很可能)。
  2. 主机连接错误(您连接的任何人都有问题)。
  3. 错误的DNS(如果主机是域名,这可能是罪魁祸首)。
  4. 错误的主机代理(主机端的某些内容没有正确响应)。
  5. 在这些情况下,我会手动测试与受影响主机的连接,并以这种方式解决这些问题。首先尝试测试您自己的连接以及其他主机。如果问题是特定主机,那么他们可能会遇到与您联系的问题。

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

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

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

答案 1 :(得分:16)

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

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

504网关超时服务器错误。它通常是由您发送请求的服务器基础结构中的错误或过载引起的。这是黑盒子。

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

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

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

答案 2 :(得分:3)

您可以咨询this link 因为“操作已经超时”,问题可能是由于服务器已经忙于完成某项任务。 并且(504)网关超时意味着一个服务器在尝试加载网页或填充浏览器的另一个请求时没有从其访问的另一个服务器收到及时响应。

答案 3 :(得分:0)

操作已超时 在指定的时间定义且服务器无法在特定时间内响应时发生(发生在远程服务器内)

HTTP循环中的

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

从站点的IP名称(没有前导'http://'的站点URL)获取IP地址。此查找(将IP名称转换为IP地址)由域名服务器(DNS)提供。 打开与该IP地址的IP套接字连接。 通过该套接字写入HTTP数据流。 作为响应,从Web服务器接收HTTP数据流。此数据流包含状态代码,其值由HTTP协议确定。解析此数据流以获取状态代码和其他有用信息。 当客户端收到识别为“504”的HTTP状态代码时,在上面的最后一步中会发生此错误。 (上次更新时间:2012年3月)。

修复504错误 - 一般

此问题完全是由于后端计算机(可能包括Web服务器)之间的IP通信速度慢。只有在托管Web服务器的站点上设置网络的人才能解决此问题。