操作之间的差异有超时和(504)网关超时
我在我的应用程序中使用HttpWebRequest
,它在多个线程中检查一些URI。 我得到了多种类型的超时exception。
- 操作已超时
- 远程服务器返回错误:(504)网关超时。
他们的细节如下:
System.Net.WebException:操作已在System.Net.HttpWebRequest.GetResponse()处于超时时间……
和
System.Net.WebException:远程服务器返回错误:(504)Gateway Timeout。 在System.Net.HttpWebRequest.GetResponse()at ….
这两者之间有什么不同。
我的function如下:
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调用此方法,是否会出现问题。 我没有得到任何跨线程exception。 此方法实际上是Windows服务的一部分,它监视近200个URI的列表。
用蹩脚的话说……
“操作超时”表示发送请求的程序已超时等待响应。 这可能意味着:
- 糟糕的互联网连接(如果他们都抛出这个错误,那么很可能)。
- 主机连接错误(您连接的任何人都有问题)。
- 糟糕的DNS(如果主机是域名,这可能是罪魁祸首)。
- 糟糕的主机代理(主机端的某些东西没有正确响应)。
在这些情况下,我将手动测试与受影响主机的连接,并以这种方式解决这些问题。 首先尝试测试您自己的连接,以及其他主机。 如果问题是特定主机,那么他们可能会遇到与您联系的问题。
当您获得“504 – 网关超时”时,表示您的程序已成功连接到主机,但主机端出现问题并且无法返回所需的响应。 这不是连接问题,而是请求或主机本身的问题。 可能是主机陷入无限循环试图处理您的请求,或者只是“挂起”,处理您请求的代理放弃并发回您的请求。
在这些情况下,我会查看主机,可能正在运行主机将接受的测试请求。 如果主机不在您的控制范围内,则联系任何人并报告错误。
所以 – 简而言之。 第一个超时可能与连接有关,而504超时可能是主机处理。 希望这可以帮助。
操作已超时是客户端错误。 它通常由WebRequest
(及其后代)的各种*Timeout
属性引起: Timeout
, ContinueTimeout
, ReadWriteTimeout
。 如果您发送请求的服务器在您设置的超时内没有响应,则会收到TimeoutException
。
要避免此错误,可以增加超时。 但是,默认情况下它们非常大,所以增加不太可能有所帮助。 你可以尝试几次。 如果它没有帮助,服务器可能已关闭。
504 Gateway Timeout是服务器错误。 它通常是由您发送请求的服务器基础结构中的错误或过载引起的。 这是黑盒子。
您无法对此错误执行任何操作,只有服务器管理员才能解决此问题。 如果错误是由超载引起的,你可以尝试多次请求,但显然这样做往往会带来更多弊大于利。
通常,如果您没有获得HTTP代码,那么它是.NET的一个例外。 如果您确实获得了HTTP代码,则可以查看第一个数字:
2**
好的
3**
重定向
4**
客户端错误
5**
服务器错误
您可以参考此链接 “操作已超时”,问题可能是由于服务器已经忙于执行某项任务。 并且(504)网关超时意味着一个服务器在尝试加载网页或填充浏览器的另一个请求时没有从其访问的另一个服务器接收及时响应。
当定义了指定的时间且服务器无法在该特定时间内响应时(在远程服务器内部发生) ,操作已超时
而
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服务器的站点上设置网络的人才能解决此问题。