HTTPヘッダーが送信された後にリダイレクトできないのはなぜですか? Response.Redirect()を呼び出すとき?
-
03-07-2019 - |
質問
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が機能するには、
- バッファリングは真でなければなりません
- response.writeを使用してデフォルトのバッファサイズを超えるデータを送信しないでください(この場合、それ自体がフラッシュされ、ヘッダーが送信されます)。したがって、リダイレクトは許可されません。
使用
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&quot ;, RouteData.Values); Response.Redirectの代わりに。
リダイレクト機能は、おそらく「refresh」httpヘッダーを使用して(おそらく30Xコードも使用して)機能します。ヘッダーがクライアントに送信されると、サーバーがそのリダイレクトコマンドを追加する方法はありません。遅すぎます。
HTTPヘッダーが送信された後にリダイレクトできない場合は、以下のコードを試してください。
HttpContext.Current.Server.ClearError();
// Response.Headers.Clear();
HttpContext.Current.Response.Redirect("/Home/Login",false);
リダイレクト部分の前に、 Response.Flush();
などの Response
sのメソッドを使用しないようにしてください。
以下のコードも使用できます
Response.Write("<script type='text/javascript'>"); Response.Write("window.location = '" + redirect url + "'</script>");Response.Flush();
エラー
HTTPヘッダーが送信された後はリダイレクトできません。
System.Web.HttpException(0x80004005):HTTPヘッダーの送信後にリダイレクトできません。
提案
asp.net mvcを使用し、同じコントローラーで作業し、異なるアクションにリダイレクトする場合は、記述する必要はありません。
Response.Redirect(&quot; ActionName&quot;、&quot; ControllerName&quot;);
return RedirectToAction(&quot; ActionName&quot;);
または
return View(&quot; ViewName&quot;);
これを修正するには2つの方法があります:
-
Response.Redirect(someUrl);
の後にreturn
ステートメントを追加するだけです (メソッドの署名が&quot; void&quot;でない場合、もちろん&quot; type&quot;を返す必要があります) そうです:Response.Redirect(&quot; Login.aspx&quot;);
return;
リターンにより、サーバーはリダイレクトを実行できます...リダイレクトなしで、サーバーは残りのコードの実行を継続したい...
- Response.Redirect(someUrl)を、例外をスローしているメソッド内で最後に実行されたステートメントにします。
Response.Redirect(someUrl)
を&quot; someUrl&quot;という名前の文字列VARIABLEに置き換え、次のようにリダイレクト先に設定します:
// ......一部のコード
string someUrl = String.Empty
.....いくつかのロジック
if (x=y)
{
// comment (original location of Response.Redirect("Login.aspx");)
someUrl = "Login.aspx";
}
......その他のコード
//応答を移動します。ここにリダイレクトします(メソッドの最後):
Response.Redirect(someUrl);
return;