【问题标题】:Is there a better way to get a cookie value in ActionFilterAttribute?有没有更好的方法在 ActionFilterAttribute 中获取 cookie 值?
【发布时间】:2017-01-08 12:16:56
【问题描述】:

我有一个 ActionFilterAttribute 需要从请求中获取 cookie 值。以下是相关代码:

List<CookieState> cookies = actionContext.Request.Headers.GetCookies("NameOfTheCookieIWant").FirstOrDefault().Cookies.ToList();

if (cookies == null)
{
    throw new ArgumentNullException("cookie");
}

string value = "";
cookies.ForEach(cookie => {
    if (cookie.Name == "NameOfTheCookieIWant") {
        value = cookie.Value;
    }
});

所以我必须进入标题并获取包含我想要的 cookie 名称的 cookie 标题。但这给了我一个 CookieHeaderValues 的集合,所以我必须取其中的第一个,它本身包含一个 Cookies 属性,它是 CookieStates 的集合。我将这个集合变成一个列表并在其上运行一个 forEach,直到找到名称与我想要的 cookie 名称匹配的 CookieState,然后保存该 CookieState 的值。

对我来说,我需要经历这么多才能获得一个 cookie 值,这似乎很疯狂。肯定有更好、更直接的方法来获取一个我知道的特定 cookie,它的名字和价值?

【问题讨论】:

  • 您的问题是关于 MVC 还是 WebApi 项目?请添加相关标签。不过,这似乎与 WebApi 有关。
  • 我知道我忘记了一个。添加 asp.net-web-api 标签,谢谢。

标签: c# .net cookies asp.net-web-api actionfilterattribute


【解决方案1】:
var cookie = actionContext.RequestContext.HttpContext.Request.Cookies["NameOfTheCookieIWant"];
var value = cookie == null ? "" : cookie.Value

【讨论】:

  • 当我尝试执行此操作时,我得到“'HttpActionExecutedContext' 不包含'RequestContext' 的定义”;也许这是一个在 WebAPI 中不起作用的 MVC 解决方案?
  • 这个答案似乎是针对 MVC 项目的,而问题是关于 WebApi 的。但这不是你的错,作者没有添加任何标签。
  • 空检查可以简化为var value = cookie?.Value ?? "";
【解决方案2】:
cookie = actionContext.Request.Headers.GetCookies("NameOfTheCookieIWant").FirstOrDefault();

if (cookie != null)
{
    string val = cookie["NameOfTheCookieIWant"].Value;
}

【讨论】:

  • 这是一个link,是我和我的朋友们目前正在研究的一个示例 WebApi 项目,该项目仅用于学习目的。它目前处于开发阶段,但我认为您会发现它很有用。
【解决方案3】:

我会说编写一个包装类或实用程序函数来获取 cookie 值,特别是如果你必须一遍又一遍地这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 2014-05-14
    • 2010-11-11
    • 2019-05-24
    • 2012-02-01
    • 1970-01-01
    相关资源
    最近更新 更多