Khi tôi gọi, Response.Redirect(someUrl)
tôi nhận được HttpException sau:
Không thể chuyển hướng sau khi tiêu đề HTTP đã được gửi.
Tại sao tôi nhận được điều này? Và làm cách nào để khắc phục sự cố này?
Khi tôi gọi, Response.Redirect(someUrl)
tôi nhận được HttpException sau:
Không thể chuyển hướng sau khi tiêu đề HTTP đã được gửi.
Tại sao tôi nhận được điều này? Và làm cách nào để khắc phục sự cố này?
Câu trả lời:
Theo tài liệu MSDN cho Response.Redirect(string url)
, nó sẽ ném ra một HttpException khi "chuyển hướng được cố gắng sau khi các tiêu đề HTTP đã được gửi". Vì Response.Redirect(string url)
sử dụng tiêu đề phản hồi Http "Vị trí" ( http://en.wikipedia.org/wiki/HTTP_headers#Responses ), việc gọi nó sẽ khiến tiêu đề được gửi đến máy khách. Điều này có nghĩa là nếu bạn gọi nó lần thứ hai hoặc nếu bạn gọi nó sau khi bạn đã gửi tiêu đề theo cách khác, bạn sẽ nhận được HttpException.
Một cách để bảo vệ không gọi Response.Redirect () nhiều lần là kiểm tra thuộc Response.IsRequestBeingRedirected
tính (bool) trước khi gọi nó.
// Causes headers to be sent to the client (Http "Location" response header)
Response.Redirect("http://www.stackoverflow.com");
if (!Response.IsRequestBeingRedirected)
// Will not be called
Response.Redirect("http://www.google.com");
endResponse
) được đặt thành true."
Response.IsRequestBeingRedirected
là sai và tôi vẫn nhận được cùng một ngoại lệ này (bên trong Application_EndRequest
phương thức sự kiện trong Global.asax). Tôi không thể hiểu tại sao.
Sau khi bạn gửi bất kỳ nội dung nào đến máy khách, tiêu đề HTTP đã được gửi. Cuộc Response.Redirect()
gọi hoạt động bằng cách gửi thông tin đặc biệt trong tiêu đề khiến trình duyệt yêu cầu một URL khác.
Vì các tiêu đề đã được gửi, asp.net không thể làm những gì bạn muốn (sửa đổi các tiêu đề)
Bạn có thể giải quyết vấn đề này bằng cách a) thực hiện Chuyển hướng trước khi bạn làm bất kỳ điều gì khác, hoặc b) thử sử dụng Response.Buffer = true
trước khi bạn làm bất kỳ điều gì khác, để đảm bảo rằng không có đầu ra nào được gửi đến máy khách cho đến khi toàn bộ trang được thực thi xong.
Chuyển hướng chỉ có thể xảy ra nếu dòng đầu tiên trong thông báo HTTP là " HTTP/1.x 3xx Redirect Reason
".
Nếu bạn đã gọi Response.Write()
hoặc đặt một số tiêu đề, sẽ quá muộn để chuyển hướng. Bạn có thể thử gọi Response.Headers.Clear()
trước khi Chuyển hướng để xem điều đó có hữu ích không.
return RedirectToAction("Logout", "Authentication");
và tôi nhận được rằng lỗi
Chỉ cần kiểm tra xem bạn đã đặt tùy chọn đệm thành false chưa (theo mặc định là true). Đối với response.redirect to work,
Response.BufferOutput = true;
trong Hành động, trong Bộ điều khiển?
Bạn cũng có thể sử dụng mã được đề cập bên dưới
Response.Write("<script type='text/javascript'>"); Response.Write("window.location = '" + redirect url + "'</script>");Response.Flush();
Có một câu trả lời đơn giản cho điều này: Bạn đã được xuất một thứ gì đó khác, như văn bản hoặc bất kỳ thứ gì liên quan đến kết quả từ trang của bạn trước khi bạn gửi tiêu đề của mình. Điều này ảnh hưởng đến lý do tại sao bạn gặp lỗi đó.
Chỉ cần kiểm tra mã của bạn để biết đầu ra có thể tìm thấy hoặc bạn có thể đặt tiêu đề lên đầu phương pháp của mình để nó sẽ được gửi trước.
Nếu bạn đang cố gắng chuyển hướng sau khi tiêu đề đã được gửi (ví dụ: nếu bạn đang thực hiện chuyển hướng lỗi từ một trang được tạo một phần), bạn có thể gửi một số Javascript ứng dụng khách (location.replace hoặc location.href, v.v.) để chuyển hướng đến bất kỳ URL nào bạn muốn. Tất nhiên, điều đó phụ thuộc vào những gì HTML đã được gửi xuống.
Sự cố của tôi đã được giải quyết bằng cách thêm Trình xử lý ngoại lệ để xử lý "Không thể chuyển hướng sau khi tiêu đề HTTP đã được gửi". Lỗi này như được hiển thị bên dưới mã
catch (System.Threading.ThreadAbortException)
{
// To Handle HTTP Exception "Cannot redirect after HTTP headers have been sent".
}
catch (Exception e)
{//Here you can put your context.response.redirect("page.aspx");}
Lỗi
Không thể chuyển hướng sau khi tiêu đề HTTP đã được gửi.
System.Web.HttpException (0x80004005): Không thể chuyển hướng sau khi tiêu đề HTTP đã được gửi.
Đề xuất
Nếu chúng tôi sử dụng asp.net mvc và làm việc trên cùng một bộ điều khiển và chuyển hướng đến các Hành động khác nhau thì bạn không cần phải viết ..
Response.Redirect ("ActionName", "ControllerName");
tốt hơn là chỉ sử dụng
return RedirectToAction ("Tên hành động");
hoặc
trả về View ("ViewName");
Nếu bạn nhận được Không thể chuyển hướng sau khi tiêu đề HTTP đã được gửi thì hãy thử mã bên dưới này.
HttpContext.Current.Server.ClearError();
// Response.Headers.Clear();
HttpContext.Current.Response.Redirect("/Home/Login",false);
Có 2 cách để sửa lỗi này:
Chỉ cần thêm một return
câu lệnh sau của bạn Response.Redirect(someUrl);
(nếu chữ ký phương thức không phải là "void", tất nhiên bạn sẽ phải trả về "loại" đó) như vậy:
Response.Redirect ("Login.aspx");
trở về;
Lưu ý rằng trả về cho phép máy chủ thực hiện chuyển hướng ... nếu không có nó, máy chủ muốn tiếp tục thực thi phần còn lại của mã của bạn ...
Response.Redirect(someUrl)
câu lệnh được thực thi CUỐI CÙNG của bạn trong phương thức ném ngoại lệ. Thay thế của bạn Response.Redirect(someUrl)
bằng một chuỗi VARIABLE có tên "someUrl" và đặt nó thành vị trí chuyển hướng ... như sau://......some code
string someUrl = String.Empty
..... một số logic
if (x=y)
{
// comment (original location of Response.Redirect("Login.aspx");)
someUrl = "Login.aspx";
}
...... thêm mã
// DI CHUYỂN Câu trả lời của bạn. Chuyển hướng đến ĐÂY (phần cuối của phương pháp):
Response.Redirect(someUrl);
return;
return
phải làm gì? Các return
chỉ xác định rằng phương pháp này là hoàn thành. Nhưng khi không còn bất kỳ mã nào, phương pháp này vẫn hoàn tất. Và việc lưu trữ một url trong một biến không thay đổi bất cứ điều gì, ý tôi là: tại sao nên làm như vậy? Chuỗi cũng vậy. Điều đã biên dịch không tạo ra bất kỳ sự khác biệt nào giữa một chuỗi và một biến chứa một chuỗi ...: hãy nghĩ về x = 5
, vì vậy x là 5 nhưng 5 cũng là 5. thậm chí 10/2 sẽ là 5 ... không có gì khác biệt