我尝试添加新标题:
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
。
我尝试过反射,但没有任何工作。
还有其他类似的问题,但没有解决方案。
答案 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
部分好吧,看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");
}
所以你有两个选择: