使httpheader连接:Keep-Alive为小写" keep-alive"

时间:2015-01-31 10:46:59

标签: c# httprequest

我尝试添加新标题:

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

实际上它会将keep-alive标头添加到Connection中,但它不会替换旧标头。所以我得到Connection: Keep-Alive,keep-alive

我尝试过反射,但没有任何工作。

还有其他类似的问题,但没有解决方案。

1 个答案:

答案 0 :(得分:3)

请执行以下操作:

request.Headers.Remove("Connection");
request.Headers.Add("Connection", "keep-alive");

通过反射设置这些标头不是必需的。 首先,如果密钥已经存在(使用逗号分隔值看到的结果),则调用Add时添加另一个值,删除旧条目非常重要。

使用HttpRequestHeader Enumeration而不是标题名称作为字符串更好:

request.Headers.Remove(HttpRequestHeader.Connection);
request.Headers.Add(HttpRequestHeader.Connection, "keep-alive");

编辑:

我的坏。请求对象上有一个显式的Connection属性,在这种情况下必须使用该属性:

request.Connection = "keep-alive";

仅供参考:还有一些标题必须通过其显式属性进行设置。有关列表,请参阅此页面备注https://msdn.microsoft.com/en-us/library/System.Net.HttpWebRequest%28v=vs.110%29.aspx

部分

EDIT2:

好吧,看the connection property's source code,您可以看到它限制了这些值的设置:

bool fKeepAlive = text.IndexOf("keep-alive") != -1;
bool fClose = text.IndexOf("close") != -1;
if (fKeepAlive || fClose)
{
    throw new ArgumentException(SR.GetString("net_connarg"), "value");
}

所以你有两个选择:

  1. 坚持使用大写值(我更喜欢),因为你没有真正的原因,因为它是小写的(“所以我想让标题完全像我的例如firefox浏览器。“)。正如Darin Dimitrov所说,标题不应该区分大小写。
  2. 以这种方式扩展您的反射方法,首先删除标题,然后再次以小写形式设置它。