145 votes

À l'aide de CookieContainer avec classe WebClient

J'ai déjà utilisé un CookieContainer avec HttpWebRequest et HttpWebResponse sessions, mais maintenant, je veux l'utiliser avec un client web. Comme je le comprends, il n'est pas intégré dans la méthode comme pour HttpWebRequests (request.CookieContainer). Comment puis-je récupérer les cookies à partir d'un client web dans un CookieContainer?

J'ai googlé pour cela et trouvé l'exemple suivant:

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

Est-ce la meilleure façon de le faire?

115voto

Rajeesh Points 431
 WebClient wb = new WebClient();
 wb.Headers.Add(HttpRequestHeader.Cookie, "somecookie");

De Commentaires

Comment avez-vous format le nom et la valeur du cookie à la place de "somecookie" ?

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

Pour plusieurs cookies:

wb.Headers.Add(HttpRequestHeader.Cookie, 
              "cookiename1=cookievalue1",
              "cookiename2=cookievalue2");

69voto

Justin Grant Points 25644

Oui. À mon humble avis, primordial GetWebRequest() est la meilleure solution pour le client web est limitée functionalty. Avant que je savais à propos de cette option, j'ai écrit beaucoup de vraiment douloureux de code à la HttpWebRequest couche parce que WebClient presque, mais pas tout à fait, fait ce dont j'avais besoin. La dérivation est beaucoup plus facile.

Une autre option est d'utiliser le client web de la classe, mais manuellement remplir l'en-tête de Cookie avant de faire la demande, puis tirez les Cookies en-tête de la réponse. Il existe des méthodes d'aide à la CookieContainer classe qui facilitent la création et l'analyse de ces en-têtes de plus facile: CookieContainer.SetCookies() et CookieContainer.GetCookieHeader(), respectivement.

Je préfère la première approche, car il est plus facile pour l'appelant et nécessite moins de code répétitif que la deuxième option. Aussi, la dérivation est une approche qui fonctionne de la même manière pour plusieurs extensibilité des scénarios (par exemple, les cookies, les procurations, etc.).

46voto

Pavel Savara Points 1745

C'est une extension de l'article que vous avez trouvé.


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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X