Response.Redirect(someUrl)
を呼び出すと、HttpExceptionが表示されます:「HTTPヘッダーが送信された後、リダイレクトできません」。
なぜこれを取得するのですか?そして、どうすればこの問題を修正できますか?
Response.Redirect(string url)
のMSDNドキュメントによると、「HTTPヘッダーが送信された後にリダイレクトが試行される」と、HttpExceptionがスローされます。 Response.Redirect(string url)
はHttp "Location"応答ヘッダー( http://en.wikipedia.org/wiki/HTTP_headers#Responses )を使用するため、これを呼び出すとヘッダーが送信されますクライアントに。これは、2回目に呼び出した場合、または他の方法でヘッダーを送信した後に呼び出した場合、HttpExceptionが発生することを意味します。
Response.Redirect()を複数回呼び出さないようにする1つの方法は、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ヘッダーは既に送信されています。 Response.Redirect()
呼び出しは、ブラウザーに別のURLを要求させる特別な情報をヘッダーで送信することにより機能します。
ヘッダーは既に送信されているため、asp.netは必要な処理を実行できません(ヘッダーを変更します)
これを回避するには、a)他の操作を行う前にリダイレクトを行うか、b)Response.Buffer = true
何かを行う前に、ページ全体の実行が完了するまで出力がクライアントに送信されないようにします。
リダイレクトは、HTTPメッセージの最初の行が「_HTTP/1.x 3xx Redirect Reason
_」の場合にのみ発生します。
すでにResponse.Write()
を呼び出しているか、ヘッダーを設定している場合、リダイレクトするには遅すぎます。リダイレクトの前にResponse.Headers.Clear()
を呼び出して、それが役立つかどうかを確認できます。
バッファリングオプションをfalse(デフォルトではtrue)に設定しているかどうかを確認してください。 response.redirectが機能するには、
return RedirectPermanent(myUrl)
の使用は私のために働いた
これに対する簡単な答えが1つあります。ヘッダーなどを送信する前に、テキストなど、ページからの出力に関連するものなど、他の何かが出力されています。これは、そのエラーが発生する理由に影響します。
コードの出力を確認するか、ヘッダーをメソッドの先頭に配置して、最初に送信されるようにします。
ヘッダーが送信された後でリダイレクトしようとしている場合(たとえば、部分的に生成されたページからエラーリダイレクトを実行している場合)、クライアント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");}
Response.RedirectToRoute( "CultureEnabled"、RouteData.Values);を使用して問題を解決しました。 Response.Redirectの代わりに。
HTTPヘッダーが送信された後にリダイレクトできない場合は、以下のコードを試してください。
HttpContext.Current.Server.ClearError();
// Response.Headers.Clear();
HttpContext.Current.Response.Redirect("/Home/Login",false);
エラー HTTPヘッダーが送信された後、リダイレクトできません。
System.Web.HttpException(0x80004005):HTTPヘッダーの送信後にリダイレクトできません。
提案
asp.net mvcを使用し、同じコントローラーで作業し、異なるアクションにリダイレクトする場合は、記述する必要はありません。
Response.Redirect( "ActionName"、 "ControllerName");
使用のみの方が良い
return RedirectToAction( "ActionName");
または
return View( "ViewName");
以下のコードを使用することもできます
Response.Write("<script type='text/javascript'>"); Response.Write("window.location = '" + redirect url + "'</script>");Response.Flush();
リダイレクト機能は、おそらく「refresh」httpヘッダーを使用して(おそらく30Xコードも使用して)機能します。ヘッダーがクライアントに送信されると、サーバーがそのリダイレクトコマンドを追加する方法はありません。遅すぎます。
リダイレクト部分の前に、Response.Flush();
のようなResponse
s 'メソッドを使用しないでください。