如何绕过受限的 HTTPWebRequest Headers

How can I Bypass restricted HTTPWebRequest Headers

我做了一个小辅助函数来处理我的 HTTP 请求,它只接受一个字符串 URL 和一个 header 的字符串数组,格式为 Header-Name: Value

public static HttpWebResponse MakeHttpRequest(string URL, string[] Headers)
{
    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(URL);
    req.Headers.Clear();
    foreach (string h in Headers)
    {
        var s = h.Split(new char[] { ':' }, 2);
        req.Headers.Set(s[0], s[1]);
    }
    return (HttpWebResponse)req.GetResponse();
}

但是如果 Headers 数组包含受限的 header(例如 User-Agent、或 Content-Type、或 Accept 等),我得到一个异常告诉我使用其 属性 或方法修改 header,所以我在想也许有某种方法可以检查是否有任何 Headers 受到限制并使用其 [=25= 自动修改它], 不幸的是,我不太聪明,所以我真的不知道如何做到这一点,而不需要大量臃肿的代码来检查每个受限 header 并且每个代码都有不同的代码 运行 我猜它可以通过反射来完成,但我不确定...帮助?

有静态方法可以检查 header 是否受到限制:

bool restricted = System.Net.WebHeaderCollection.IsRestricted(key); // key = s[0]

你可以像这样使用反射来设置相关的属性:

public static HttpWebResponse MakeHttpRequest(string URL, string[] Headers) {
    HttpWebRequest req = (HttpWebRequest) WebRequest.Create(URL);
    req.Headers.Clear();
    foreach (string h in Headers) {
        var s = h.Split(new char[] {':'}, 2);
        var key = s[0];
        var value = s[1];
        if (WebHeaderCollection.IsRestricted(key)) {
            // remove "-" because some header names contain it, but .NET properties do not
            key = key.Replace("-", "");
            // get property with header name
            var prop = typeof(HttpWebRequest).GetProperty(key, BindingFlags.Instance | BindingFlags.Public);
            // set, changing type if necessary (some properties are long, or date, and your values are always strings)
            prop.SetValue(req, Convert.ChangeType(value, prop.PropertyType, CultureInfo.InvariantCulture));
        }
        else {
            req.Headers.Set(s[0], s[1]);
        }

    }

    return (HttpWebResponse) req.GetResponse();
}

如果要使用此代码,请确保针对所有受限 header(列出的 here)测试此代码,因为我没有。或者单独处理每个 header,因为只有 11 个,而不是一百个。