2012-08-09 65 views
6

Tôi gặp sự cố khi chuyển cookie trong ASP.NET sang URL mới. Tôi thêm cookie để ứng phó như vậy:Truyền cookie trong Response.Redirect trong ASP.NET

Response.Cookies.Add(new HttpCookie("Username", Username.Text)); 

sau đó tôi phát hành một chuyển hướng:

Response.Redirect(returnURL);

Trên trang mới mà tôi đang chuyển hướng đến, bộ sưu tập cookie là trống rỗng. Tôi cố gắng để lấy một cookie như vậy:

Request.Cookies["Username"].Value;

bất cứ ai có thể nghĩ ra lý do tại sao các tập tin cookie không được thông qua?

EDIT:

info Hơn nữa tôi quên thêm - trên nỗ lực thứ hai trong phiên cùng một trình duyệt, các tập tin cookie được thông qua một cách chính xác với chuyển hướng.

EDIT # 2: Tôi thấy rằng nếu tôi sử dụng "localhost" thay vì tên miền thực trong URL chuyển hướng, thì cookie được chuyển chính xác vào lần đăng nhập đầu tiên. Vì vậy, nó chỉ khi URL chuyển hướng là tên miền thực tế mà nó không hoạt động. Lạ thật.

+2

Điều này tương tự như câu hỏi này http://stackoverflow.com/q/5366635/52136 –

+0

Cảm ơn bạn, nhưng điều này xảy ra với tôi trên IE9, FF, Chrome và Safari. Ngoài ra, tôi vừa thêm một số thông tin khác mà tôi đã quên thêm ban đầu. – tuseau

+0

Có thể trùng lặp với [Gửi cookie của trình duyệt trong khi chuyển hướng 302] (https://stackoverflow.com/questions/4694089/sending-browser-cookies-during-a-302-redirect) –

Trả lời

2
protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
     if (Request.QueryString["AcceptsCookies"] == null) 
     { 
      Response.Cookies["TestCookie"].Value = "ok"; 
      Response.Cookies["TestCookie"].Expires = 
       DateTime.Now.AddMinutes(1); 
      Response.Redirect("TestForCookies.aspx?redirect=" + 
       Server.UrlEncode(Request.Url.ToString())); 
     } 
     else 
     { 
      Label1.Text = "Accept cookies = " + 
       Server.UrlEncode(
       Request.QueryString["AcceptsCookies"]); 
     } 
    } 
} 

This link sẽ giúp bạn hiểu đọc và ghi cookie trong C#.

Ngoài ra, this page sẽ hữu ích trong trường hợp bạn quen với VB nhiều hơn C#.

3

Trình duyệt chỉ gửi cookie trở lại các trang trong cùng một miền với trang đặt cookie.

Vì vậy, nếu bạn truy cập trang http://localhost/login.aspx và máy chủ sau đó tiến hành đặt cookie và chuyển hướng đến (ví dụ) http://mymachinename/default.aspx, cookie sẽ không được gửi từ trình duyệt đến máy chủ khi yêu cầu url thứ hai vì không có cùng một tên miền.

Để lấy lại cookie, bạn sẽ phải chuyển hướng đến http://localhost/default.aspx hoặc bạn sẽ phải bắt đầu bằng cách ban đầu đi tới http://mymachinename/login.aspx.

3

Theo HTTP State Management Mechanism server xứ

THỂ gửi một đáp ứng tiêu đề Set-Cookie với bất kỳ phản ứng
. Tác nhân người dùng CÓ THỂ bỏ qua tiêu đề Set-Cookie chứa trong các câu hỏi
với mã trạng thái 100 cấp nhưng PHẢI xử lý các tiêu đề Set-Cookie
trong các phản hồi khác (bao gồm phản hồi với 400-
và mã trạng thái 500 cấp). Máy chủ gốc có thể bao gồm nhiều trường tiêu đề Thiết lập cookie
trong một câu trả lời duy nhất. Sự hiện diện của trường tiêu đề
Cookie hoặc Tập hợp tiêu đề cookie không loại trừ bộ nhớ cache HTTP
khỏi lưu trữ và sử dụng lại phản hồi.

Vì vậy, REDIRECT (3xx) nằm trong các phản hồi 'khác' để chúng được trình duyệt xử lý, sau đó có thể thả chúng vì tất cả các loại lý do. Một nguyên nhân của trình duyệt từ chối cookie là khi thuộc tính miền của cookie được chỉ định và không có đủ dấu chấm (như 'localhost') hoặc khi thuộc tính đường dẫn của cookie không khớp với đường dẫn thực tế trong URL (đường dẫn của cookie phân biệt chữ hoa chữ thường).

0

Thông thường tôi làm cho máy chủ của mình tạo chuỗi Base64 mà tôi truy xuất qua ajax. Khi đối tượng sẵn sàng có sẵn, sau đó tôi thực hiện 'tệp đính kèm' từ chuỗi cơ sở 64 trên máy khách. Bằng cách đó, tôi có thể phản hồi liên tục trên các trình duyệt để tải xuống hoàn tất.

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