web-dev-qa-db-fra.com

HttpClient ne stocke pas les cookies dans CookieContainer

J'utilise VS2010 + .NET 4.0 + System.Net.Http (de Nuget).

Pour une raison que je n'arrive pas à comprendre, le cookie de session que je reçois dans ma HttpResponseMessage n'est pas automatiquement enregistré dans le HttpClient CookieContainer. Voici à quoi ressemble mon code:

CookieContainer cookies = new CookieContainer();
HttpClientHandler handler = new HttpClientHandler();
handler.CookieContainer = cookies;
HttpClient client = new HttpClient(handler);

Uri site = new Uri("https://www.mywebsite.com");
var response1 = client.SendAsync(new HttpRequestMessage(HttpMethod.Get,site)).Result;

Je peux voir dans les en-têtes de réponse que j'ai les éléments suivants:

Set-Cookie: JSESSIONID=FC8110E434C2C6DAB78B4E335024A639; Path=/member; Secure

Cependant, mon contenant de biscuits reste vide ... pourquoi?

19
user2038596

Je suppose que le problème est que vos cookies sont secure. Le problème est que CookieContainer n'enverra pas de cookies sécurisés au serveur lors de requêtes HTTP ultérieures. C'est peut-être un bug, ou peut-être qu'il a des raisons derrière cela.

Une solution de contournement consiste à rajouter le cookie à CookieContainer manuellement. De cette façon, le cookie serait renvoyé dans l'en-tête de la requête HTTP, car aucun secure ne serait défini lors de l'envoi de cookies au serveur.

Voir cet article pour plus d'informations.

8
Saeed Neamati

Utilisez cette partie de code pour extraire les cookies de la réponse:

/// <summary>
/// Read web cookies
/// </summary>
public static CookieContainer ReadCookies(this HttpResponseMessage response)
{
    var pageUri = response.RequestMessage.RequestUri;

    var cookieContainer = new CookieContainer();
    IEnumerable<string> cookies;
    if (response.Headers.TryGetValues("set-cookie", out cookies))
    {
        foreach (var c in cookies)
        {
            cookieContainer.SetCookies(pageUri, c);
        }
    }

    return cookieContainer;
}
14
Salar

Le problème est peut-être que le chemin de votre URL de requête est à la racine du site Web ("/"), mais votre entête Set-Cookie indique un chemin de "/ membre".

0
ssabey