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

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

【问题讨论】:

标签: asp.net-web-api dotnet-httpclient


【解决方案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 对我不起作用
猜你喜欢
  • 2022-01-04
  • 2016-02-04
  • 1970-01-01
  • 2012-03-25
  • 2019-07-16
  • 2021-06-30
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多