12

<customErrors>ASP.NET のディレクティブを使用して一般的なエラー ページを使用しています。

<customErrors mode="On" defaultRedirect="500.html" redirectMode="ResponseRewrite">
</customErrors>

問題 - エラーが発生した場合、このページは HTTP ステータス「500」を返しません。それは 200 です。したがって、リンク チェッカーとスパイダーは問題があることを認識しません。

静的な 500.html ページと一緒に 500 HTTP ステータスを送信するにはどうすればよいですか?

要件:

  • redirectMode="ResponseRewrite" を使用する必要があります
  • 動的ページは使用できず、静的 .html のみを使用できます。
4

6 に答える 6

8

customErrors要素のMSDNドキュメントには、System.Web.Configuration.CustomErrorsSectionによって実装されると記載されています。RedGateの.NETReflectorを使用してそのクラスを分析すると、その設定がフレームワークのどこで使用されているかを確認できます。

これは、System.Web.UI.Page.HandleErrorおよびSystem.Web.HttpResponse.ReportRuntimeErrorによって使用されます。

これらは両方とも、System.Web.HttpResponse.RedirectToErrorPageを呼び出すことになります。(このメソッドの名前は紛らわしいです。RedirectToErrorPageはredirectMode設定をパラメーターとして受け取るため、ResponseRewriteを使用していて、実際にはリダイレクトが発生しない場合でも呼び出されることに注意してください。)

RedirectToErrorPageメソッドの関連部分は次のとおりです。

    if (redirectMode == CustomErrorsRedirectMode.ResponseRewrite)
    {
        this.Context.Server.Execute(url);
    }

エラー処理で応答コードを設定する方法はないようです。結局のところ、それは単なるServer.Executeです。したがって、必要なHTTP応答を実現するためのコードを作成する必要があることは避けられないようです。

プレーンな.htmlファイルを使用する理由を再検討できますか?別のエラーが発生する可能性がある場合に.aspxページのオーバーヘッドをすべて処理したくないため、これはエラー処理の賢明な選択のようです。

しかし、おそらく.htmlファイルと同じくらい堅牢な中間点があるのでしょうか。

たとえば、プリコンパイルされたHttpHandlerを作成し、それをURL /500.errorに登録してから、500.errorをdefaultRedirectページにすることができます。(これは、ScriptResource.axdの動作と似ています。)モジュールをDLLにプリコンパイルすると(単純な古い.axdファイルからのオンザフライコンパイルとは対照的に)、同じように堅牢であることがわかります。エラー状態の顔。これでも機能しないエラーが発生した場合は、静的な.htmlファイルも機能しない可能性があります。customErrorsディレクティブは引き続き内部で実行されている.NETに依存し、StaticFileHandlerを使用してサービスを提供することに注意してください。 .htmlファイル。

または、IISアプリケーションの前にリバースプロキシを配置して、アプリケーションプールの壊滅的な障害が発生した場合でも、フレンドリーな500ページを提供することを検討できます。これは設定に手間がかかりますが、customErrorsよりもさらに堅牢になります。たとえば、web.configが破損した場合、customErrorsでさえ機能しなくなります。

于 2010-08-27T08:56:18.220 に答える
4

gllobal.asax ファイルに次のコードを追加します。

protected void Application_EndRequest(object sender, EventArgs e)
    {
        if (Request.Url.AbsolutePath.EndsWith("500.html"))
            Response.StatusCode = 500;
    }
于 2010-08-21T06:54:01.907 に答える
3

OK、解決策があります。これを機能させる唯一の方法は、Web 構成ファイルのカスタム エラー セクションをバイパスすることです。

したがって、例 default.aspx

public partial class Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        throw new Exception("boom");
    }
}

次に、global.asax ファイルで次のようにします。

protected void Application_Error(object sender, EventArgs e)
{
    // Clear the error to take control of process
    Server.ClearError();

    Response.WriteFile(Server.MapPath("500.html"));
    Response.StatusCode = 500;
    Response.StatusDescription = "Internal Server Error";
}

おそらく 500.html 部分のより良い処理メカニズムを書くことができます - これはあなたが達成しようとしていることを行うべきだと思います。

VS Cassini Web サーバーでのみテストされていますが、これが iis6 で機能しない理由はわかりません。

于 2010-08-24T20:11:09.883 に答える
1

次のようにカスタム エラー セクションを構成してみてください。

<customErrors mode="On" redirectMode="ResponseRewrite">
  <error statusCode="500" redirect="500.aspx">
</customErrors>

500.aspx ファイルで、page_load の応答コードを変更します。

Response.StatusCode = 500;
Response.StatusDescription = "Internal Server Error";
于 2010-08-19T20:17:28.903 に答える
0

これは、isapi フィルターを使用して行うことができます。これは c で書かなければなりませんが、.html リクエストの応答ステータスを変更して、ブラウザがカスタム html ページで 500 を取得できるようにします。

于 2010-08-27T17:01:43.367 に答える
-1

コア HTTP シグナリングの変更を主張する場合は、いくつかの要求に屈するか、独自の Web サーバーを作成する準備をする必要があります。はい、IIS7統合AppPoolを実行する必要がありますが、サーバーがダウンしていることを偽装しようとしており、サーバーが自殺を偽造するように設計されていないため、リダイレクトとアクティブなページを受け入れる必要がある場合があります。したがって、それを行うためのスリムな方法が1つある場合、オプションは、感謝を言うか、応答コードを自由にスクランブルする独自の非HTTP準拠サーバーを開発することです.

于 2010-08-26T13:46:41.150 に答える