2012-03-20 1 views
15

Je voudrais créer un service de connexion démo dans l'API web et j'ai besoin de mettre un cookie sur la réponse. Comment je fais ça? Ou y a-t-il une meilleure façon de faire une autorisation?Comment définir un cookie de réponse sur HttpReponseMessage?

+0

Il ne semble pas que vous pouvez définir un cookie sur HttpResponseMessage. Jetez un oeil à ce fil, peut-être il aidera http://stackoverflow.com/questions/5463431/setting-cookies-within-a-wcf-service –

Répondre

22

Ajouter une référence à System.Net.Http.Formatting.dll et utiliser la méthode d'extension AddCookies définie dans la classe HttpResponseHeadersExtensions.

Voici a blog post describing this approach, et le MSDN topic.

Si cette assemblée n'est pas une option pour vous, voici ma plus réponse d'avant c'était une option:

ancien réponse suit

Je préfère une approche qui reste dans le domaine de HttpResponseMessage sans saignement dans le HttpContext qui est pas testable et ne sont pas toujours applicables en fonction de l'hôte:

/// <summary> 
/// Adds a Set-Cookie HTTP header for the specified cookie. 
/// WARNING: support for cookie properties is currently VERY LIMITED. 
/// </summary> 
internal static void SetCookie(this HttpResponseHeaders headers, Cookie cookie) { 
    Requires.NotNull(headers, "headers"); 
    Requires.NotNull(cookie, "cookie"); 

    var cookieBuilder = new StringBuilder(HttpUtility.UrlEncode(cookie.Name) + "=" + HttpUtility.UrlEncode(cookie.Value)); 
    if (cookie.HttpOnly) { 
     cookieBuilder.Append("; HttpOnly"); 
    } 

    if (cookie.Secure) { 
     cookieBuilder.Append("; Secure"); 
    } 

    headers.Add("Set-Cookie", cookieBuilder.ToString()); 
} 

Ensuite, vous pouvez inclure un cookie dans la réponse comme ceci:

HttpResponseMessage response; 
response.Headers.SetCookie(new Cookie("name", "value")); 
+0

Je suis d'accord, cette ressemble à une meilleure alternative. Changé les réponses acceptées pour guider les utilisateurs dans le futur. –

+0

Est-il possible que ce ne soit plus une réponse? La seule façon que j'ai trouvé cette DLL est à travers Nuget et il indique explicitement que c'est pour WebApi.Client supérieur à 2.0 et inférieur à 2.1, donc cette réponse était pour WebApi 2. Nous sommes maintenant avec ASP.NET 4 et je ne trouve plus cette DLL. –

+0

@IsaacLlopis Je suppose qu'ils l'ont déplacé de l'extension dll au noyau. –

6

Vous pouvez ajouter le cookie à la collection HttpContext.Current.Response.Cookies.

var cookie = new HttpCookie("MyCookie", DateTime.Now.ToLongTimeString()); 
    HttpContext.Current.Response.Cookies.Add(cookie); 
+0

Merci, exactement ce que je voulais et aurait dû penser à moi-même. Mais attendu que cela soit disponible sur le 'HttpResponseMessage'. –

+0

C'était aussi ma première estimation, mais pour une raison quelconque, ce n'est pas le cas. Cela aurait certainement été mieux pour la capacité de test. – Maurice

+21

Cette réponse va à l'encontre de la façon dont WebAPI devrait être utilisé. Vous ne devriez pas référencer HttpContext.Current à partir de WebAPI car cela n'existe pas si vous êtes un hôte indépendant. Les bits bêta manquaient de charges d'utilitaires auxiliaires comme celui-ci. Le RC a ajouté une méthode d'extension AddCookies() à HttpResponseMessage.Headers que vous devriez utiliser à la place. – Andrew

Questions connexes