如何在 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=31bf3856ad364e35
、namespace System.Net.Http
、public 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 401 在 ajax 帖子上总是成功
如何在 JavaScript 中检索 HttpResponseMessage 文件名
如何从 HttpResponseMessage 中获取特定的标头值