18

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

4

4 回答 4

33

用最蹩脚的话...

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

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

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

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

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

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

于 2013-09-15T08:26:12.303 回答
19

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

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

504 网关超时服务器错误。它通常是由您向其发送请求的服务器基础架构中的错误或过载引起的。这对你来说是黑匣子。

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

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

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

于 2013-09-13T15:03:16.677 回答
3

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

于 2013-09-09T14:15:42.850 回答
0

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

尽管

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

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

修复 504 错误 - 常规

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

于 2013-09-10T13:36:56.680 回答