为什么Request.Cookies为null?

时间:2012-06-14 10:31:28

标签: c# cookies request

这是我运行的另一个线程Reading cookie in c#的后续跟进。然而,该帖子中的答案似乎击败了丛林,所以我想在这里简化我的问题。我想,回答这个问题,我将能够解决这个问题。现在差不多两天试图读取一个cookie,所以感谢任何帮助。

什么可能导致此行的NullReferenceException:

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

我确信有一个名为“UserSettings”的cookie,我可以通过开发人员工具栏看到它。 所以Request或Request.Cookies必须为null,对吗?

为什么我不能使用Request.Cookies?我看的每一个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>

1 个答案:

答案 0 :(得分:3)

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

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

我建议你从这个global.asax事件中取出cookie生成代码,然后将它放在一个使用界面来设置它的页面中(一个链接,一个按钮,等等)。然后您的控制器将从该点访问请求cookie。始终记住,请求和响应在页面的生命周期中是完全独立的对象,无论它是webforms还是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属性并使用它来确定即时请求的语言。但是,所有后续请求都应该可以访问UserSettings cookie。此时,您应该能够在后续请求中从请求管道中的任何位置调用Request.Cookies["UserSettings"]