155

以前は HttpWebRequest および HttpWebResponse セッションで CookieContainer を使用していましたが、今は WebClient で使用したいと考えています。私の知る限り、HttpWebRequests ( request.CookieContainer) のような組み込みメソッドはありません。CookieContainer で WebClient から Cookie を収集するにはどうすればよいですか?

これをグーグルで検索したところ、次のサンプルが見つかりました。

public class CookieAwareWebClient : WebClient
{
    private readonly CookieContainer m_container = new CookieContainer();

    protected override WebRequest GetWebRequest(Uri address)
    {
        WebRequest request = base.GetWebRequest(address);
        HttpWebRequest webRequest = request as HttpWebRequest;
        if (webRequest != null)
        {
            webRequest.CookieContainer = m_container;
        }
        return request;
    }
}

これが最善の方法ですか?

4

5 に答える 5

129
 WebClient wb = new WebClient();
 wb.Headers.Add(HttpRequestHeader.Cookie, "somecookie");

コメントから

「somecookie」の代わりに、Cookie の名前と値をどのようにフォーマットしますか?

wb.Headers.Add(HttpRequestHeader.Cookie, "cookiename=cookievalue"); 

複数の Cookie の場合:

wb.Headers.Add(HttpRequestHeader.Cookie, 
              "cookiename1=cookievalue1;" +
              "cookiename2=cookievalue2");
于 2011-10-22T18:30:34.070 に答える
69

はい。私見、GetWebRequest() をオーバーライドすることは、WebClient の制限された機能に対する最良の解決策です。このオプションについて知る前に、私は HttpWebRequest レイヤーで非常に面倒なコードをたくさん書いていました。WebClient は必要なことをほとんど (完全ではない) 実行していたからです。導出ははるかに簡単です。

もう 1 つのオプションは、通常の WebClient クラスを使用することですが、リクエストを行う前に Cookie ヘッダーを手動で設定し、応答で Set-Cookies ヘッダーを引き出すことです。CookieContainer クラスには、これらのヘッダーの作成と解析を容易にするヘルパー メソッドがありCookieContainer.SetCookies()ますCookieContainer.GetCookieHeader()

呼び出し元にとって簡単で、2 番目のオプションよりもコードの繰り返しが少なくて済むため、私は前者のアプローチを好みます。また、派生アプローチは、複数の拡張シナリオ (Cookie、プロキシなど) に対して同じように機能します。

于 2009-11-22T00:08:33.943 に答える
47

これはあなたが見つけた記事の単なる延長です。


public class WebClientEx : WebClient
{
    public WebClientEx(CookieContainer container)
    {
        this.container = container;
    }

    public CookieContainer CookieContainer
        {
            get { return container; }
            set { container= value; }
        }

    private CookieContainer container = new CookieContainer();

    protected override WebRequest GetWebRequest(Uri address)
    {
        WebRequest r = base.GetWebRequest(address);
        var request = r as HttpWebRequest;
        if (request != null)
        {
            request.CookieContainer = container;
        }
        return r;
    }

    protected override WebResponse GetWebResponse(WebRequest request, IAsyncResult result)
    {
        WebResponse response = base.GetWebResponse(request, result);
        ReadCookies(response);
        return response;
    }

    protected override WebResponse GetWebResponse(WebRequest request)
    {
        WebResponse response = base.GetWebResponse(request);
        ReadCookies(response);
        return response;
    }

    private void ReadCookies(WebResponse r)
    {
        var response = r as HttpWebResponse;
        if (response != null)
        {
            CookieCollection cookies = response.Cookies;
            container.Add(cookies);
        }
    }
}
于 2012-07-17T13:45:14.320 に答える
15

HttpWebRequest は、割り当てられた CookieContainer を変更します。返された Cookie を処理する必要はありません。Cookie コンテナをすべての Web リクエストに割り当てるだけです。

public class CookieAwareWebClient : WebClient
{
    public CookieContainer CookieContainer { get; set; } = new CookieContainer();

    protected override WebRequest GetWebRequest(Uri uri)
    {
        WebRequest request = base.GetWebRequest(uri);
        if (request is HttpWebRequest)
        {
            (request as HttpWebRequest).CookieContainer = CookieContainer;
        }
        return request;
    }
}
于 2016-04-12T22:53:11.067 に答える
6

新しい Web クライアントを作成する必要がない、よりクリーンな方法があると思います (サードパーティのライブラリでも動作します)。

internal static class MyWebRequestCreator
{
    private static IWebRequestCreate myCreator;

    public static IWebRequestCreate MyHttp
    {
        get
        {
            if (myCreator == null)
            {
                myCreator = new MyHttpRequestCreator();
            }
            return myCreator;
        }
    }

    private class MyHttpRequestCreator : IWebRequestCreate
    {
        public WebRequest Create(Uri uri)
        {
            var req = System.Net.WebRequest.CreateHttp(uri);
            req.CookieContainer = new CookieContainer();
            return req;
        }
    }
}

あとは、これを使用するドメインをオプトインするだけです。

    WebRequest.RegisterPrefix("http://example.com/", MyWebRequestCreator.MyHttp);

これは、example.com に送信されるすべての Web リクエストが、標準の Web クライアントを含むカスタム Web リクエスト作成者を使用することを意味します。このアプローチは、すべてのコードに触れる必要がないことを意味します。登録プレフィックスを 1 回呼び出すだけで、それで完了です。「http」プレフィックスを登録して、どこでもすべてをオプトインすることもできます.

于 2015-05-20T18:58:02.853 に答える