如何在C#中正确发送KeepAlive头文件?
问题描述:
我需要使用的HttpWebRequest发送这样的请求:如何在C#中正确发送KeepAlive头文件?
POST https://sap.site.com.mx/sap/bw/BEx?SAP-LANGUAGE=ES&PAGENO=1&CMD=PROCESS_VARIABLES&REQUEST_NO=0&CMD=PROCESS_VARIABLES&SUBCMD=VAR_SUBMIT&VARID= HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: es-MX,es;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
但是,我不能发送连接头。这是我的代码:
// request
HttpWebRequest request = CreateWebRequestObject(url);
request.CookieContainer = this.cc;
request.UserAgent = "Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2";
// headers
request.Headers.Add("Accept-Encoding", "gzip, deflate");
request.Headers.Add("Accept-Language", " es-MX,es;q=0.8,en-us;q=0.5,en;q=0.3");
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
request.KeepAlive = true; // it does not work as expected
request.ServicePoint.Expect100Continue = false; // remove Expect header
// post
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = buffer.Length;
using (Stream stream = request.GetRequestStream())
stream.Write(buffer, 0, buffer.Length);
但是,当我检查Fiddler中的请求Connection属性不会出现。
此外,这些职位不适合我的工作:
- Keep a http connection alive in C#?
- C# - Connection: keep-alive Header is Not Being Sent During HttpWebRequest
如何正确地发送连接头?
UPDATE
这个附加保活使用HTTP/1.0
request.ProtocolVersion = HttpVersion.Version10;
//request.KeepAlive = true; // not necessary
当变化ProtocolVersion属性HttpVersion.Version11,保持活动头没有被发送:
request.ProtocolVersion = HttpVersion.Version11;
request.KeepAlive = true;
如何使用Http/1.1发送Keep-Alive头文件?
答
我有非常相似的代码相同的错误,并设置
var sp = req.ServicePoint;
var prop = sp.GetType().GetProperty("HttpBehaviour", BindingFlags.Instance | BindingFlags.NonPublic);
prop.SetValue(sp, (byte)0, null);
DID解决它。你确定每次创建httpwebrequest时都确实执行了这段代码吗?
答
使用HTTP/1.1时,Keep-Alive默认为打开。将KeepAlive设置为false可能会导致向服务器发送Connection:Close标头。
在http1.1中KeepAlive是默认的,不是? – 2012-03-05 18:02:59
如果您使用ServicePointManager.Expect100Continue = false;顺便说一下,有同样的问题。它是一个.net错误吗? – 2012-03-10 17:29:59