System.Net.WebResponse 抛出"System.Net.WebException: The operation has timed out"但已连接到 Web 服务器



我有一个方法,旨在将文件从HTTP URL下载到字节数组:

private static byte[] DownloadFileToByteArrayWorker(HttpWebRequest Request, int bufferLength)
{
byte[] responseByes = null;
//Round up to the nearest multiple of 1024
bufferLength = AdjustBufferLength(bufferLength);
Request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
Request.ServicePoint.Expect100Continue = false;
Request.Headers.Add(HttpRequestHeader.CacheControl, "no-cache");
using (var Response = (HttpWebResponse)Request.GetResponse())
{
using (Stream ResponseStream = Response.GetResponseStream())
{
using (MemoryStream ms = new MemoryStream())
{
int count = 0;
byte[] buf = new byte[bufferLength];
while ((count = ResponseStream.Read(buf, 0, buf.Length)) > 0)
{
ms.Write(buf, 0, count);
}
responseByes = ms.ToArray();
}
}
}
return responseByes;
}

Request.GetResponse((无论我将HttpWebRequest的Timeout属性设置多长时间,都会抛出超时异常。我可以通过我的日志验证程序在出错之前是否等待了完整的超时时间,但是,将我的日志与web服务器日志关联表明web服务器几乎立即发回响应。

一个有趣的注意事项是,当我通过负载均衡器而不是直接访问同一个web服务器时,它几乎会立即下载文件。此外,如果我直接在网络浏览器中通过网络服务器访问URL(不需要代理,顺便说一句(,我也可以立即从各个网络服务器下载文件。

一些附加细节:

  • 我在Windows 2012 R2上使用.NET Framework 4.7
  • 我尝试连接的web服务器是RHEL7上的Apache。我不确定Apache的具体版本
  • 我正在为HTTP流量保留的特定端口上连接到web服务器(一个单独的网站托管在HTTPS的不同端口号上(
  • 没有web代理

有什么建议吗?

正如您所说,您的代码只有在调用负载均衡器时才有问题,我认为问题是你的客户端发送了一个100 continue请求,但你的负载均衡器不知道如何处理

这就是您的客户端没有在连接开始后立即发送所有数据的原因。

您可以在HTTP-rfc第8.2.3节中找到有关100 continue的更多信息。

要修复c#中客户端的行为,您必须添加以下代码:

ServicePointManager.Expect100Continue = false;

您可以在此处查看有关此功能的完整文档。

相关内容

  • 没有找到相关文章

最新更新