web-dev-qa-db-fra.com

Comment définir un cookie dans HttpClient HttpRequestMessage

J'essaie d'utiliser HttpClient de l'API Web pour publier un message sur un ordinateur d'extrémité nécessitant une connexion sous la forme d'un cookie HTTP identifiant un compte (il s'agit uniquement de #ifdef 'édité sur la version de sortie).

Comment ajouter un cookie à la HttpRequestMessage?

212
George Mauer

Voici comment vous pouvez définir une valeur de cookie personnalisée pour la demande:

var baseAddress = new Uri("http://example.com");
var cookieContainer = new CookieContainer();
using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer })
using (var client = new HttpClient(handler) { BaseAddress = baseAddress })
{
    var content = new FormUrlEncodedContent(new[]
    {
        new KeyValuePair<string, string>("foo", "bar"),
        new KeyValuePair<string, string>("baz", "bazinga"),
    });
    cookieContainer.Add(baseAddress, new Cookie("CookieName", "cookie_value"));
    var result = client.PostAsync("/test", content).Result;
    result.EnsureSuccessStatusCode();
}
317
Darin Dimitrov

Le réponse acceptée est la bonne façon de procéder dans la plupart des cas. Cependant, dans certaines situations, vous souhaitez définir l'en-tête de cookie manuellement. Normalement, si vous définissez un en-tête "Cookie", il est ignoré, mais c'est parce que HttpClientHandler utilise par défaut sa propriété CookieContainer pour les cookies. Si vous désactivez cette option, en définissant UseCookies sur false, vous pouvez définir les en-têtes de cookie manuellement. Ils apparaîtront dans la requête, par exemple.

var baseAddress = new Uri("http://example.com");
using (var handler = new HttpClientHandler { UseCookies = false })
using (var client = new HttpClient(handler) { BaseAddress = baseAddress })
{
    var message = new HttpRequestMessage(HttpMethod.Get, "/test");
    message.Headers.Add("Cookie", "cookie1=value1; cookie2=value2");
    var result = await client.SendAsync(message);
    result.EnsureSuccessStatusCode();
}
289
Greg Beech

Après avoir passé des heures sur ce sujet, aucune des réponses ci-dessus ne m’a aidé, j’ai donc trouvé un outil vraiment utile.

Tout d'abord, j'ai utilisé le Fiddler 4 de Telerik pour étudier mes requêtes Web en détail

Deuxièmement, je suis tombé sur ce plugin utile pour Fiddler:

https://github.com/sunilpottumuttu/FiddlerGenerateHttpClientCode

Il va simplement générer le code C # pour vous. Un exemple était:

        var uriBuilder = new UriBuilder("test.php", "test");
        var httpClient = new HttpClient();


        var httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, uriBuilder.ToString());



        httpRequestMessage.Headers.Add("Host", "test.com");
        httpRequestMessage.Headers.Add("Connection", "keep-alive");
     //   httpRequestMessage.Headers.Add("Content-Length", "138");
        httpRequestMessage.Headers.Add("Pragma", "no-cache");
        httpRequestMessage.Headers.Add("Cache-Control", "no-cache");
        httpRequestMessage.Headers.Add("Origin", "test.com");
        httpRequestMessage.Headers.Add("Upgrade-Insecure-Requests", "1");
    //    httpRequestMessage.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
        httpRequestMessage.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36");
        httpRequestMessage.Headers.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");
        httpRequestMessage.Headers.Add("Referer", "http://www.translationdirectory.com/");
        httpRequestMessage.Headers.Add("Accept-Encoding", "gzip, deflate");
        httpRequestMessage.Headers.Add("Accept-Language", "en-GB,en-US;q=0.9,en;q=0.8");
        httpRequestMessage.Headers.Add("Cookie", "__utmc=266643403; __utmz=266643403.1537352460.3.3.utmccn=(referral)|utmcsr=google.co.uk|utmcct=/|utmcmd=referral; __utma=266643403.817561753.1532012719.1537357162.1537361568.5; __utmb=266643403; __atuvc=0%7C34%2C0%7C35%2C0%7C36%2C0%7C37%2C48%7C38; __atuvs=5ba2469fbb02458f002");


        var httpResponseMessage = httpClient.SendAsync(httpRequestMessage).Result;

        var httpContent = httpResponseMessage.Content;
        string result = httpResponseMessage.Content.ReadAsStringAsync().Result;

Notez que je devais commenter deux lignes car ce plugin n’est pas encore tout à fait parfait, mais il a quand même fait son travail.

CLAUSE DE NON-RESPONSABILITÉ: Je ne suis en aucun cas associé ou endossé par l'auteur du plug-in ou par Telerik.

2
Amir No-Family

Pour moi, la solution simple consiste à définir des cookies dans l'objet HttpRequestMessage.

protected async Task<HttpResponseMessage> SendRequest(HttpRequestMessage requestMessage, CancellationToken cancellationToken = default(CancellationToken))
{
    requestMessage.Headers.Add("Cookie", $"<Cookie Name 1>=<Cookie Value 1>;<Cookie Name 2>=<Cookie Value 2>");

    return await _httpClient.SendAsync(requestMessage, cancellationToken).ConfigureAwait(false);
}
0
Waqar UlHaq