Khi nào sử dụng Request.Cookies trên Response.Cookies?


57

Tôi có sử dụng phản hồi khi ở một sự kiện trang (ví dụ: tải) vì đây là một phản hồi từ ASP.NET và yêu cầu khi nhấn một nút vì đây là một phản hồi sẽ chuyển sang ASP.NET để xử lý? Hoặc là có nhiều đến nó?

39

Trong ứng dụng web, yêu cầu là nội dung xuất phát từ trình duyệt và phản hồi là những gì máy chủ gửi lại. Khi xác thực cookie hoặc dữ liệu cookie từ trình duyệt, bạn nên sử dụng Request.Cookies. Khi bạn đang xây dựng các cookie được gửi đến trình duyệt, bạn cần thêm chúng vào Response.Cookies.


95

Họ là 2 thứ khác nhau, một tiết kiệm [đáp ứng], khác READS [Yêu cầu]

trong một Cookie (tin học nói) :) bạn lưu một tập tin nhỏ trong một thời gian của Hiện có chứa một đối tượng của loại chuỗi

trong khuôn khổ NET bạn save a cookie thực hiện:

HttpCookie myCookie = new HttpCookie("MyTestCookie"); 
DateTime now = DateTime.Now; 

// Set the cookie value. 
myCookie.Value = now.ToString(); 
// Set the cookie expiration date. 
myCookie.Expires = now.AddMinutes(1); 

// Add the cookie. 
Response.Cookies.Add(myCookie); 

Response.Write("<p> The cookie has been written."); 

Bạn đã viết cookie sẽ có sẵn trong một phút ... thông thường chúng tôi làm ngay bây giờThêm một tháng (1) để bạn có thể lưu cookie trong một tháng.

Để retrieve a cookie, bạn sử dụng các yêu cầu (bạn đang yêu cầu), như:

HttpCookie myCookie = new HttpCookie("MyTestCookie"); 
myCookie = Request.Cookies["MyTestCookie"]; 

// Read the cookie information and display it. 
if (myCookie != null) 
    Response.Write("<p>"+ myCookie.Name + "<p>"+ myCookie.Value); 
else 
    Response.Write("not found"); 

Hãy nhớ rằng:

Để Xóa Cookie, không có mã trực tiếp, Bí quyết là để Lưu cùng Tên Cookie với ngày hết hạn đã qua, ví dụ: now.AddMinutes (-1)

điều này sẽ xóa cookie.

Như bạn có thể thấy, mỗi khi thời gian sử dụng cookie hết hạn, tệp đó sẽ tự động bị xóa khỏi hệ thống.

+7

+1 Tôi đã không nhận ra bạn phải lưu lại cookie để cập nhật hết 29 apr. 102010-04-29 10:48:05

+2

1 rõ ràng giải thích nhưng đơn giản 27 aug. 132013-08-27 12:49:19

+1

Đây là chủ yếu là hữu ích, nhưng một chút sai lầm từ trong ví dụ của bạn khi bạn truy xuất cookie bạn thực sự ghi đè lên cookie đã được lưu trước đó với dòng 'HttpCookie myCookie = new HttpCookie (" MyTestCookie ");' Thay vào đó hãy sử dụng một cái gì đó như 'HttpCookie myCookie = new HttpCookie (" MyWrittenCookie ") ; ' 14 nov. 132013-11-14 20:16:28

+1

Điều này không hỗ trợ đọc cookie vừa được gửi trong phản hồi, trong trường hợp này bạn cần sử dụng 'Response.Cookies' 13 oct. 152015-10-13 03:27:17

  0

Tôi tin rằng điều này đúng khi bạn đang lập trình mã phía máy chủ. cho mã máy khách, nó là một cách khác. 30 mar. 172017-03-30 08:59:06


4

Cookie đến từ trình duyệt trong bộ sưu tập Request.Cookies. Đó là nơi bạn đọc các cookie đã được gửi.

Để gửi cookie trở lại trình duyệt bạn đặt chúng trong bộ sưu tập Response.Cookies.

Nếu bạn muốn xóa cookie, bạn phải yêu cầu trình duyệt xóa cookie bằng cách gửi cookie có ngày hết hạn đã qua. Trình duyệt đang sử dụng thời gian cục bộ của máy khách vì vậy nếu bạn đang sử dụng thời gian máy chủ để tạo ngày, hãy chắc chắn trừ ít nhất một ngày để chắc chắn rằng nó đã thực sự được truyền trong giờ địa phương của khách hàng.


16

