gpt4 book ai didi

.net - 64 位 Windows 上的 HttpWebRequest GetResponse 延迟

转载 作者:行者123 更新时间:2023-12-02 09:02:48 25 4
gpt4 key购买 nike

我最近尝试在 64 位版本的 Windows 上运行 .NET 应用程序,并惊讶地注意到我所有的 HttpWebRequest.GetResponse()在我的本地网络上调用 Web 服务的时间很长(大约 500 毫秒)才能完成。以下是有关我的测试设置的一些信息:

  • .NET 3.5
  • Windows Vista 家庭高级版 32 位、Windows Vista 商业版 64 位和 Windows Server 2008 64 位。

  • 测试代码是 MSDN's article on 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);
    }
    }
    }

    我编译了针对 Windows Vista Home Premium 的 x86 和 64 位 Windows 机器的 x64 的程序。三台机器与托管 Web 服务的机器连接在同一网络交换机上。以下是我得到的结果:
  • Windows Vista 家庭高级版 32 位 x86 组件 : 第一次拨打 GetResponse()左右完成150 毫秒 ,而所有连续的调用都占用了 左右10 毫秒 .
  • Windows Vista Business 64 位、Server 2008 64 位、x86 和 x64 程序集 : 第一个电话大约是 1000 毫秒 ,而每个连续调用都在 中完成500 毫秒 .如果我禁用 HttpWebRequest.PreAuthenticate , 每个 GetResponse完成于 1000 毫秒 (这是非常合理的,因为在这种情况下,每个请求都会触发两个单独的 HTTP 请求,一个以 Unauthorized 结束,另一个得到正确的响应)。

  • 有没有人知道我长这么长的原因 GetResponse在 64 位版本的 Windows 上延迟?

    编辑

    问题的附加信息:
  • 我测量了使用 Firefox 3.5 执行请求时的响应时间(建议通过 firebug),并且所有机器的请求响应延迟都相同,即问题没有重现。
  • 我用 Wireshark 做了进一步的数据包分析,得出了以下结果:

  • 32 位 : tcp对话如下:
  • 主机->服务器新的网络请求 HTTP GET/HTTP/1.1
  • server->host 两个 TCP 段(~5ms delta)
  • 主机->服务器 Tcp Ack(确认两个段)(~10us 增量)
  • 服务器->主机 HTTP/1.1 200 OK (~800us delta)
  • 主机->服务器新的网络请求 HTTP GET/HTTP/1.1 和前一个段的搭载 TCP 确认 (HTTP/1.1 200 OK) (~10ms delta)

  • 64 位 : tcp对话如下:
  • 主机->服务器新的网络请求 HTTP GET/HTTP/1.1
  • server->host 两个 TCP 段(~5ms delta,与 32bit 相同)
  • 主机->服务器 Tcp Ack(确认两个段)(~10us 增量,与 32 位相同)
  • 服务器->主机 HTTP/1.1 200 OK(~800us delta,与 32 位相同)
  • 前一帧的主机->服务器 TCP 确认 (HTTP/1.1 200 OK) (!!! 96ms)
  • 主机->服务器新的 web 请求 HTTP GET/HTTP/1.1 (!!! 309ms)

  • 我在 64 位机器上得到的 500 毫秒主要发生在最后两个步骤中。请注意,这绝对与 TCP 堆栈无关(因为在 Firefox 中一切正常)。我们在最后两个步骤中得到不同 TCP Ack 模式的原因(32 位搭载,而 64 位单独的 TCP Ack 帧)是因为新的 Web 请求在 64 位情况下延迟了 309+96 毫秒(因此 TCP 堆栈输出一个单独的Ack帧,它不能等待应用层)。

    所以,它看起来像:
  • 该问题是由完成 Web 请求和发出新请求之间的时间差引起的。
  • 问题与.NET Framework有关吗? (绝对与 TCP 无关)。
  • 问题发生在从 MSDN 中提取的 Microsoft 代码上(MS 不会错吧?)。

  • 有什么线索吗?

    最佳答案

    仅适用于遇到此线程并遇到问题的其他任何人。

    在 64 位系统上延迟的原因是 WebClient 等待 Windows 返回代理值。

    像这样编写代码来解决这个问题。

    WebClient wc = New WebClient;
    wc.Proxy = null;

    这将消除一些用户看到的延迟(包括我自己:))

    很高兴我终于可以回馈对我有很大帮助的社区:)

    关于.net - 64 位 Windows 上的 HttpWebRequest GetResponse 延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1698031/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com