C# 建立httpheader连接:保持活动到小写“;“保持活力”;
我尝试添加新标题的内容:C# 建立httpheader连接:保持活动到小写“;“保持活力”;,c#,httprequest,C#,Httprequest,我尝试添加新标题的内容: request.Headers.GetType().InvokeMember("ChangeInternal", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.InvokeMethod, Type.DefaultBinder, request.Headers, new object[] { "Connection", "keep-alive" } ); 实际上,它将keep-
request.Headers.GetType().InvokeMember("ChangeInternal",
BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.InvokeMethod,
Type.DefaultBinder, request.Headers, new object[] { "Connection", "keep-alive" }
);
实际上,它将keep-alive
头添加到连接中,但并不替换旧的头。所以我得到了连接:保持活动,保持活动
我试着用反射做实验,但没有任何效果
还有其他类似的问题,但没有解决办法。只需执行以下操作:
request.Headers.Remove("Connection");
request.Headers.Add("Connection", "keep-alive");
没有必要通过反射设置这些头。
首先,删除旧条目很重要,因为调用Add
会在键已经存在的情况下添加另一个值(您看到的结果是逗号分隔的值)
最好使用HttpRequestHeader枚举,而不是将头名称作为字符串:
request.Headers.Remove(HttpRequestHeader.Connection);
request.Headers.Add(HttpRequestHeader.Connection, "keep-alive");
编辑:
我的错。请求对象上有一个显式的连接
属性,在这种情况下必须使用该属性:
request.Connection = "keep-alive";
仅供参考:还有一些标题必须通过其显式属性设置。有关列表,请参阅本页备注部分:
编辑2:
好的,看一下,您可以看到它限制了这些值的设置:
bool fKeepAlive = text.IndexOf("keep-alive") != -1;
bool fClose = text.IndexOf("close") != -1;
if (fKeepAlive || fClose)
{
throw new ArgumentException(SR.GetString("net_connarg"), "value");
}
因此,您有两种选择:
为什么要通过反射而不是直接在
请求
对象上调用此函数?为什么需要这样做?根据HTTP规范,头不应该区分大小写。Darin,当使用普通浏览器时,它发送小写的keep-alive,当使用webrequests时,它发送大写的keep-alive。在查看网站日志时,可以很容易地看到这一点。因此,我希望标题与我的示例firefox浏览器完全相同。。。这看起来是将大写字母改为小写字母的好方法,但我得到了异常:System.ArgumentException未由用户代码HResult=-2147024809进行处理Message=必须使用适当的属性或方法修改“Connection”标头。参数名称:name Source=System ParamName=name StackTrace:at System.Net.WebHeaderCollection.ThrowOnRestrictedHeader(String headerName)at System.Net.WebHeaderCollection.Remove(String name)at System.Net.WebHeaderCollection.Remove(HttpRequestHeader header)我不明白。获取错误。Message=不能使用此属性设置保持活动状态和关闭。谢谢你的回复谢谢你的帮助和建议。我可能会尝试更多的实验,因为我现在已经有了一些了解,如果它不起作用,我会继续保持sace的上限值。你需要这样做是有原因的。一些主机最近拒绝了保持活动状态
并非全部小写的请求,因为403是禁止的。一个是相当大的主机。是的,他们违反了规范。这并没有改变这样一个事实,即这是需要这样做的真正原因。