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