为什么 Request.Cookie 为空

本文关键字:为空 Cookie Request 为什么 | 更新日期: 2023-09-27 18:37:14

这是我运行的另一个线程的后续,该线程是 c# 中的读取 cookie。但是,那篇帖子中的答案似乎在灌木丛中跳动,所以我想在这里简化我的问题。我认为回答这个问题,我将能够解决这个问题。现在卡了将近两天试图阅读饼干,所以任何帮助不胜感激。

什么可能导致此行出现 NullReferenceException:

HttpCookie aCookie = Request.Cookies["UserSettings"];

我确定有一个名为"用户设置"的cookie,因为我可以在开发人员工具栏中看到它。所以 Request 或 Request.Cookie 必须为空,对吧?

为什么我不能使用 Request.Cookie?我看的每一个cookie教程都是这样做的。

编辑:在index.aspx中添加了cookie创建代码,顺便说一句,我试图在HomeController.cs中读取cookie,不知道这是否重要,但认为id提到了它。

<script type="text/javascript">
    function setLanguage() {
    cname = "language";
    cvalue =           document.getElementById('language').options[document.getElementById('language').selectedInd    ex].value;
    cexpire = new Date();
    cexpire.addDays(1);
    document.cookie = cname + '=' + escape(cvalue) +
(typeof cexpire == 'date' ? 'expires=' + cexpire.toGMTString() : '') +
',path=/;';
}
</script>

为什么 Request.Cookie 为空

这不是添加cookie的地方。当您谈论用户设置时,它尤其不是添加cookie的地方。用户设置通常是在用户的操作下建立的,例如,用户单击德语链接以切换到德语设置。正是在此控制器方法、事件或应用程序处理该单击行为时,应将 cookie 设置为响应并建立其持久性。

另外,请记住几件事。在此方法中,您将此 cookie 添加到每个响应中。在随后的控制器调用hc.getLang()中,您正在访问请求以从 cookie 中检索语言。在第一次调用中,这将始终为空,因为 cookie 尚未存在于请求中。您只是刚刚将其添加到响应中。但是,在下一次调用时,cookie 应该存在,但它将始终以设置为"nl"的语言存在,因为您为每个请求强制使用它。

我建议您从此 global.asax 事件中取出 cookie 生成代码,并将其放置在使用接口设置它的页面中(链接、按钮等)。然后,您的控制器将从该点开始访问请求 Cookie。请始终记住,请求和响应在页面的生命周期中是完全独立的对象,无论是 Web 表单还是 mvc。

编辑:因为您提到使用控制器,所以我假设您使用的是 MVC,因此我将针对我的代码示例以这种方式工作。由于已确定在Application_BeginRequest中设置 cookie 是一种糟糕的魔法,因此您需要在应用程序中引用用户操作的其他点建立它。假设您有一个名为 SettingsController 的控制器,它有一个名为 SetLanguage 的操作。

[Authorize]
public class SettingsController : Controller
{
    // ... skipping other constructor and method code
    [Authorize]
    [HttpPost]
    public ActionResult SetLanguage(MyLanguageModel model)
    {
        HttpCookie myCookie = new HttpCookie("UserSettings");
        myCookie.Value = model.AssignedLanguage;
        myCookie.Expires = DateTime.Now.AddDays(1);
        Response.Cookies.Add(myCookie);
        return View(model);
    }
}

这将假定编写视图是为了从模型中获取 AssignedLanguage 属性,并使用它来确定即时请求的语言。但是,所有后续请求都应有权访问用户设置 cookie。此时,您应该能够在后续请求中从请求管道中的任何位置调用Request.Cookies["UserSettings"]