2012-07-10 68 views
0

我在服務器上添加的cookie:cookie不添加

private void AddCookie(int id) 
{ 
    HttpCookie cookie = new HttpCookie("wmpayment"); 
    cookie.Value = id.ToString(); 
    cookie.Expires = DateTime.Now.AddDays(2); 
    this.ControllerContext.HttpContext.Response.Cookies.Add(cookie); 
} 

,但是當我從請求讀取Cookie - cookie.Expire等於日期01.01.0001

public static int WMPendingOrder 
{ 
    get 
    { 
     var cookie = HttpContext.Current.Request.Cookies["wmpayment"]; 
     int id = 0; 
     DateTime exp; 

     if (cookie != null) 
     { 
      DateTime.TryParse(cookie.Expires.ToString(), out exp); 
      if (DateTime.Now < exp) 
       int.TryParse(cookie.Value, out id); 
     } 
     return id; 
    } 
} 

日誌:COOKIE.Name:wmpayment COOKIE.Value:0 COOKIE.Expire:01.01.0001 0:00:00 我不明白是什麼問題。

+0

有什麼不對這一行。「而比我閱讀 - 過期= 01.01.0001:「..請改變它..它很難理解你想要什麼.. – Yasser 2012-07-10 12:06:11

+0

我發現本教程有幫助,你可以考慮這個替代:http://code-inside.de/blog -in/2010/10/19/howto-create-and-remove-cookies -with-asp-net-mvc/ – cpoDesign 2012-07-10 12:25:52

+0

我s如下解決了這個問題。只需簡單地重置cookie的值 - 將orderId設置爲「0」。但非常有趣的是,爲什麼瀏覽器在刪除服務器後不刪除cookie。 – user571874 2012-07-10 14:40:35

回答

1

所以基本上有兩條信息需要堅持。該ID和失效日期。如何存儲的到期日在一個單獨的cookie:

private void AddCookie(int id) 
{ 
    HttpCookie cookie = new HttpCookie("wmpayment"); 
    cookie.Value = id.ToString(); 
    cookie.Expires = DateTime.Now.AddDays(2); 
    this.ControllerContext.HttpContext.Response.Cookies.Add(cookie); 

    HttpCookie cookie = new HttpCookie("wmpaymentexpire"); 
    cookie.Value = DateTime.Now.AddDays(2).ToString(); 
    cookie.Expires = DateTime.Now.AddDays(2); 
    this.ControllerContext.HttpContext.Response.Cookies.Add(cookie); 
} 

所以檢查wmpayment您讀取Cookie wmpaymentexpire價值的cookie的過期日期。

+0

我不認爲這是一個很好的變種。我想了解這個問題。 – user571874 2012-07-10 13:32:50

+1

如果你不喜歡我的建議,那就夠公平了。但正如Jonathan Rupp在他的回答中所寫,客戶不會將其cookie的有效期限發送回服務器。因此,您可以在服務器上設置cookie的到期日期並將其發送給客戶端。但客戶端不會將其發回,因此您無法在服務器上讀取它。只有cookie的名稱和值從cleint發送到服務器。 – user1429080 2012-07-10 13:49:20

+0

非常感謝。我不知道這件事。那麼,你能告訴我爲什麼刪除服務器上的Cookie後,它存在於客戶端上嗎? – user571874 2012-07-10 14:11:41

0

當cookie提交回服務器時,它們不包含'Expires'選項,因此exp未被填充,因此它保持其默認值DateTIme.MinValue。因此,DateTime.Now < exp永遠不會是真的,所以int.TryParse(cookie.Value, out id)從不運行,所以id保持默認值0

試試這個:

public static int WMPendingOrder 
{ 
    get 
    { 
     var cookie = HttpContext.Current.Request.Cookies["wmpayment"]; 
     int id = 0; 

     if (cookie != null) 
     { 
      int.TryParse(cookie.Value, out id); 
     } 
     return id; 
    } 
} 

你並不需要檢查過期的餅乾服務器端 - 如果他們到期,客戶端將不會給他們。

+0

在提交webmoney商家的請求之前,我仍保留在cookie順序ID中。如果付款訂單成功,我刪除該cookie,如果沒有,我將顯示與用戶有待處理付款訂單的消息一起定位。因此,我需要檢查過期Cookie – user571874 2012-07-10 12:31:59

+0

@ user571874:如果「過期」值非常重要,則需要將其存儲爲cookie的值(或者編碼到相同的cookie中,或者按照@ user1429080的建議單獨編碼)。客戶端不會將cookie過期信息發送回服務器 - 只是名稱和值。 – 2012-07-11 01:49:53

1

您可以使用此代碼創建一個cookie:

  FormsAuthenticationTicket tkt; 
      string cookiestr; 
      HttpCookie ck; 

      tkt = new FormsAuthenticationTicket(1, UsrNm, DateTime.Now, 
     DateTime.Now.AddMinutes(30), chkPersistCookie.Checked, "Issue Ticket"); 
      cookiestr = FormsAuthentication.Encrypt(tkt); 

      ck = new HttpCookie(FormsAuthentication.FormsCookieName, cookiestr); 
      if (chkPersistCookie.Checked) 
       ck.Expires = tkt.Expiration; 
      ck.Path = FormsAuthentication.FormsCookiePath; 
      Response.Cookies.Add(ck); 

      string strRedirect; 
      strRedirect = Request["ReturnUrl"]; 
      if (strRedirect == null) 
       strRedirect = "~/default.aspx"; 
      Response.Redirect(strRedirect, true); 

* 注: *添加組件using System.Web.SecurityFormsAuthenticationTicket