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");
}
因此,您有两种选择:

  • 坚持使用大写值(我更喜欢),因为不管怎么说,您没有真正的理由将其改为小写(“因此我希望标题与我的示例firefox浏览器完全相同”)。正如Darin Dimitrov已经指出的,头不应该区分大小写
  • 以这种方式扩展您的反射方法,首先删除标题,然后用小写字母再次设置

  • 为什么要通过反射而不是直接在
    请求
    对象上调用此函数?为什么需要这样做?根据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是禁止的。一个是相当大的主机。是的,他们违反了规范。这并没有改变这样一个事实,即这是需要这样做的真正原因。