HttpWebRequest, Keep-Alive和Fiddler一样吗?

4
使用HttpWebRequest,我正在尝试查询一个在轮询模式下的负载均衡设置后面的受保护(协商)URL(两个IIS 7.5服务器)。看起来很简单,但我遇到了一些问题。
第一个匿名请求发送到一个服务器,协商部分发送到另一个服务器。问题在于这两个请求之间需要大约六秒钟的时间,所以太长了。试图诊断延迟,我意识到通过Fiddler代理,所有请求都发送到同一个服务器,所以总共不到一秒钟就完成了。如果我禁用Fiddler的“重用服务器连接”选项,则我的请求与没有Fiddler时的行为相同,并且需要很长时间。
在Google上搜索此问题,我最终找到了这个链接: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非常棒的又一个证明!感谢任何建议。

你不需要 .Net 4.5 - 你可以使用 httpclient nuget package - sinelaw
@sinelaw很不幸,使用HttpClient我得到了同样的结果。感谢你的建议。 - ChG
如果你可以通过Fiddler(使用“帮助”>“发送反馈”)给我发一个SAZ文件,我会很乐意看一下。你也可以考虑在你的app.exe.config文件中启用System.NET日志记录;这些日志应该显示为什么连接没有按预期重复利用。 - EricLaw
你看过这篇文章吗? - shamp00
这似乎很明显,但如果省略Response.Close()行会发生什么? - theMayer
显示剩余3条评论
1个回答

0

这里只是一个简单的尝试,也许看起来太简单了 -

但你代码的最后一行是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 在协商阶段说的,也就是在开始时交换凭据的时候。 - Simon Halsey
好的观点。我在想,也许 Fiddler 对于验证比 HttpClient 更聪明一些? - theMayer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接