我正在写一个bot,它应该尽可能地模仿firefox。 通过检查,它被发送头,我发现一个微小的差别,我不知道如何摆脱掉:如何通过HttpWebRequest发送小写Keep-Alive头文件
Firefox使用下面的保活头:
Connection: keep-alive
而C#总是发出:
Connection: Keep-Alive
我知道,它可能并不重要,但我仍然希望知道是否有什么办法/破解修改该头全部小写。
任何想法如何做到这一点?
我正在写一个bot,它应该尽可能地模仿firefox。 通过检查,它被发送头,我发现一个微小的差别,我不知道如何摆脱掉:如何通过HttpWebRequest发送小写Keep-Alive头文件
Firefox使用下面的保活头:
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属性上的要求
我还需要使用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也将删除我们在使用反射砍死头。
所以这仍然让我卡住了。
除了进入套接字级别之外,还有其他解决方案吗? 有没有其他的类或第三方库允许我修改标题,如我所愿?
对不起,这不是一个答案,但我还不能评论你的问题。
我终于放弃了。这在c#中根本无法实现。我跟我试图连接的服务的开发者交谈,猜猜看 - 他们修复了BUG在他们身边 – 2012-09-18 15:27:07
Connection: keep-alive
是Chrome和Firefox浏览器的默认标题。
Connection: Keep-Alive
是Internet Explorer的默认标题。绝对是
Connection: Keep-Alive
是HttpWebRequest的默认标头。我认为你应该写一个像IE这样的机器人是使用HttpWebRequest的最佳选择。
谢谢!我通过简单地将useragent更改为Internet Explorer解决了一些有问题的服务器的问题。 – imlokesh 2017-04-28 09:18:53
谢谢,刚刚救了我一天:) – MeeKaaH 2016-01-19 10:51:12