15

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リクエストは実行されません。[ブラウザで自動的に作成されます]

4

2 に答える 2

12

追加してみてください

request.AllowAutoRedirect = true;

真下

var request = base.GetWebRequest(address);

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

于 2012-10-24T13:11:06.607 に答える
1

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

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

于 2012-10-23T20:57:12.707 に答える