2010-11-19 78 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