HTTPヘッダーが送信された後にリダイレクトできないのはなぜですか? Response.Redirect()を呼び出すとき?

StackOverflow https://stackoverflow.com/questions/159523

質問

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が機能するには、

  1. バッファリングは真でなければなりません
  2. 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つの方法があります:

  1. Response.Redirect(someUrl); の後に return ステートメントを追加するだけです (メソッドの署名が&quot; void&quot;でない場合、もちろん&quot; type&quot;を返す必要があります) そうです:

    Response.Redirect(&quot; Login.aspx&quot;);

    return;

リターンにより、サーバーはリダイレクトを実行できます...リダイレクトなしで、サーバーは残りのコードの実行を継続したい...

  1. 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; 
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top