Response.Redirect()を呼び出すと、「HTTPヘッダーが送信された後にリダイレクトできません」というメッセージが表示されるのはなぜですか?


回答:


120

の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");

2
うん、正確に。これは、ASP.NET MVC 4や例外フィルターなどで非常に簡単に発生します。リダイレクト301/302が発行された後は、HTTP応答ステータスコードを変更することもできません。
Jaans 2013

私は自分のページのすべてのプロパティを「静的」にすることで問題を解決しました
Sal

4
プロパティを静的にすることは危険な解決策です
プロスペクター

(最初からの)ThreadAbortExceptionがキャッチされない限り、リダイレクトを2回呼び出すにはどうすればよいですか?:} "リダイレクトを呼び出すことは、2番目のパラメーター(endResponse)をtrueに設定してリダイレクトを呼び出すことと同じです。"
user2864740 2015年

1
奇妙なことですが、従来のWebフォームアプリケーションでResponse.IsRequestBeingRedirectedはfalseであり、これと同じ例外が発生します(Application_EndRequestGlobal.asaxのイベントメソッド内)。理由がわかりません。
アリソン2018

17

クライアントにコンテンツを送信すると、HTTPヘッダーはすでに送信されています。AResponse.Redirect()コールは、ブラウザが異なるURLをお願いしますヘッダに特別な情報を送信することで動作します。

ヘッダーはすでに送信されているため、asp.netは必要な処理を実行できません(ヘッダーを変更します)

これを回避するには、a)何かを行う前にリダイレクトを実行するか、b)Response.Buffer = true他のことを行う前に使用して、ページ全体の実行が完了するまで出力がクライアントに送信されないようにします。


私にとってはうまくいきません。.NET、MVCを使用しており、コントローラーのメソッド内で呼び出しがあります。リダイレクトは発生しますが、それでも例外が発生します。
FrenkyB

8

リダイレクトは、HTTPメッセージの最初の行が「HTTP/1.x 3xx Redirect Reason」である場合にのみ発生します。

すでにResponse.Write()いくつかのヘッダーを呼び出したり設定したりしている場合は、リダイレクトするには遅すぎます。Response.Headers.Clear()リダイレクトの前に電話をかけて、それが役立つかどうかを確認できます。


使用するreturn RedirectToAction("Logout", "Authentication");と、そのエラーが発生します
Kiquenet 2018

ヘッダーをクリアしようとすると、System.PlatformNotSupportedExceptionが発生しました。この操作にはIIS統合パイプラインモードが必要です。
IrishChieftain

3

バッファリングオプションをfalse(デフォルトではtrue)に設定しているかどうかを確認してください。response.redirect to workの場合、

  1. バッファリングは真でなければなりません、
  2. デフォルトのバッファサイズを超えるresponse.writeを使用してそれ以上のデータを送信するべきではありませんでした(この場合、それ自体がフラッシュされてヘッダーが送信されます)。したがって、リダイレクトできません。

1
Response.BufferOutput = true;アクションで、コントローラーで?
キケネット


2

下記のコードを使用することもできます

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

1

これに対する簡単な答えが1つあります。ヘッダーを送信する前に、テキストなど、ページからの出力に関連する何かが出力されています。これは、そのエラーが発生する理由に影響します。

コードで可能な出力を確認するか、メソッドの上にヘッダーを配置して、最初に送信されるようにすることができます。


1

ヘッダーが送信された後にリダイレクトしようとしている場合(たとえば、部分的に生成されたページからエラーリダイレクトを実行している場合)、クライアント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");}

1

私は次を使用して問題を解決しました:Response.RedirectToRoute( "CultureEnabled"、RouteData.Values); Response.Redirectの代わりに。


1

エラー HTTPヘッダーが送信された後はリダイレクトできません。

System.Web.HttpException(0x80004005):HTTPヘッダーが送信された後にリダイレクトできません。

提案

asp.netmvcを使用し、同じコントローラーで作業して別のアクションにリダイレクトする場合は、書き込む必要はありません。Response.Redirect
( "ActionName"、 "ControllerName"); RedirectToAction( "ActionName");
のみを
返す方が良いです。
または
View( "ViewName");を返します。


別のControllerNameのActionNameを使用していますか?
キケネット

0

リダイレクト機能は、おそらく「refresh」httpヘッダーを使用して機能します(おそらく30Xコードも使用します)。ヘッダーがクライアントに送信されると、サーバーがそのリダイレクトコマンドを追加する方法はありません。遅すぎます。


0

HTTPヘッダーが送信された後にリダイレクトできない場合は、以下のコードを試してください。

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

0

リダイレクト部分の前のResponseようResponse.Flush();にsのメソッドを使用しないように注意してください。


-3

これを修正する方法は2つあります。

  1. return後にステートメントを追加するだけですResponse.Redirect(someUrl); (メソッドシグネチャが「void」でない場合は、もちろん、その「タイプ」を返す必要があります)。

    Response.Redirect( "Login.aspx");

    戻る;

リターンにより、サーバーはリダイレクトを実行できることに注意してください...リダイレクトがないと、サーバーは残りのコードの実行を継続したいと考えます...

  1. あなたの作る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になります...どちらも違いはありません
マティアスバーガー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.