我正在使用开源库连接到我的网络服务器。我担心网络服务器的速度非常慢,然后我尝试用Ruby做一个简单的测试,我得到了这些结果
Ruby程序:10个HTTP的2.11秒 可获得
Ruby程序:100 HTTP的18.13秒 可获得
C#库:10个HTTP的20.81秒 可获得
C#library:100 HTTP的36847.46seconds 可获得
我已经分析并发现问题是这个功能:
private HttpWebResponse GetRawResponse(HttpWebRequest request) {
HttpWebResponse raw = null;
try {
raw = (HttpWebResponse)request.GetResponse(); //This line!
}
catch (WebException ex) {
if (ex.Response is HttpWebResponse) {
raw = ex.Response as HttpWebResponse;
}
}
return raw;
}
标记的行需要1秒以上才能完成,而执行1请求的ruby程序需要0.3秒。我也在127.0.0.1上进行所有这些测试,因此网络带宽不是问题。
导致这种巨大减速的原因是什么?
更新
查看更改的基准测试结果。我实际测试了10 GET而不是100,我更新了结果。
答案 0 :(得分:168)
我发现有慢速Web请求的主要罪魁祸首是代理属性。如果在调用GetResponse方法之前将此属性设置为null,则查询将跳过代理自动检测步骤:
request.Proxy = null;
using (var response = (HttpWebResponse)request.GetResponse())
{
}
在返回响应之前,代理自动检测最多需要7秒才能进行查询。 HttpWebRequest对象默认设置此属性,这有点令人讨厌。
答案 1 :(得分:20)
这可能与您一次打开多个连接的事实有关。默认情况下,最大打开HTTP连接数设置为2。尝试将此添加到.config文件中,看看是否有帮助:
<system.net>
.......
<connectionManagement>
<add address="*" maxconnection="20"/>
</connectionManagement>
</system.net>
答案 2 :(得分:10)
我在VB.Net MVC项目中遇到了类似的问题 在我的电脑上本地(Windows 7),它只需要1秒钟就可以点击页面请求,但在服务器(Windows Server 2008 R2)上,每个页面请求需要20秒以上。
我尝试了将代理设置为null
的组合 System.Net.WebRequest.DefaultWebProxy = Nothing
request.Proxy = System.Net.WebRequest.DefaultWebProxy
通过添加
更改配置文件 <system.net>
.......
<connectionManagement>
<add address="*" maxconnection="20"/>
</connectionManagement>
</system.net>
这仍然没有减少服务器上的慢页面请求时间。最后,解决方案是取消选中服务器本身IE选项中的“自动检测设置”选项。 (在“工具” - >“> Internet选项”下,选择“连接”选项卡。按“局域网设置”按钮)
在我取消选中服务器上的此浏览器选项后,所有页面请求时间立即从20秒降至1秒以下。
答案 3 :(得分:7)
我开始在这个区域观察类似于OP的减速,当增加MaxConnections时,它会有所改善。
ServicePointManager.DefaultConnectionLimit = 4;
但是在构建了这么多WebRequest之后,延迟又回来了。
在我的情况下,问题在于我正在调用POST而不是对响应感到困扰,因此没有采取或做任何事情。不幸的是,这让WebRequest浮动,直到它们超时。
解决方法是拿起响应并关闭它。
WebRequest webRequest = WebRequest.Create(sURL);
webRequest.Method = "POST";
webRequest.ContentLength = byteDataGZ.Length;
webRequest.Proxy = null;
using (var requestStream = webRequest.GetRequestStream())
{
requestStream.WriteTimeout = 500;
requestStream.Write(byteDataGZ, 0, byteDataGZ.Length);
requestStream.Close();
}
// Get the response so that we don't leave this request hanging around
WebResponse response = webRequest.GetResponse();
response.Close();
答案 4 :(得分:3)
使用 localhost 以外的计算机,然后使用WireShark查看通过网络传输的内容。
像其他人所说的那样,它可以是很多东西。在TCP级别上查看事物应该给出清晰的图像。答案 5 :(得分:3)
我不知道我到底是如何达到这种解决方法的,我还没有时间做一些研究,所以这取决于你们。有一个参数,我就像这样使用它(在我的类的构造函数中,在实例化HTTPWebRequest对象之前):
System.Net.ServicePointManager.Expect100Continue = false;
我不知道为什么,但现在我的电话看起来更快。
答案 6 :(得分:1)
我知道这是一个旧线程,但我已经用慢速HttpWebRequest丢失了一整天,尝试了所有提供的解决方案而没有运气。每个地址的请求都超过一分钟。
最终,问题出现在我的防病毒防火墙(Eset)上。我使用防火墙和交互模式,但 Eset以某种方式完全关闭。这导致请求永远持续下去。在打开Eset 并执行请求后,会显示提示防火墙消息,确认后,请求执行不到一秒。
答案 7 :(得分:0)
我尝试了所有这里描述的解决方案,没有运气,电话花了大约5分钟。
问题是什么: 我需要相同的会话,显然是相同的cookie(在同一台服务器上发出的请求),所以我将Request.Cookies中的cookie重新创建为WebRequest.CookieContainer 。响应时间约为5分钟。
我的解决方案: 注释掉与cookie相关的代码和bam!电话花了不到一秒钟。
答案 8 :(得分:0)
这对我有用:
<configuration>
<system.net>
<defaultProxy erabled="false"/>
</system.net>
</configuration>
答案 9 :(得分:0)
对我来说,问题是我安装了LogMeIn Hamachi - 具有讽刺意味的是远程调试同一个程序,然后开始展现这种极端缓慢。
仅供参考,禁用Hamachi网络适配器是不够的,因为它的Windows服务似乎重新启用了适配器。
此外,重新连接到我的Hamachi网络并没有解决问题。只禁用适配器(通过禁用LogMeIn Hamachi Windows服务)或者可能卸载Hamachi,解决了我的问题。
是否可以要求logger.warning("SKIPPED File: '%s'; " \
"MyFunc() returned no results."
% (dir_file, ))
通过特定的网络适配器?
答案 10 :(得分:0)
对我来说,使用HttpWebRequest
来平均本地调用API的时间为40毫秒,而使用服务器上的API的平均调用时间为270ms。但是在两种环境下,通过Postman呼叫它们的平均时间为40ms。此线程中的解决方案都对我没有任何影响。
然后我发现this article提到了Nagle算法:
Nagle算法通过减少跨网络发送的数据包数量来提高网络效率。它通过在将少量数据写入网络时在客户端上设置长达200毫秒的延迟来完成此操作。延迟是可能要写入其他数据的等待时间。新数据将添加到同一数据包中。
将ServicePoint.UseNagleAlgorithm
设置为false
是我所需要的魔术,它产生了巨大的变化,并且服务器上的性能现在几乎与本地性能相同。
var webRequest = (HttpWebRequest)WebRequest.Create(url);
webRequest.Method = "POST";
webRequest.ServicePoint.Expect100Continue = false;
webRequest.ServicePoint.UseNagleAlgorithm = false; // <<<this is the important bit
请注意,这对我来说只处理少量数据,但是,如果您的请求涉及大数据,则可能有必要根据请求的大小/响应的预期大小将此条件设为条件标记。
答案 11 :(得分:0)
对于我来说,在代码中添加AspxAutoDetectCookieSupport=1
,问题就解决了
Uri target = new Uri("http://payroll");
string responseContent;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(target);
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add(new Cookie("AspxAutoDetectCookieSupport", "1") { Domain = target.Host });
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
using (Stream responseStream = response.GetResponseStream())
{
using (StreamReader sr = new StreamReader(responseStream))
responseContent = sr.ReadToEnd();
}
}
答案 12 :(得分:-1)
我们在网络应用上遇到了同样的问题。我们等待响应5秒钟。当我们将IIS上的applicationPool上的用户更改为networkService时,响应开始不到1秒