2012-10-23 18 views
10

をリダイレクトしませんやってWebクライアントは、自動的に

MY Webクライアントハンドラ

using System; 
using System.Net; 

namespace Test 
{ 
    class HttpHandler : WebClient 
    { 
     private CookieContainer _mContainer = new CookieContainer(); 

     protected override WebRequest GetWebRequest(Uri address) 
     { 
      var request = base.GetWebRequest(address); 
      if (request is HttpWebRequest) 
      { 
       (request as HttpWebRequest).CookieContainer = _mContainer; 
      } 
      return request; 
     } 

     protected override WebResponse GetWebResponse(WebRequest request) 
     { 
      var response = base.GetWebResponse(request); 
      if (response is HttpWebResponse) 
       _mContainer.Add((response as HttpWebResponse).Cookies); 
      return response; 
     } 

     public void ClearCookies() 
     { 
      _mContainer = new CookieContainer(); 
     } 
    } 
} 

それが唯一のPOSTリクエストではなくGETリクエストの残りの部分をやっている私のアプリケーションの接続を追跡しようとすると、コード

private static async Task<byte[]> LoginAsync(string username, string password) 
{ 
    var postData = new NameValueCollection(); 
    var uri = new Uri(string.Format("http://{0}/", ServerName)); 

    postData.Add("name", username); 
    postData.Add("password", password); 

    return await HttpHandler.UploadValuesTaskAsync(uri, postData); 
} 

を使用します。 [それはブラウザで自動的に行われました]

+0

同期バージョンでもエラーが発生しますか? AllowAutoRedirectで、私はそれが動作すると思います...恐らくPOSTからのリダイレクトに問題がありますか?まあ、それはそれを助けていません: –

答えて

1

HttpWebRequestはブラウザではないので、驚くべきことではありません。これらのリダイレクトを実行する必要がある場合は、を確認し、redirect code in the 300'sの場合は別のリクエストを行います。 10.3リダイレクト3xxのリンクからの注記:

このクラスのステータスコードは、要求を実行するためにユーザエージェントがさらに処理を行う必要があることを示します。要求されたアクションは、第2の要求で使用されたメソッドがGETまたはHEADの場合に限り、ユーザーとのやりとりなしにユーザーエージェントによって実行されてもよい(MAY)。クライアントは無限リダイレクションループを検出すべきである(SHOULD)。そのようなループはリダイレクションごとにネットワークトラフィックを生成するためである。

+8

HttpWebRequest.AllowAutoRedirectを考えると、私は* *それが動作することを期待したい... –

+1

WebClientのは、私はWebClientのない派生HttpWebResponseの&リクエスト –

+0

@dbasemanを行いますあなたのサンプルコードのどこにもWebClientを参照していません... –

7

var request = base.GetWebRequest(address); 

request.AllowAutoRedirect = true; 

を追加してみてくださいそれもそのautoredirectがデフォルトでONになっている、私のためにいくつかの同様の問題を解決しました。