【问题标题】:HttpWebRequest, Keep-Alive as Fiddler does?HttpWebRequest,像 Fiddler 一样保持活动状态?
【发布时间】:2013-11-22 18:39:55
【问题描述】:

使用 HttpWebRequest,我正在尝试以循环模式(两个 IIS 7.5 服务器)查询负载平衡设置背后的安全(协商)url。看起来很简单,但我有一些问题。

第一个匿名请求在一个服务器上进行,协商部分在另一个服务器上进行。问题是这两个请求之间大约需要六秒钟,所以时间太长了。在尝试诊断延迟时,我意识到,通过 Fiddler 的代理,所有请求都在同一台服务器上进行,因此总共花费了不到一秒的时间。如果我禁用 Fiddler 选项“重用服务器连接”,那么我的请求与没有 Fiddler 的行为相同,并且需要很长时间。

谷歌搜索,我最终找到了这个链接:http://fiddler2.com/blog/blog/2013/02/28/help!-running-fiddler-fixes-my-app-

我知道 Fiddler 正在使用套接字和它自己的连接池,但是有没有办法使用 .NET HttpWebRequest 重现相同的行为,以便我的请求(匿名和协商)将重用连接并最终在同一台服务器上?

这是一个快速测试,在没有 Fiddler 的情况下大约需要 70 秒才能完成,而通过 Fiddler 大约需要 2 秒...

另外,请注意,这不是代理检测延迟,并且在 nlb 上禁用了粘性会话。

    public void Main(string[] args)
    {
        int i = 0;

        while (i < 10)
        {
            HttpWebRequest wr = (HttpWebRequest)WebRequest.Create("http://nlb/service.asmx");
            HttpWebResponse response;

            wr.KeepAlive = true;
            wr.UseDefaultCredentials = true;
            response = (HttpWebResponse)wr.GetResponse();

            using (StreamReader sr = new StreamReader(response.GetResponseStream()))
            {
                Console.WriteLine(sr.ReadToEnd());
            }

            response.Close();

            i++;
        }
    }

这是另一个证明 Fiddler 非常棒的证据!

感谢您的建议。

【问题讨论】:

  • 这里只是在黑暗中拍摄 - 您是否尝试使用新的 HttpClient API 代替?另外,这个问题可能会有所帮助:stackoverflow.com/questions/17894739/…
  • @sinelaw 不幸的是,我不能在我的开发环境中使用 4.5,但我希望我可以使用 HttpWebRequest 完成相同的行为,因为 .Net 在涉及 http 时似乎总是使用 WebRequest(不管使用什么包装器)。
  • 您不需要 .Net 4.5 - 您可以使用 httpclient nuget package
  • @sinelaw 不幸的是,我使用 HttpClient 获得了相同的结果。感谢您的建议。
  • 如果您可以将 Fiddler 的 SAZ 文件通过电子邮件发送给我(使用帮助 > 发送反馈),我将很乐意查看。您还可以考虑在您的 app.exe.config 文件中启用 System.NET 日志记录;日志应该显示连接未按预期重用的原因。

标签: c# asp.net .net vb.net fiddler


【解决方案1】:

这里只是一个镜头,也许看起来太容易了 -

但您的代码的最后一行是Response.Close()。 .NET 4.5 之前的文档除了“关闭现有的套接字连接”之外并没有太多说明。

然而,在 .NET 4.5 中,这是文档:

此方法突然终止与客户端的连接 方式,不适用于正常的 HTTP 请求处理。

http://msdn.microsoft.com/en-us/library/system.web.httpresponse.close(v=vs.110).aspx

我承认我不知道 .NET 4.5 和 HttpResponse 的早期版本之间的一些细微差别;但是,我确实认为从逻辑上讲,Connection.Close() 与 Keep-Alive 不兼容;您可能会看到 Fiddler 的行为进行干预(可能是一个错误)以修补此问题。只是一个理论-需要测试。

【讨论】:

  • 不错的理论,但我认为关闭不是问题所在。这是请求开始的时间 - OP 在协商时说,这是在开始时交换凭据的时间。
  • 好点。我想知道 Fiddler 是否比 HttpClient 更聪明地处理身份验证?
猜你喜欢
  • 1970-01-01
  • 2012-03-09
  • 1970-01-01
  • 2012-04-14
  • 2011-11-22
  • 2011-04-05
  • 2012-05-20
  • 1970-01-01
相关资源
最近更新 更多