Câu hỏi Tại sao tôi nhận được “Không thể chuyển hướng sau khi tiêu đề HTTP đã được gửi” khi tôi gọi Response.Redirect ()?


Khi tôi gọi Response.Redirect(someUrl) Tôi nhận được một HttpException: "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 thế nào tôi có thể khắc phục vấn đề này?


76
2017-10-01 20:22


gốc




Các câu trả lời:


Theo tài liệu MSDN cho Response.Redirect(string url), nó sẽ ném một HttpException khi "một 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), gọi nó sẽ làm cho các tiêu đề được gửi cho khách hàng. Điều này có nghĩa rằng nếu bạn gọi nó lần thứ hai, hoặc nếu bạn gọi nó sau khi bạn đã khiến các tiêu đề được gửi theo cách khác, bạn sẽ nhận được HttpException.

Một cách để bảo vệ chống lại cuộc gọi Response.Redirect () nhiều lần là kiểm tra Response.IsRequestBeingRedirected tài sản (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");

112
2017-10-01 20:25



Yup chính xác. Điều này xảy ra khá dễ dàng với ASP.NET MVC 4 và bộ lọc Ngoại lệ, v.v. Bạn cũng không thể thay đổi Mã trạng thái phản hồi HTTP sau khi chuyển hướng 301/302 đã được phát hành. - Jaans
Tôi đã giải quyết vấn đề bằng cách làm cho tất cả các thuộc tính trên trang của tôi 'tĩnh' - Sal
làm cho các thuộc tính của bạn tĩnh là một giải pháp nguy hiểm - prospector
Làm thế nào có thể chuyển hướng được gọi là lần thứ hai trừ khi ThreadAbortException (từ lần đầu tiên) bị bắt? :} "Gọi chuyển hướng tương đương với gọi lại Chuyển hướng với tham số thứ hai (endResponse) được đặt thành true. " - user2864740
Thật kỳ lạ, nhưng trong ứng dụng biểu mẫu web kế thừa Response.IsRequestBeingRedirected là sai và tôi vẫn nhận được ngoại lệ tương tự 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. - Alisson


Khi bạn gửi bất kỳ nội dung nào cho khách hàng, các tiêu đề HTTP đã được gửi đi. A Response.Redirect() gọi công trình bằng cách gửi thông tin đặc biệt trong các tiêu đề khiến trình duyệt yêu cầu một URL khác.

Kể từ khi tiêu đề đã được gửi đ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) hoặc thực hiện Chuyển hướng trước khi bạn làm bất cứ điều gì khác hoặc b) thử sử dụng Response.Buffer = true trước khi bạn làm bất cứ đ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 hiện xong.


16
2017-10-01 20:27





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 hay không.


7
2017-10-01 20:24





Chỉ cần kiểm tra xem bạn đã đặt tùy chọn đệm thành false (theo mặc định là true). Đối với response.redirect để hoạt động,

  1. Việc đệm phải đúng,
  2. bạn không nên gửi nhiều dữ liệu hơn bằng cách sử dụng response.write vượt quá kích thước bộ đệm mặc định (trong trường hợp này nó sẽ tự xóa các tiêu đề được gửi đi), do đó không cho phép bạn chuyển hướng.

3
2018-05-01 09:27





Sử dụng return RedirectPermanent(myUrl) đã làm cho tôi


2
2018-03-23 08:45





Có một câu trả lời đơn giản cho điều này: Bạn đã được xuất một cái gì đó khác, như văn bản, hoặc bất cứ điều gì liên quan đến đầu ra từ trang của bạn trước khi bạn gửi tiêu đề của bạn. Điều này ảnh hưởng đến lý do tại sao bạn nhận được lỗi đó.

Chỉ cần kiểm tra mã của bạn cho đầu ra posible hoặc bạn có thể đặt tiêu đề trên đầu trang của phương pháp của bạn để nó sẽ được gửi đầu tiên.


1
2018-01-14 03:07





Vấn đề 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");}

1
2018-01-08 12:02





Tôi đã giải quyết vấn đề bằng cách sử dụng: Response.RedirectToRoute ("CultureEnabled", RouteData.Values); thay vì Response.Redirect.


1
2017-10-31 16:43





Chức năng chuyển hướng có thể hoạt động bằng cách sử dụng tiêu đề http 'refresh' (và có thể sử dụng mã 30X). Khi tiêu đề đã được gửi đến máy khách, không có cách nào để máy chủ nối thêm lệnh chuyển hướng đó, quá muộn.


0
2018-05-01 09:07