如何通过HttpWebRequest发送小写的Keep-Alive头

我正在写一个机器人,它应该尽可能地模仿firefox。 通过检查它发送的标题,我发现了一个小的区别,我不知道如何摆脱:

Firefox使用以下keep-alive标头:

Connection: keep-alive 

虽然c#总是发出:

 Connection: Keep-Alive 

我知道这可能没关系,但我仍然想知道是否有任何方法/黑客修改该标题是全部小写。

任何想法如何做到这一点?

在.net 4.0中,这有效:

 request.Headers.GetType().InvokeMember( "ChangeInternal", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.InvokeMethod, Type.DefaultBinder, request.Headers, new object[] { "Connection", "keep-alive" } ); 

请确保您实际上没有在请求上设置KeepAlive属性

Connection: keep-alive是Chrome和Firefox浏览器的默认标题。

Connection: Keep-Alive是Internet Explorer的默认标头。 绝对

Connection: Keep-Alive是HttpWebRequest的默认标头。 我认为如果使用HttpWebRequest,你应该编写像IE这样的机器人是最好的选择。

我还需要使用C#执行此操作,并且一直在尝试使用HttpWebRequest。 我想要调用的非.NET SOAP Web服务期望Connection: keep-alive也是小写的。

我宁愿不为此做一下套接字编程的路线,所以如果你对如何解决这个问题有任何建议,如果你这样做会非常有帮助。

我到目前为止的调查:

使用http协议版本1.1时,即使您指定了属性,也不会发送标头。

例如

 var request = (HttpWebRequest)WebRequest.Create(Endpoint); request.KeepAlive = true; 

解决方案是使用System.Reflection修改httpBehaviour,这将意味着发送Keep-Alive。 这将在每个请求上发送初始大写K和A’Keep-Alive’。

 var sp = request.ServicePoint; var prop = sp.GetType().GetProperty("HttpBehaviour", BindingFlags.Instance | BindingFlags.NonPublic); prop.SetValue(sp, (byte)0, null); 

我尝试使用System.Reflection来修改标题。 下面的代码将以小写正确添加标志:

 request.Headers.GetType().InvokeMember("ChangeInternal", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.InvokeMethod, Type.DefaultBinder, request.Headers, new object[] { "Connection", "keep-alive" }); 

但是,在我调用GetResponse的时候

var response =(HttpWebResponse)request.GetResponse()

标题被删除。 查看HttpWebRequest.cs的源代码,这会在将标头发送到线路之前发生。

  // // The method is called right before sending headers to the wire* // The result is updated internal _WriteBuffer // // See ClearRequestForResubmit() for the matching cleanup code path. // internal void SerializeHeaders() { .... .... string connectionString = HttpKnownHeaderNames.Connection; if (UsesProxySemantics || IsTunnelRequest ) { _HttpRequestHeaders.RemoveInternal(HttpKnownHeaderNames.Connection); connectionString = HttpKnownHeaderNames.ProxyConnection; if (!ValidationHelper.IsBlankString(Connection)) { _HttpRequestHeaders.AddInternal(HttpKnownHeaderNames.ProxyConnection, _HttpRequestHeaders[HttpKnownHeaderNames.Connection]); } } else { _HttpRequestHeaders.RemoveInternal(HttpKnownHeaderNames.ProxyConnection); } 

RemoveInternal还会删除我们使用Reflection攻击的标题。

所以这仍然让我陷入困境。

除了进入套接字级别之外还有其他方法吗? 是否有其他类或第三方库允许我按照自己的意愿修改标题?

对不起,这不是答案,但我还不能评论你的问题。