2011-09-11 9 views
3

HttpWebResponseを取得するだけでなく、リソースに対してHttpWebRequestをプログラムによって構築するだけでなく、レスポンスを正常に返すために行われたHTTP要求の総数を決定したいと考えています。私は私が最終的な応答の前に3回リダイレクトされますするつもりですhttp://americanexpress.comを要求作る場合リダイレクトを含むHttpWebRequestによる合計要求の決定

たとえば、この例では

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

EDIT: 私はちょうど の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); 

のEND EDIT

希望、このことができます。

+0

ご回答いただきありがとうございます。これは、「リクエストを再構成して手動でリダイレクトに応答する」という点で言及したものです。それの見た目で簡単な方法はありません。 –

+0

@Troy Hunt簡単な解決策で私の答えを更新しました。 – Hans

関連する問題