asp.net - 从 Controller 构造函数访问 Request.Cookies

标签 asp.net asp.net-mvc cookies

我正在使用 FormsAuthenticationTicket 的 UserData 属性来存储一些特定于用户的信息。我有一个 HelperClass 将这个 UserData 反序列化为一个自定义对象以进行强类型访问。我的 Controller 设置如下

public class SomeController : Controller
{
    private CookieData _cookieData;

    public SomeController()
    {
        _service = new ForderungsStellerService(new ModelStateWrapper(this.ModelState));
        HttpCookie cookie = Request.Cookies[FormsAuthentication.FormsCookieName];
        FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value);
        _cookieData= GetSessionData.FromCookie(ticket);
    }
}

问题似乎是,请求在 Controller 构建时为空。从 ActionMethod 访问 Request.Cookies 时,此代码段有效。

由于 DRY 原因,我希望在构造函数中填充 _cookieData 对象。

有没有人对这个问题有暗示?

此致...

最佳答案

我将创建一个理解 CookieData 以及如何将其从 Request 对象中取出的 ModelBinder。我担心使构造函数满意所需的单元测试创​​建代码。如果您使用 Model Binder 将其作为 Controller 的参数,则可以避免该测试开销。

public class SomeController : Controller
{
  // only need to pass in the data object for unit testing.
  // ModelBinder takes care of DRY
  public ActionResult Index(CookieData cookieData)
  {
  }
}

为什么它在构造函数中不起作用的答案是当时尚未使用 ControllerContext 初始化 Controller。
public HttpContextBase HttpContext {
  get {
    return ControllerContext == null 
      ? null 
      : ControllerContext.HttpContext;
  }
}

如果您 真的 想在构造函数中执行此操作(不要),则使用 HttpContext.Request 而不是包装器。但是这样做会使您的代码无法测试,并且您的对齐方式将下降 3 分。

关于asp.net - 从 Controller 构造函数访问 Request.Cookies,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1005478/

相关文章:

c# - 参数字典包含不可为 null 类型 'did' 的参数 'System.Int32' 的 null 条目

c# - 如何在代码隐藏中处理 json 对象

c# - 在 post 请求 asp.net mvc 中更改模型属性

javascript - jQuery 获取 json 数据但不返回/赋值

javascript - 如何在 jQuery 中读取 JSON 数组

node.js - WS 握手时不传递 Cookie header

php - 为什么我的两个 Laravel 站点的 session 发生冲突?

jquery - Twitter Bootstrap Modal 和 Jquery Cookie 插件

c# - gridview 中的 ASP.NET C# 代码按钮

asp.net - 控制 body 的背景图像位置