簡體   English   中英

如何繞過受限的 HTTPWebRequest 標頭

[英]How can I Bypass restricted HTTPWebRequest Headers

我做了一個小輔助函數來處理我的 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();
}

如果您打算使用它,請確保針對所有受限制的標頭( 此處列出)測試此代碼,因為我沒有。 或者單獨處理每個標題,因為它們只有 11 個,而不是一百個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM