微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何绕过受限的HTTPWebRequest标头

如何解决如何绕过受限的HTTPWebRequest标头

我已经做了一些辅助功能来处理我的HTTP请求,该请求只需要一个字符串URL和一个标头格式为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数组包含受限制的标头(例如,User-Agent,Content-Type或Accept等),我会收到一个异常,告诉我使用其属性方法修改标头,所以我在想也许有一种方法可以检查是否有任何标头受到限制,并使用其属性自动对其进行修改,但不幸的是,我不太聪明,所以我真的不知道如何在没有大量肿代码的情况下进行检查单个受限标头,并且每个标头运行不同的代码 我想可以通过反射来完成,但是我不确定...帮助吗?

解决方法

有静态方法可以检查标头是否受限制:

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();
}

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。