呼び出すResponse.Redirect(someUrl)
と、次のHttpExceptionが発生します。
HTTPヘッダーが送信された後はリダイレクトできません。
なぜ私はこれを手に入れるのですか?そして、どうすればこの問題を修正できますか?
呼び出すResponse.Redirect(someUrl)
と、次のHttpExceptionが発生します。
HTTPヘッダーが送信された後はリダイレクトできません。
なぜ私はこれを手に入れるのですか?そして、どうすればこの問題を修正できますか?
回答:
のMSDNドキュメントによると、Response.Redirect(string url)
「HTTPヘッダーが送信された後にリダイレクトが試行された」場合、HttpExceptionがスローされます。以来Response.Redirect(string url)
使用するHTTP「場所」レスポンスヘッダ(http://en.wikipedia.org/wiki/HTTP_headers#Responses)、それを呼び出すと、ヘッダーがクライアントに送信されることになります。つまり、もう一度呼び出す場合、またはヘッダーを他の方法で送信した後に呼び出すと、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");
endResponse
)をtrueに設定してリダイレクトを呼び出すことと同じです。"
Response.IsRequestBeingRedirected
はfalseであり、これと同じ例外が発生します(Application_EndRequest
Global.asaxのイベントメソッド内)。理由がわかりません。
クライアントにコンテンツを送信すると、HTTPヘッダーはすでに送信されています。AResponse.Redirect()
コールは、ブラウザが異なるURLをお願いしますヘッダに特別な情報を送信することで動作します。
ヘッダーはすでに送信されているため、asp.netは必要な処理を実行できません(ヘッダーを変更します)
これを回避するには、a)何かを行う前にリダイレクトを実行するか、b)Response.Buffer = true
他のことを行う前に使用して、ページ全体の実行が完了するまで出力がクライアントに送信されないようにします。
リダイレクトは、HTTPメッセージの最初の行が「HTTP/1.x 3xx Redirect Reason
」である場合にのみ発生します。
すでにResponse.Write()
いくつかのヘッダーを呼び出したり設定したりしている場合は、リダイレクトするには遅すぎます。Response.Headers.Clear()
リダイレクトの前に電話をかけて、それが役立つかどうかを確認できます。
return RedirectToAction("Logout", "Authentication");
と、そのエラーが発生します
バッファリングオプションをfalse(デフォルトではtrue)に設定しているかどうかを確認してください。response.redirect to workの場合、
Response.BufferOutput = true;
アクションで、コントローラーで?
下記のコードを使用することもできます
Response.Write("<script type='text/javascript'>"); Response.Write("window.location = '" + redirect url + "'</script>");Response.Flush();
これに対する簡単な答えが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");}
エラー
HTTPヘッダーが送信された後はリダイレクトできません。
System.Web.HttpException(0x80004005):HTTPヘッダーが送信された後にリダイレクトできません。
提案
asp.netmvcを使用し、同じコントローラーで作業して別のアクションにリダイレクトする場合は、書き込む必要はありません。Response.Redirect
( "ActionName"、 "ControllerName"); RedirectToAction( "ActionName");
のみを
返す方が良いです。
または
View( "ViewName");を返します。
HTTPヘッダーが送信された後にリダイレクトできない場合は、以下のコードを試してください。
HttpContext.Current.Server.ClearError();
// Response.Headers.Clear();
HttpContext.Current.Response.Redirect("/Home/Login",false);
これを修正する方法は2つあります。
return
後にステートメントを追加するだけですResponse.Redirect(someUrl);
(メソッドシグネチャが「void」でない場合は、もちろん、その「タイプ」を返す必要があります)。
Response.Redirect( "Login.aspx");
戻る;
リターンにより、サーバーはリダイレクトを実行できることに注意してください...リダイレクトがないと、サーバーは残りのコードの実行を継続したいと考えます...
Response.Redirect(someUrl)
LASTが例外をスローしている方法でステートメントを実行します。をResponse.Redirect(someUrl)
「someUrl」という名前の文字列VARIABLEに置き換え、次のようにリダイレクト場所に設定します。//......some code
string someUrl = String.Empty
.....いくつかのロジック
if (x=y)
{
// comment (original location of Response.Redirect("Login.aspx");)
someUrl = "Login.aspx";
}
......その他のコード
// Response.Redirectをここ(メソッドの終わり)に移動します:
Response.Redirect(someUrl);
return;
return
は(voidを返すメソッドで)何をすべきですか?return
唯一の方法が完了したことを定義しています。しかし、コードが残っていない場合、メソッドはとにかく完了します。そして、URLを変数に格納しても何も変わりません。つまり、なぜそれが必要なのですか?文字列は同じです。コンパイルされたものは、文字列と文字列を含む変数の間に違いはありません...:考えてみてくださいx = 5
。したがって、xは5ですが、5も5です。10/ 2でも5になります...どちらも違いはありません