我正在编写一个机器人,它应该尽可能地模拟firefox。 通过检查它发送的标题,我发现了一个小的区别,我不知道如何摆脱:
Firefox使用以下keep-alive标头:
Connection: keep-alive
虽然c#总是发出:
Connection: Keep-Alive
我知道这可能没关系,但我仍然想知道是否有任何方法/黑客修改该标题是全部小写。
任何想法如何做到这一点?
答案 0 :(得分: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属性
答案 1 :(得分:1)
我还需要使用C#执行此操作,并且一直在尝试使用HttpWebRequest。我想要调用的非.NET SOAP Web服务期望Connection: keep-alive 也是小写的。
我宁愿不为此做一下套接字编程的路线,所以如果你对如何解决这个问题有任何建议,如果你这样做会非常有帮助。
到目前为止我的调查:
使用http协议版本1.1时,即使您指定了该属性,也不会发送标头。
e.g。
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攻击的标头。
所以这仍然让我陷入困境。
除了进入套接字级别之外还有其他方法吗? 是否有其他类或第三方库允许我按照自己的意愿修改标题?
对不起,这不是答案,但我还不能评论你的问题。
答案 2 :(得分:1)
Connection: keep-alive
是Chrome和Firefox浏览器的默认标头。
Connection: Keep-Alive
是Internet Explorer的默认标头。绝对
Connection: Keep-Alive
是HttpWebRequest的默认标头。我认为如果使用HttpWebRequest,你应该编写像IE这样的机器人是最佳选择。