ign*_*ool 15 .net 64-bit httpwebrequest
我最近尝试在64位版本的Windows上运行.NET应用程序,并且惊讶地注意到我HttpWebRequest.GetResponse()
在本地网络上对Web服务的所有调用都在谈论(大约500ms)时间.以下是有关我的测试设置的一些信息:
测试代码是MSDN文章中HttpWebRequest.GetResponse
描述的示例的略微修改版本.我执行的唯一修改只是一个循环,因此我可以计算10个连续调用和基本身份验证,因为我定位的Web服务需要身份验证:
using System;
using System.Diagnostics;
using System.Net;
using System.Text;
using System.IO;
public class Program
{
// Specify the URL to receive the request.
public static void Main (string[] args)
{
CredentialCache crCache = null;
Stopwatch s = new Stopwatch();
for (int i = 0; i < 10; i++)
{
s.Reset();
s.Start();
HttpWebRequest request =
(HttpWebRequest)WebRequest.Create (args[0]);
// Set some reasonable limits on resources used by this request
request.MaximumAutomaticRedirections = 4;
request.MaximumResponseHeadersLength = 4;
// Set credentials to use for this request.
if (crCache == null)
{
crCache = new CredentialCache();
crCache.Add(new Uri(args[0]), "Basic",
new NetworkCredential("user", "password"));
}
request.Credentials = crCache;
request.PreAuthenticate = true;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Console.WriteLine("Content length is {0}", response.ContentLength);
Console.WriteLine("Content type is {0}", response.ContentType);
// Get the stream associated with the response.
Stream receiveStream = response.GetResponseStream();
// Pipes the stream to a higher level stream reader with the required encoding format.
StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8);
Console.WriteLine("Response stream received.");
//Console.WriteLine (readStream.ReadToEnd ());
response.Close();
readStream.Close();
s.Stop();
Console.WriteLine("Request took: " + s.ElapsedMilliseconds);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我编译了针对Windows Vista Home Premium的x86和针对64位Windows机器的x64的程序.这三台机器与托管Web服务的机器一起连接在同一网络交换机上.以下是我得到的结果:
GetResponse()
在大约150 毫秒内完成,而所有连续呼叫大约需要10毫秒.HttpWebRequest.PreAuthenticate
,则每个都GetResponse
在1000毫秒内完成(这是非常合理的,因为在这种情况下,每个请求触发两个单独的HTTP请求,一个以Unauthorized结束,一个得到正确的响应).有没有人知道我GetResponse
在64位版本的Windows上出现如此长时间延迟的原因?
有关该问题的其他信息:
32位:tcp对话如下:
64位:tcp对话如下:
我在64位机器上获得的500毫秒大部分都是在最后两步中出现的.请注意,这绝对与TCP堆栈无关(因为一切都可以使用firefox).我们在最后两个步骤中获得不同的TCP Ack模式(在32位中捎带,而64位中的单独TCP Ack帧)的原因是新的Web请求在64位情况下延迟了309 + 96ms(因此TCP堆栈输出一个单独的Ack框架,它不能等待应用层).
所以,似乎:
有线索吗?
小智 16
只是遇到遇到这个问题并遇到问题的其他人.
64位系统延迟的原因是WebClient等待Windows返回代理值.
编写这样的代码来克服这个问题.
WebClient wc = New WebClient;
wc.Proxy = null;
Run Code Online (Sandbox Code Playgroud)
这将消除一些用户(包括我自己:)看到的延迟
很高兴我终于可以回馈给那些帮助过我的社区了:)
And*_*ott -3
HttpWebRequest
两者HttpWebResponse
都实现了IDisposable
,但我没有看到你处理这些对象。我确实看到您关闭响应和响应流,但根据我的经验,如果您不处理所有这些对象,您可能会得到很长的延迟,否则看起来是随机的。
归档时间: |
|
查看次数: |
4858 次 |
最近记录: |