Khi viết cookie, hãy sử dụng Phản hồi nhưng việc đọc có thể phụ thuộc vào tình huống của bạn. Thông thường, bạn đọc từ Yêu cầu nhưng nếu ứng dụng của bạn đang cố gắng lấy cookie vừa mới được viết hoặc cập nhật và chuyến đi khứ hồi tới trình duyệt chưa xảy ra, bạn có thể cần đọc biểu mẫu Phản hồi.

Tôi đã sử dụng mẫu này một lúc và nó hoạt động tốt cho tôi.

public void WriteCookie(string name, string value) 
{ 
    var cookie = new HttpCookie(name, value); 
    HttpContext.Current.Response.Cookies.Set(cookie); 
} 


public string ReadCookie(string name) 
{ 
    if (HttpContext.Current.Response.Cookies.AllKeys.Contains(name)) 
    { 
     var cookie = HttpContext.Current.Response.Cookies[name]; 
     return cookie.Value; 
    } 

    if (HttpContext.Current.Request.Cookies.AllKeys.Contains(name)) 
    { 
     var cookie = HttpContext.Current.Request.Cookies[name]; 
     return cookie.Value; 
    } 

    return null; 
} 
+4

Cách tiếp cận thay thế nhưng tương đương sẽ đơn giản là viết cookie của bạn vào bộ sưu tập Response.Cookies AND Request.Cookies khi lưu. Bằng cách này, bất kỳ logic nào khác trong chu kỳ có thể đọc cookie bạn vừa đặt mà không cần tìm trong đối tượng Response. 23 feb. 092009-02-23 00:59:23

  0

Chris, đã đồng ý và tôi đã từng làm điều đó nhưng gần đây tôi đã đọc rằng việc sửa đổi đối tượng Yêu cầu là không có. Sẽ cố gắng tìm một tham chiếu. 23 feb. 092009-02-23 01:11:32

  0

Cảm ơn, Chris. Andrew - Tôi rất thích xem tài liệu tham khảo đó. Bây giờ tôi sẽ đi với giải pháp của Chris. 09 sep. 092009-09-09 19:30:37

  0

Một mẫu hữu ích, nhưng lưu ý rằng nó không phải là 100% thread an toàn 12 sep. 132013-09-12 20:50:52


2

Khi tôi tạo hoặc cập nhật cookie trong .NET, tôi thường làm điều đó cho cả bộ sưu tập cookie yêu cầu và phản hồi. Bằng cách đó bạn có thể chắc chắn nếu bạn cố gắng đọc cookie tiếp tục xuống chuỗi yêu cầu trang, nó sẽ có thông tin chính xác.

  0

Alex, vấn đề này đặc biệt đã làm phiền tôi cả ngày. Cảm ơn bạn đã xóa nó thật đơn giản! 09 sep. 092009-09-09 19:29:53

  0

Yeh, có một số hành vi thú vị khi đặt cookie trong Phản hồi cũng sẽ đặt trong Yêu cầu nếu nó chưa tồn tại. Nhưng nếu nó đã tồn tại trong Yêu cầu, thiết lập Response không cập nhật Yêu cầu. Vì vậy, có vẻ như một tính năng có ý định hữu ích, nhưng có phần không nhất quán. Chắc chắn khi sửa đổi một lần mulitiple cookie trong cùng một yêu cầu, bạn có thể chạy vào các lỗi. 09 jul. 142014-07-09 21:31:02


1

Mã của Andrew đã đưa ra lỗi trong phương thức "AllKeys.Contains". Vì vậy, tôi sửa lại một chút ..

public void WriteCookie(string strCookieName, string strCookieValue) 
    { 
     var hcCookie = new HttpCookie(strCookieName, strCookieValue); 
     HttpContext.Current.Response.Cookies.Set(hcCookie); 
    } 


    public string ReadCookie(string strCookieName) 
    {  
     foreach (string strCookie in HttpContext.Current.Response.Cookies.AllKeys) 
     { 
      if (strCookie == strCookieName) 
      { 
       return HttpContext.Current.Response.Cookies[strCookie].Value; 
      } 
     }   

     foreach (string strCookie in HttpContext.Current.Request.Cookies.AllKeys) 
     { 
      if (strCookie == strCookieName) 
      { 
       return HttpContext.Current.Request.Cookies[strCookie].Value; 
      } 
     } 

     return null; 
    } 
  0

Bạn có nhớ bao gồm System.Linq không? Làm như vậy đã sửa lỗi trên tệp của tôi. 06 feb. 122012-02-06 16:04:44

  0

Nếu đó chỉ là một lỗi nhỏ thì tốt hơn nên đề xuất chỉnh sửa cho bài đăng gốc trước khi nhân đôi câu trả lời. 06 dec. 122012-12-06 17:11:46