當我打電話給Response.Redirect(someUrl)
時,我得到一個HttpException:「HTTP頭已經發送後無法重定向」。當我調用Response.Redirect()時,爲什麼會得到「HTTP頭文件發送後無法重定向」?
爲什麼我得到這個?我該如何解決這個問題?
當我打電話給Response.Redirect(someUrl)
時,我得到一個HttpException:「HTTP頭已經發送後無法重定向」。當我調用Response.Redirect()時,爲什麼會得到「HTTP頭文件發送後無法重定向」?
爲什麼我得到這個?我該如何解決這個問題?
根據Response.Redirect(string url)
的MSDN文檔,當「在發送HTTP頭之後嘗試重定向」時,它將拋出HttpException。由於Response.Redirect(string url)
使用Http「Location」響應標頭(http://en.wikipedia.org/wiki/HTTP_headers#Responses),因此調用它將使標頭髮送到客戶端。這意味着如果你第二次調用它,或者在你以其他方式發送頭文件後調用它,你將會得到HttpException異常。
防止多次調用Response.Redirect()的一種方法是在調用它之前檢查Response.IsRequestBeingRedirected
屬性(bool)。
// 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");
只有HTTP消息中的第一行是「HTTP/1.x 3xx Redirect Reason
」才能發生重定向。
如果您已經撥打了Response.Write()
或設置了一些標題,重定向就太遲了。您可以嘗試在重定向之前撥打Response.Headers.Clear()
以查看是否有幫助。
一旦您發送任何內容在所有客戶端,HTTP標頭已經發送。一個Response.Redirect()
調用通過發送頭文件中的特殊信息,使瀏覽器請求不同的URL。
由於頭也都發出去,asp.net不能做你想要什麼(修改標題)
您可以通過一個解決這個問題),要麼做重定向你做任何事情之前,或b )在執行任何其他操作之前,請嘗試使用Response.Buffer = true
,以確保在整個頁面執行完畢之前,不會向客戶端發送任何輸出。
重定向功能可能通過使用'刷新'http頭(也可能使用30X代碼)起作用。一旦標題已發送到客戶端,服務器就無法追加該重定向命令,這太遲了。
只需檢查是否已將緩衝選項設置爲false(默認情況下爲true)。對於Response.Redirect的工作,
對此有一個簡單的答案: 在發送標題之前,您已經輸出了其他內容,如文本或任何與頁面輸出相關的內容。這會影響你爲什麼得到這個錯誤。
只需檢查您的代碼是否可輸出,或者您可以將標題放在方法的頂部,以便首先發送。
如果您在發送標頭後嘗試重定向(例如,如果您正在從部分生成的頁面進行錯誤重定向),則可以發送一些客戶端Javascript(location.replace或location.href等等)重定向到你想要的任何URL。當然,這取決於已經發送了什麼HTML。
我的問題通過添加異常處理程序來處理 「無法在發送HTTP頭之後重定向」得到解決。此錯誤如下所示代碼
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");}
如果您收到HTTP頭後發送無法重定向然後嘗試下面的代碼。
HttpContext.Current.Server.ClearError();
// Response.Headers.Clear();
HttpContext.Current.Response.Redirect("/Home/Login",false);
我解決使用問題: Response.RedirectToRoute( 「CultureEnabled」,RouteData.Values); 而不是Response.Redirect。
使用 return RedirectPermanent(myUrl)
工作對我來說
確保不要將您的重定向部分之前使用Response
s'的方法,如Response.Flush();
。
您還可以使用下面提及的代碼
Response.Write("<script type='text/javascript'>"); Response.Write("window.location = '" + redirect url + "'</script>");Response.Flush();
有2種方法來解決這個問題:
後只需添加一個return
聲明您Response.Redirect(someUrl);
(如果方法簽名是不是「無效「,你將不得不返回該」類型「,當然) ,因爲如此:
Response.Redirect(」Logi n.aspx「);
return;
注意返回允許服務器沒有它執行重定向...,服務器需要繼續執行您的代碼的其餘部分...
Response.Redirect(someUrl)
LAST執行語句在拋出異常的方法中。名爲 「someUrl」 字符串變量替換您Response.Redirect(someUrl)
,並將其設置爲重定向位置...如下://......some code
string someUrl = String.Empty
.....一些邏輯
......更多代碼
//將您的Response.Redirect移動到這裏(方法結束):
Response.Redirect(someUrl);
return;
是的。使用ASP.NET MVC 4和異常過濾器等很容易發生這種情況。一旦發出重定向301/302,您也無法更改HTTP響應狀態代碼。 – Jaans 2013-07-04 11:56:50