建立 httpheader 连接:Keep-Alive 到 lower-case "keep-alive"

Make httpheader Connection: Keep-Alive into lower-case "keep-alive"

我试过它添加新的header:

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

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

我尝试使用反射进行试验,但没有任何效果。

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

只需执行以下操作:

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

不需要通过反射设置这些 header。 首先,删除旧条目很重要,因为如果键已经存在,调用 Add 会添加另一个值(您看到的结果是用逗号分隔的值)。

最好使用 HttpRequestHeader 枚举而不是 header 名称作为字符串:

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

编辑:

我的错。在 request-object 上有一个明确的 Connection 属性,在这种情况下必须使用它:

request.Connection = "keep-alive";

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

编辑2:

嗯,看看 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. 坚持 upper-case 值(我更喜欢),因为无论如何你没有 真正的 理由 lower-case ("So I want to have headers exactly as my for example firefox browser.")。正如 Darin Dimitrov 已经说过的,headers 无论如何都不应该是 case-sensitive。
  2. 以这种方式扩展您的 reflection-approach,您首先删除 header,然后在 lower-case 中重新设置它。