【问题标题】:Difference between operation has time out and (504) Gateway Timeout操作有超时和(504)网关超时之间的区别
【发布时间】:2013-09-06 20:03:29
【问题描述】:

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

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

他们的详细信息如下:

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

【问题讨论】:

  • 一个是直接超时,即你的具体操作;另一种表示网关(通往目的地的路线)超时。你谷歌了吗?有很多参考资料。
  • @GrantThomas,我试过了,但我不确定它们是相同还是不同。

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


【解决方案1】:

用最蹩脚的话...

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

  1. 互联网连接不良(如果他们都抛出此错误,那么这很可能)。
  2. 错误的主机连接(无论您连接到谁都有问题)。
  3. DNS 错误(如果主机是域名,这可能是罪魁祸首)。
  4. 错误的主机代理(主机端的某些东西没有正确响应)。

在这些情况下,我会手动测试与受影响主机的连接并以这种方式解决这些问题。尝试先测试您自己的连接,然后再测试其他主机。如果问题出在特定主机上,那么他们可能有问题,您需要与他们联系。

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

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

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

【讨论】:

    【解决方案2】:

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

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

    504 Gateway Timeout服务器 错误。它通常是由您向其发送请求的服务器基础架构中的错误或过载引起的。它是你的黑匣子。

    您对此错误无能为力,只有服务器管理员可以解决该问题。如果错误是由过载引起的,您可以尝试多次请求,但这样做太频繁显然弊大于利。

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

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

    【讨论】:

    • 2** OK 3** 重定向 4** 客户端错误 5** 服务器错误 +1 !
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      操作已超时 当定义了指定时间并且服务器无法在该特定时间回复时发生(发生在远程服务器内部)

      同时

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

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

      修复 504 错误 - 常规

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

      【讨论】:

      • 您的回答不正确且具有误导性。 “操作已超时”可能由服务器引起(通过未响应),但由于客户端超时,它在客户端上发生。至于第二部分,在没有任何参考的情况下从 Google 复制粘贴第一个结果是毫无用处的。
      猜你喜欢
      • 2013-05-20
      • 2011-08-30
      • 2017-04-30
      • 2019-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多