【问题标题】:weird MVC2 Cookies problem奇怪的 MVC2 Cookies 问题
【发布时间】:2011-05-12 17:11:07
【问题描述】:

我在下面的示例中遇到了 cookie 问题。 cookie 确实被创建了,当我在它创建后放置一个调试点时,我可以用手表检查 cookie 中的内容。但是,当我重新启动网站时,cookie 仍然存在,但已变为空并且不会创建模型(所有字段为空。)

我环顾四周,发现与使用 response.Cookie 和没有到期日期有关的错误,但我改变了周围的东西,它仍然是空的。我做错了什么还是因为我使用 localhost?

    [HttpGet]
    [Autorize]
    public ActionResult ManagePaymentRun()
    {
            ViewData["currentAction"] = "Index";
            payments.AccountNo = Request.Cookies["FSCSPayments"]["AccountNo"];
            payments.SortCode = Request.Cookies["FSCSPayments"]["SortCode"];
            payments.FirstChequeNo = "2";// Request.Cookies["FSCSPayments"]["FirstChequeNo"]; 
            payments.FileName = Request.Cookies["FSCSPayments"]["FileName"];
            payments.FRN = Request.Cookies["FSCSPayments"]["FRN"];
            payments.JobNumber = Request.Cookies["FSCSPayments"]["JobNumber"];
            payments.StartRecNo = Request.Cookies["FSCSPayments"]["StartRecNo"]; 
            return View(payments);
    }

    internal void CreateCookie()
    {

        HttpCookie cookie = new HttpCookie("FSCSPayments");
        cookie.Values.Add("AccountNo", payments.AccountNo);
        cookie.Values.Add("SortCode", payments.SortCode);
        cookie.Values.Add("FirstChequeNo", payments.FirstChequeNo);
        cookie.Values.Add("FileName", payments.FileName);
        cookie.Values.Add("FRN", payments.FRN);
        cookie.Values.Add("JobNumber", payments.JobNumber);
        cookie.Values.Add("StartRecNo", payments.StartRecNo);
        cookie.Expires = DateTime.Now.AddDays(14);
        cookie.Path = "/";
        Request.Cookies.Add(cookie);
    }

【问题讨论】:

  • 如果 cookie 没有设置未来的到期日期,那么它是一个会话级别的 cookie,通常会在浏览器关闭或会话超时时被销毁(取决于特定的浏览器)。您在代码中的哪个位置调用CreateCookie()?当您说您重新启动网站并且cookie在那里时,您是什么意思?您在浏览器的 cookie 缓存中找到它吗?如果 cookie 被持久化,那么它与服务器的停止和启动无关。
  • 如果我搜索 cookie 缓存,它就在那里。我在我的 cookie 中添加了一个添加天数,所以它不应该是会话 cookie 对吗?并且 createcookie 在 ManagePaymentRun HttpPost 操作中被调用,并且我在创建 cookie 中设置了一个调试点并且它确实通过了那里。

标签: c# visual-studio-2010 asp.net-mvc-2 cookies localhost


【解决方案1】:

我认为你应该解决这个问题,我有 3 条建议:

1) cookie.Expires = DateTime.Now.AddDays (14);

2) 小心 .Add(Key, Value),值应该是安全的,不包含某些符号,尽管我认为会引发异常

3) 指定cookie.path

但我的赌注是第一个。

【讨论】:

  • 是的,我同意你的第一点。 OP 调用 cookie.Expires.AddDays(14);但不会将此值分配回 cookie.Expires。我猜 cookie.Expires 甚至可能也会初始化为 DateTime.MinValue。
  • 我已经尝试过 1 和 3。在我的测试用例中,我将 16 添加到所有字段,所以那里不会有任何奇怪的元素。但是,添加路径时,我在该路径中找不到 cookie。
【解决方案2】:
cookie.Path = "C:\\Documents and Settings\\Andy\\Cookies";

这并不是要按照您的想法去做。您无法指定 cookie 在客户端计算机上的存储位置。这绝对取决于浏览器,您无法控制它。这是为了限制此 cookie 对您网站的某些部分的访问。因此,如果您不想限制,只需将其设置为 cookie.Path = "/"

您的ManagePaymentRun 操作方法也看起来很奇怪。为什么要在有[Autorize] 属性的情况下测试用户是否经过身份验证:

[HttpGet]
[Authorize]
public ActionResult ManagePaymentRun()
{
    ViewData["currentAction"] = "Index";
    var payments = new Payments();
    payments.AccountNo = Request.Cookies["FSCSPayments"]["AccountNo"];
    payments.SortCode = Request.Cookies["FSCSPayments"]["SortCode"];
    payments.FirstChequeNo = "2";// Request.Cookies["FSCSPayments"]["FirstChequeNo"]; 
    payments.FileName = Request.Cookies["FSCSPayments"]["FileName"];
    payments.FRN = Request.Cookies["FSCSPayments"]["FRN"];
    payments.JobNumber = Request.Cookies["FSCSPayments"]["JobNumber"];
    payments.StartRecNo = Request.Cookies["FSCSPayments"]["StartRecNo"]; 
    return View(payments);
}

【讨论】:

  • 我以前从未听说过 Authorize 属性,但我现在添加了它。太好了。
【解决方案3】:

这个问题已经解决,是因为我使用了 IIS 5 和 MVC。我们现在将这个项目复制到一台 IIS7 电脑上,并且我们让 cookie 工作了。

【讨论】:

    猜你喜欢
    • 2015-02-27
    • 2018-06-26
    • 2011-08-13
    • 2011-08-17
    • 2011-02-02
    • 2021-10-10
    • 2014-04-21
    • 2010-12-30
    • 2014-03-21
    相关资源
    最近更新 更多