如何在HttpReponseMessage上设置响应cookie?

Tom*_*son 18 asp.net-web-api dotnet-httpclient

我想在web api中创建一个演示登录服务,需要在响应上设置一个cookie.我怎么做?或者有更好的授权方式吗?

And*_*ott 24

添加引用System.Net.Http.Formatting.dll并使用类中AddCookies定义的扩展方法HttpResponseHeadersExtensions.

这是一篇描述这种方法的博客文章,以及MSDN主题.

如果那个程序集不适合你,那么这是我之前的答案:

旧答案如下

我更喜欢一种方法,它HttpResponseMessage不会渗透到HttpContext中,而HttpContext不是单元可测试的,并且根据主机不一定适用:

/// <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());
}
Run Code Online (Sandbox Code Playgroud)

然后你可以在响应中包含一个cookie,如下所示:

HttpResponseMessage response;
response.Headers.SetCookie(new Cookie("name", "value"));
Run Code Online (Sandbox Code Playgroud)


Mau*_*ice 8

您可以将cookie添加到HttpContext.Current.Response.Cookies集合中.

    var cookie = new HttpCookie("MyCookie", DateTime.Now.ToLongTimeString());
    HttpContext.Current.Response.Cookies.Add(cookie);
Run Code Online (Sandbox Code Playgroud)

  • 这个答案违背了WebAPI的使用方式.您不应该从WebAPI引用HttpContext.Current,因为如果您自己托管,这将不存在.beta位缺少像这样的辅助工具.RC为HttpResponseMessage.Headers添加了一个AddCookies()扩展方法,您应该使用它. (24认同)