2010-11-19 74 views
1

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

我四处张望,发现与使用response.Cookie有关的错误没有失效日期,但我改变了事情,并保持空白。我做错了什么或者是因为我使用本地主机?

[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); 
    } 
+1

如果cookie未来的到期日期未设置,那么它是一个会话级别的cookie,当浏览器关闭或会话超时(取决于特定浏览器)时通常会被销毁。 你的代码在哪里调用'CreateCookie()'?当你说你重新启动网站并且cookie在那里,你是什么意思?你可以在浏览器的Cookie缓存中找到它?如果cookie被持久化,则它独立于服务器的停止和启动。 – 2010-11-19 16:00:09

+0

如果我搜索cookie缓存,它就在那里。我添加了一个添加日期到我的cookie,所以它不应该是会话cookie正确吗?并在ManagePaymentRun HttpPost操作中调用createcookie,并且在创建cookie时设置了一个调试点,并且它通过那里。 – Andy 2010-11-19 16:06:29

回答

0

这个问题是由于我使用IIS 5和MVC的事实解决,是。我们现在将这个项目拷贝到IIS7电脑上,我们得到了cookies的工作。

0

我想你应该trobleshoot的问题,我有三点建议:

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

2)小心使用。新增(键,值),值应该是安全的不包含一些符号,althoug我想抛出一个异常

3)指定cookie.path

但我的赌注是第一个。

+0

是的,我同意你的第一点。 OP调用cookie.Expires.AddDays(14);但不会将此值分配回cookie.Expires。我猜测cookie.Expires甚至可能初始化为DateTime.MinValue。 – 2010-11-19 16:20:47

+0

我试过1和3.在我的测试案例中,我将16添加到所有字段,所以不会有任何奇怪的元素。但是,在添加路径时,我没有在该路径中找到cookie。 – Andy 2010-11-19 16:50:53

1
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); 
} 
+0

我从来没有听说过授权属性,但现在iv'e添加它。这很棒。 – Andy 2010-11-22 11:00:10