C# HttpWebRequest,像Fiddler一样保持活动状态?

C# HttpWebRequest,像Fiddler一样保持活动状态?,c#,asp.net,.net,vb.net,fiddler,C#,Asp.net,.net,Vb.net,Fiddler,使用HttpWebRequest,我试图在循环模式(两台IIS 7.5服务器)下的负载平衡设置后面查询一个安全(协商)url。看起来很简单,但我有一些问题 第一个匿名请求在一台服务器上进行,协商部分在另一台服务器上进行。问题是,这两个请求之间大约需要6秒钟,所以太长了。在尝试诊断延迟时,我意识到,通过Fiddler的代理,所有请求都在同一台服务器上,所以总共不到一秒钟。如果我禁用Fiddler选项“重用服务器连接”,那么我的请求的行为与不使用Fiddler时的行为相同,并且需要花费很长时间 通过

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

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

通过谷歌搜索,我最终找到了以下链接:

我知道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++;
        }
    }
public void Main(字符串[]args)
{
int i=0;
而(i<10)
{
HttpWebRequest wr=(HttpWebRequest)WebRequest.Create(“http://nlb/service.asmx");
HttpWebResponse;
wr.KeepAlive=true;
wr.UseDefaultCredentials=true;
response=(HttpWebResponse)wr.GetResponse();
使用(StreamReader sr=newstreamreader(response.GetResponseStream()))
{
Console.WriteLine(sr.ReadToEnd());
}
response.Close();
i++;
}
}
这是另一个证明小提琴手非常棒的证据


谢谢你的建议。

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

但是代码的最后一行是
Response.Close()
。在.NET4.5之前的文档中,除了“关闭现有的套接字连接”之外,没有对这一点做太多说明

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

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


我承认,我不知道.NET4.5和以前版本的
HttpResponse
之间的一些细微差别;但是,从逻辑上讲,
Connection.Close()
与Keep-Alive不兼容;你可能会看到Fiddler介入(可能是一个bug)来修补这个问题。只是一个理论-需要测试。

这里只是在黑暗中拍摄-您尝试过使用新的HttpClient API吗?另外,这个问题可能会有所帮助:@sinelaw不幸的是,我不能在我的开发环境中使用4.5,但我希望我可以在HttpWebRequest中实现同样的行为,因为.Net在涉及http时似乎总是使用WebRequest(无论使用什么包装器)。您不需要.Net 4.5-您可以使用@sinelaw。不幸的是,我使用HttpClient获得了相同的结果。谢谢你的建议。如果你能从Fiddler发邮件给我一个SAZ文件(使用帮助>发送反馈),我很乐意看一看。您也可以考虑在App.Ex.CONFIG文件中启用St.NET日志记录;日志应该显示为什么连接没有像预期的那样被重用。理论不错,但我认为问题不在最后。这是请求开始的时候——OP说是在协商时,也就是在开始时交换凭证的时候。这一点很好。我想知道Fiddler是否比HttpClient更聪明地处理auth?