web-dev-qa-db-ja.com

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

Response.Redirect(someUrl)を呼び出すと、HttpExceptionが表示されます:「HTTPヘッダーが送信された後、リダイレクトできません」。

なぜこれを取得するのですか?そして、どうすればこの問題を修正できますか?

81
Samuel Meacham

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");
116
Samuel Meacham

クライアントにコンテンツを送信すると、HTTPヘッダーは既に送信されています。 Response.Redirect()呼び出しは、ブラウザーに別のURLを要求させる特別な情報をヘッダーで送信することにより機能します。

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

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

17
Philip Rieck

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

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

8
Mark Cidade

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

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

return RedirectPermanent(myUrl)の使用は私のために働いた

2
Vasilis

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

コードの出力を確認するか、ヘッダーをメソッドの先頭に配置して、最初に送信されるようにします。

1
DucDigital

ヘッダーが送信された後でリダイレクトしようとしている場合(たとえば、部分的に生成されたページからエラーリダイレクトを実行している場合)、クライアントJavascript(location.replaceまたはlocation.hrefなど)を送信できます。任意のURLにリダイレクトします。もちろん、それはすでに送信されているHTMLに依存します。

1
Brad

「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
SamsonOnNet

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

1
utilsit

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

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

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

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

提案

asp.net mvcを使用し、同じコントローラーで作業し、異なるアクションにリダイレクトする場合は、記述する必要はありません。
Response.Redirect( "ActionName"、 "ControllerName");
使用のみの方が良い
return RedirectToAction( "ActionName");
または
return View( "ViewName");

0
Ram Samuj

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

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

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

0
Nathan

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

0
1_bug