我今天遇到了这个问题,但我创建了这个 hack:
/// <summary>
/// We aren't kids microsoft, we shouldn't need this
/// </summary>
public static void UnlockHeaders()
{
var tHashtable = typeof(WebHeaderCollection).Assembly.GetType("System.Net.HeaderInfoTable")
.GetFields(BindingFlags.NonPublic | BindingFlags.Static)
.Where(x => x.FieldType.Name == "Hashtable").Single();
var Table = (Hashtable)tHashtable.GetValue(null);
foreach (var Key in Table.Keys.Cast<string>().ToArray())
{
var HeaderInfo = Table[Key];
HeaderInfo.GetType().GetField("IsRequestRestricted", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(HeaderInfo, false);
HeaderInfo.GetType().GetField("IsResponseRestricted", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(HeaderInfo, false);
Table[Key] = HeaderInfo;
}
tHashtable.SetValue(null, Table);
}
那么你只需要UnlockHeaders
在程序启动时调用该函数一次,调用HttpWebRequest类中的Header Collection之后,就会接受任何需要手动添加的header。
然后在向请求添加任何标头之前,请执行以下操作:
myHttpWebRequest.Headers["Host"] = "www.example.com";
在第一个标头之后将是主机,因为看起来在某些 .net 版本中标头字段具有更高的优先级。