System.Net.WebResponse引发“ System.Net.WebException:操作已超时”,但已连接到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,buf.Length)) > 0)
                {
                    ms.Write(buf,count);
                }
                responseByes = ms.ToArray();
            }
        }
    }

    return responseByes;
}

Request.GetResponse()引发超时异常,无论我将HttpWebRequest的Timeout属性设置多长时间。我可以通过日志来验证程序是否在等待整个超时周期之后才出错,但是,将我的日志与Web服务器日志相关联可以表明Web服务器几乎立即发送回了响应。

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

一些其他详细信息:

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

有什么建议吗?

iCMS 回答:System.Net.WebResponse引发“ System.Net.WebException:操作已超时”,但已连接到Web服务器

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

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

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

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

ServicePointManager.Expect100Continue = false;

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

本文链接:https://www.f2er.com/1604670.html

大家都在问