2012-03-10 26 views
2

我正在写一个bot,它应该尽可能地模仿firefox。 通过检查,它被发送头,我发现一个微小的差别,我不知道如何摆脱掉:如何通过HttpWebRequest发送小写Keep-Alive头文件

Firefox使用下面的保活头:

Connection: keep-alive 

而C#总是发出:

Connection: Keep-Alive 

我知道,它可能并不重要,但我仍然希望知道是否有什么办法/破解修改该头全部小写。

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

回答

3

在.NET 4.0中工作的:

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

只要确保你实际上并没有设置KeepAlive属性上的要求

+0

谢谢,刚刚救了我一天:) – MeeKaaH 2016-01-19 10:51:12

0

我还需要使用C#来执行此操作,并尝试使用HttpWebRequest。我希望调用的非.NET SOAP Web服务预期使用小写的连接:保持活动

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

我到目前为止的调查:

当使用HTTP协议1.1版,标题甚至没有发送,即使您指定的属性。

例如

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

对此的解决方案是使用的System.Reflection修改,这将意味着保持活动发送的httpBehaviour。这将在每个请求上发送一个初始的大写K和一个'保持活着'。

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响应=(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也将删除我们在使用反射砍死头。

所以这仍然让我卡住了。

除了进入套接字级别之外,还有其他解决方案吗? 有没有其他的类或第三方库允许我修改标题,如我所愿?

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

+0

我终于放弃了。这在c#中根本无法实现。我跟我试图连接的服务的开发者交谈,猜猜看 - 他们修复了BUG在他们身边 – 2012-09-18 15:27:07

1

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

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

Connection: Keep-Alive是HttpWebRequest的默认标头。我认为你应该写一个像IE这样的机器人是使用HttpWebRequest的最佳选择。

+0

谢谢!我通过简单地将useragent更改为Internet Explorer解决了一些有问题的服务器的问题。 – imlokesh 2017-04-28 09:18:53