如何在 HttpResponseMessage 上设置响应 cookie?

Posted

技术标签:

【中文标题】如何在 HttpResponseMessage 上设置响应 cookie?【英文标题】:How do I set a response cookie on HttpReponseMessage? 【发布时间】:2012-03-20 19:29:42 【问题描述】:

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

【问题讨论】:

看起来您不能在 HttpResponseMessage 上设置 cookie。看看这个帖子,也许它会帮助***.com/questions/5463431/… 【参考方案1】:

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

这里是a blog post describing this approach,还有MSDN topic。

如果该程序集不适合您,这是我在此之前的旧答案:

下面是旧答案

我更喜欢一种保持在 HttpResponseMessage 范围内而不渗入 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());

然后你可以像这样在响应中包含一个 cookie:

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

【讨论】:

我同意,这看起来是一个更好的选择。更改了接受的答案以在将来指导用户。 这可能不再是答案吗?我找到这个 dll 的唯一方法是通过 Nuget,它明确指出它适用于高于 2.0 且低于 2.1 的 WebApi.Client,所以这个答案适用于 WebApi 2。我们现在使用的是 ASP.NET 4,而我找不到这个dll了。 @IsaacLlopis 我猜他们把它从扩展 dll 移到了核心。 @CsabaToth 它似乎对我不可用。它在哪个 DLL 中? @crush 我使用的是 .NET 4.5.2,它位于 Assembly System.Net.Http.Formatting, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35namespace System.Net.Httppublic static class HttpResponseHeadersExtensions【参考方案2】:

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

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

【讨论】:

谢谢你,这正是我想要并且应该想到的。但实际上预计会在HttpResponseMessage 上提供。 这也是我的第一个猜测,但由于某种原因它不是。这对于测试能力肯定会更好。 这个答案与应该使用 WebAPI 的方式背道而驰。您不应该从 WebAPI 引用 HttpContext.Current,因为如果您自己托管,这将不存在。测试版缺少像这样的辅助实用程序负载。 RC 向 HttpResponseMessage.Headers 添加了一个 AddCookies() 扩展方法,您应该使用它。 @Andrew 好点,使用 AddCookies() 肯定更好。不过当时它并不存在。 Andrew 是对的:除了违反约定外,在 WebAPI 控制器中使用 HttpContext 设置 cookie 对我不起作用

以上是关于如何在 HttpResponseMessage 上设置响应 cookie?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 HTTPResponseMessage 下载文件

使用 HttpResponseMessage 401 在 ajax 帖子上总是成功

如何在 JavaScript 中检索 HttpResponseMessage 文件名

如何从 HttpResponseMessage 中获取特定的标头值

始终使用HttpResponseMessage 401在ajax帖子上取得成功

如何从HttpResponseMessage获取特定的标头值