2011-09-11 66 views
3

我想以編程方式爲資源構建一個HttpWebRequest,而不僅僅是獲取HttpWebResponse,還要確定成功返回響應的HTTP請求總數。確定HttpWebRequest發出的總請求,包括重定向

例如,如果我提出一個請求http://americanexpress.com我要去最終響應之前,重定向3次:

American Express redirects

在這個例子中,總共有4個請求被髮。默認情況下,HttpWebRequest將AllowAutoRedirect設置爲true,因此任何導致重定向的響應(例如HTTP 301)都會自動發出另一個請求。這很好,我只想知道發出了多少個請求。

有什麼辦法可以做到這一點嗎?設置AllowAutoRedirect爲false並通過重建請求手動響應重定向?

+0

http://stackoverflow.com/questions/3404493/httpwebrequest-httpwebresponse-redirect-count(可能是手動是唯一的方式)的可能重複。 – Aaron

回答

5

您可以通過將AllowAutoRedirect設置爲false並響應HTTP重定向狀態碼來實現此目的。有關HTTP狀態代碼的完整列表,請參閱W3C。這裏是一個小的代碼示例(錯誤處理細節省略):

HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("http://americanexpress.com"); 
webRequest.AllowAutoRedirect = false; 
HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse(); 

int redirCount = 0; 
while (webResponse.StatusCode == HttpStatusCode.TemporaryRedirect || 
     webResponse.StatusCode == HttpStatusCode.MovedPermanently ||    
     webResponse.StatusCode == HttpStatusCode.MultipleChoices || 
     webResponse.StatusCode == HttpStatusCode.Found || 
     webResponse.StatusCode == HttpStatusCode.SeeOther) 
{ 
    string location = webResponse.Headers["Location"]; 

    redirCount++; 
    Console.Out.WriteLine("Redirection location: {0}", location); 

    webRequest = (HttpWebRequest)WebRequest.Create(location); 
    webRequest.AllowAutoRedirect = false; 

    webResponse = (HttpWebResponse)webRequest.GetResponse(); 
} 

編輯: 我才意識到,有一個叫上 HttpWebRequest類MaximumAutomaticRedirections屬性。因此,HttpWebRequest類必須計算重定向次數 以處理允許的最大重定向。我已經調試到HttpWebRequest類的 源代碼中,並找到一個名爲_AutoRedirections 的專用字段,用於統計重定向的次數。

因此,要獲得一個更簡單的解決辦法是重定向的數量:

public class HttpWebRequestAdapter 
{ 
    private readonly HttpWebRequest _request; 
    public HttpWebRequestAdapter(HttpWebRequest request) 
    { 
    _request = request; 
    } 

    public int NumberOfRedirects 
    { 
    get 
    { 
     FieldInfo fi = _request.GetType().GetField("_AutoRedirects", BindingFlags.NonPublic | BindingFlags.Instance); 

     return (int)fi.GetValue(_request); 
    } 
    } 
} 

HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("http://americanexpress.com"); 

    webRequest.AllowAutoRedirect = true; 
    webRequest.MaximumAutomaticRedirections = 10; 

    HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse(); 


    HttpWebRequestAdapter adapter = new HttpWebRequestAdapter(webRequest); 

    Console.Out.WriteLine(adapter.NumberOfRedirects); 

編輯完

希望,這會有所幫助。

+0

感謝您的迴應,這就是我所說的「通過重建請求手動響應重定向」。它的外觀沒有簡單的方法。 –

+0

@Troy Hunt我用更簡單的解決方案更新了我的答案。 – Hans