web-dev-qa-db-ja.com

WebClientは自動的にリダイレクトしません

Firebugを使用してログインプロセスをログに記録すると、次のようになります。

POST //The normal post request
GET //Automatically made after the login
GET //Automatically made after the login
GET //Automatically made after the login

以下のコードを使用してPOSTリクエストを行うと、ブラウザが実行している自動GETリクエストが行われませんでした。

MYWebClientハンドラー

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

コードの使用

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

アプリケーションの接続を追跡しようとすると、POSTリクエストのみが実行され、残りのGETリクエストは実行されません。[ブラウザで自動的に作成されます]

14
Roman Ratskey

HttpWebRequestがブラウザではないことを考えると、これは驚くべきことではありません。これらのリダイレクトを実行する必要がある場合は、 HttpWebResponse.StatusCode を確認し、 0年代のリダイレクトコード の場合は別のリクエストを行います。 10.3リダイレクト3xxの下のリンクからの注意:

このクラスのステータスコードは、要求を満たすためにユーザーエージェントがさらにアクションを実行する必要があることを示します。必要なアクションは、2番目のリクエストで使用されるメソッドがGETまたはHEADである場合に限り、ユーザーと対話せずにユーザーエージェントによって実行される場合があります。クライアントは、無限のリダイレクトループを検出する必要があります。このようなループは、リダイレクトごとにネットワークトラフィックを生成するためです。

2
McGarnagle

追加してみてください

request.AllowAutoRedirect = true;

真下

var request = base.GetWebRequest(address);

AllowAutoRedirectはデフォルトでtrueであるはずですが、それは私にとっていくつかの同様の問題を解決しました。

11
Dima Nych