2008-10-01 44 views

回答

103

根據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"); 
+1

是的。使用ASP.NET MVC 4和異常過濾器等很容易發生這種情況。一旦發出重定向301/302,您也無法更改HTTP響應狀態代碼。 – Jaans 2013-07-04 11:56:50

7

只有HTTP消息中的第一行是「HTTP/1.x 3xx Redirect Reason」才能發生重定向。

如果您已經撥打了Response.Write()或設置了一些標題,重定向就太遲了。您可以嘗試在重定向之前撥打Response.Headers.Clear()以查看是否有幫助。

16

一旦您發送任何內容在所有客戶端,HTTP標頭已經發送。一個Response.Redirect()調用通過發送頭文件中的特殊信息,使瀏覽器請求不同的URL。

由於頭也都發出去,asp.net不能做你想要什麼(修改標題)

您可以通過一個解決這個問題),要麼做重定向你做任何事情之前,或b )在執行任何其他操作之前,請嘗試使用Response.Buffer = true,以確保在整個頁面執行完畢之前,不會向客戶端發送任何輸出。

0

重定向功能可能通過使用'刷新'http頭(也可能使用30X代碼)起作用。一旦標題已發送到客戶端,服務器就無法追加該重定向命令,這太遲了。

3

只需檢查是否已將緩衝選項設置爲false(默認情況下爲true)。對於Response.Redirect的工作,

  1. 緩衝應該是真實的,
  2. 使用的Response.Write超過默認的緩衝區大小(在這種情況下,將刷新本身造成頭給你不應該發送更多的數據被髮送),因此不允許你重定向。
1

對此有一個簡單的答案: 在發送標題之前,您已經輸出了其他內容,如文本或任何與頁面輸出相關的內容。這會影響你爲什麼得到這個錯誤。

只需檢查您的代碼是否可輸出,或者您可以將標題放在方法的頂部,以便首先發送。

0

如果您在發送標頭後嘗試重定向(例如,如果您正在從部分生成的頁面進行錯誤重定向),則可以發送一些客戶端Javascript(location.replace或location.href等等)重定向到你想要的任何URL。當然,這取決於已經發送了什麼HTML。

1

我的問題通過添加異常處理程序來處理 「無法在發送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");} 
0

如果您收到HTTP頭後發送無法重定向然後嘗試下面的代碼。

HttpContext.Current.Server.ClearError(); 
// Response.Headers.Clear(); 
HttpContext.Current.Response.Redirect("/Home/Login",false); 
1

我解決使用問題: Response.RedirectToRoute( 「CultureEnabled」,RouteData.Values); 而不是Response.Redirect。

2

使用 return RedirectPermanent(myUrl)工作對我來說

0

確保不要將您的重定向部分之前使用Response s'的方法,如Response.Flush();

0

您還可以使用下面提及的代碼

Response.Write("<script type='text/javascript'>"); Response.Write("window.location = '" + redirect url + "'</script>");Response.Flush(); 
-1

有2種方法來解決這個問題:

  1. 後只需添加一個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; 
    
    相關問題