7

我正在尝试从我的应用程序发送与从浏览器发送相同的信息。以下是 Fiddler 捕获的部分数据:

POST http://something/ HTTP/1.1
Host: something.com
Connection: keep-alive

我被这个连接属性卡住了。如果我将属性 keep-alive 设置为 true,在 Fiddler 中我会看到:

代理连接:保持活动

如果我尝试将连接属性设置为 Keep-alive,则会收到以下错误:

不能使用此属性设置 Keep-Alive 和 Close。

如何编写代码以便在 Fiddler 中我可以看到:

连接:保持活动

我的完整代码:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://myUrl ");
request.Method = "POST";
request.ProtocolVersion = HttpVersion.Version11;
request.Accept = "*/*";
WebHeaderCollection headers = new WebHeaderCollection();
headers.Add("Accept-Encoding", "myEncoding");
headers.Add("Accept-Language", "myLang");
request.Headers = headers;
request.ContentType = "myContentType";
request.Referer = "myReferer";
request.UserAgent = "myUserAgent";
ASCIIEncoding encoding = new ASCIIEncoding();
string postData = "myData";
byte[] data = encoding.GetBytes(postData);
request.GetResponse().Close();
4

1 回答 1

15

要让您的应用程序发送Connection: Keep-Alive标头,请使用对象的KeepAlive属性HttpWebRequest

当客户端知道它在代理(如 Fiddler)后面时,它可能会发送Proxy-Connection: Keep-Alive标头而不是Connection: Keep-Alive标头。期望 HTTP/1.1 代理(如 Fiddler)会将该标头从 转换为Proxy-ConnectionConnection然后再将其传递给上游服务器。

这种“代理重命名标头”模式是多年前引入的,试图解决 HTTP/1.0 服务器中未Keep-Alive正确支持的挂起问题;这个想法是,Proxy-Connection如果过时的代理没有通过删除Proxy-前缀重命名标头,服务器将忽略标头。

于 2013-08-26T19:16:02.500 回答