2012-01-18 42 views
12

Tôi sắp xếp các loại hạt này. Tôi có thể viết vào một cookie, và sau đó đọc lại nó. Nhưng tại một số điểm, tôi muốn cập nhật giá trị nó giữ. Bất cứ khi nào tôi nhận được cookie một lần nữa, tôi nhận được giá trị ban đầu, không phải là một cập nhật. Dưới đây là mã tôi sử dụng để viết/cập nhật và đọc cookie.Không thể cập nhật cookie trong ASP.NET

private static HttpCookie WriteCookie(Guid siteId, string siteName) 
    { 
     var cookie = HttpContext.Current.Request.Cookies.Get("UserSettings"); 
     if(cookie != null) { 
      cookie.Value = EncryptObject(new UserSettingsModel { SiteID = siteId, SiteName = siteName }); 
      HttpContext.Current.Response.Cookies.Set(cookie); 
     }else { 
      cookie = new HttpCookie("UserSettings") { Path = "/", Expires = DateTime.Now.AddDays(1), Value = EncryptObject(new UserSettingsModel { SiteID = siteId, SiteName = siteName }) }; 
      HttpContext.Current.Response.Cookies.Add(cookie); 
     } 
     return cookie; 
    } 

    public static UserSettingsModel GetUserSettings(string username = null) 
    { 
     var cookie = HttpContext.Current.Request.Cookies.Get("UserSettings"); 
     if (cookie == null || string.IsNullOrEmpty(cookie.Value)) 
     { 
      cookie = ResetUserSettings(); 
     } 
     var userSettings = DecryptObject<UserSettingsModel>(cookie.Value); 
     if (userSettings != null) 
     { 
      var siteId = userSettings.SiteID; 
      var siteName = userSettings.SiteName; 
      return new UserSettingsModel { SiteID = siteId, SiteName = siteName }; 
     } 
     throw new SecurityException("You have no site attached to your user. Contact an administrtor."); 
    } 

GetUserSettings luôn trả về giá trị mà cookie được tạo ban đầu. Chuyện gì vậy?

CHỈNH SỬA:

Tôi đã thử gọi WriteCookie trực tiếp từ phương thức trong Bộ điều khiển. Cookie đã được thiết lập. Tôi thường gọi là WriteCookie thông qua một yêu cầu Ajax. Bây giờ, tôi thực sự phải viết cookie bằng cách sử dụng JavaScript, hoặc có thể tôi bằng cách nào đó chỉ cần làm điều đó bằng cách sử dụng WriteCookie?

Cảm ơn!

+0

Bạn đã kiểm tra những gì thực sự được gửi bằng cách sử dụng trình điều khiển không? Nhìn vào hết hạn và đường dẫn cụ thể. – Oded

+0

Tôi đang sử dụng trình duyệt Chrome và sử dụng các công cụ Nhà phát triển tích hợp, tôi có thể thấy rằng giá trị cookie không bao giờ được cập nhật. Tôi tự hỏi tại sao – Andreas

+0

Nhìn vào yêu cầu và tiêu đề phản hồi để xem điều gì đang diễn ra. – Oded

Trả lời

17

Hãy thử như thế này:

var response = HttpContext.Current.Response; 
response.Cookies.Remove("UserSettings"); 
response.Cookies.Add(cookie); 

Nhưng tôi nghi ngờ rằng vấn đề thực tế của bạn là bạn đang gọi WriteCookie phương pháp và phương pháp GetUserSettings trong yêu cầu HTTP cùng mà không làm việc như bạn nghĩ nó sẽ hoặc như bạn có thể mong đợi nó.

Các WriteCookie viết cookie để đáp ứng để nó có sẵn trên yêu cầu tiếp theo nhưng GetUserSettings đọc cookie từ Yêu cầu vì vậy bạn đang nhận được giá trị của cookie mà ban đầu được thành lập khi yêu cầu này đã được bắt đầu mà tất nhiên là giá trị cũ. Vì vậy, sau khi gọi số WriteCookie để cập nhật giá trị của cookie cài đặt người dùng, hãy thực hiện chuyển hướng và chỉ khi yêu cầu tiếp theo sử dụng phương thức GetUserSettings.

Cũng trong ASP.NET MVC bạn thường không muốn sử dụng đối tượng tĩnh HttpContext.Current nhưng sử dụng các trừu tượng mà khung này cung cấp cho bạn. Tôi biết bạn đã viết 2 phương pháp đó là tĩnh nhưng bạn nên viết chúng như là một phương thức mở rộng cho đối tượng HttpContextBase chẳng hạn. Bằng cách này, bạn có thể gọi chúng ở bất cứ nơi nào bạn có một thể hiện của lớp cơ sở trừu tượng này mà ASP.NET MVC cung cấp cho bạn ở nhiều nơi phổ biến trong suốt thời gian tồn tại của một yêu cầu HTTP.

+0

Tôi đã cố xóa và sau đó thêm, như bạn đã đề xuất. Điều đó không hiệu quả. WriteCookie được gọi bằng cách sử dụng một cuộc gọi Ajax. Khi cuộc gọi này trở lại, trang được làm mới và GetUserSettings được gọi. Vì vậy, các cuộc gọi trong các yêu cầu khác nhau. Đừng đề cập đến các cuộc gọi Ajax bị tê liệt và sau đó tải lại. Tôi biết điều này nên được làm sạch. – Andreas

+0

Trang được làm mới bằng cách sử dụng "window.location.reload();" nhưng tôi đã thử làm một Ctrl + F5 và tôi vẫn nhận được giá trị cũ. Tôi nhận ra rằng người khác chỉ trúng lần đầu tiên. đây là cách nó hoạt động. nếu có cookie, cookie sẽ được cập nhật. nếu không nó sẽ được tạo ra – Andreas

+1

Vấn đề là tôi đã gọi WriteCookie từ một yêu cầu Ajax. Tôi viết lại mã, do đó, cookie bây giờ được thiết lập thông qua JavaScript. Làm việc giống như một nét duyên dáng bây giờ. Cảm ơn bạn đã chỉ đúng hướng – Andreas

Các vấn đề liên quan