5

まず第一に、私が正確に達成したいこと:特定の例外を HTTP 404 に変換して、ASP.NET がそれをさらに処理できるようにします

ASP.NET (MVC2) で次のように例外を処理しています。

    protected void Application_Error(object sender, EventArgs e) {
        var err = Server.GetLastError();
        if (err == null)
            return;
        err = err.GetBaseException();

        var noObject = err as ObjectNotFoundException;
        if (noObject != null)
            HandleObjectNotFound();

        var handled = noObject != null;
        if (!handled)
            Logger.Fatal("Unhandled exception has occured in application.", err);
    }

    private void HandleObjectNotFound() {
        Server.ClearError();
        Response.Clear();
        // new HttpExcepton(404, "Not Found"); // Throw or not to throw?
        Response.StatusCode = 404;
        Response.StatusDescription = "Not Found";
        Response.StatusDescription = "Not Found";
        Response.Write("The whole HTML body explaining whata 404 is??");
    }

問題は、デフォルトで動作するように設定できないcustomErrorsことです。その場合、 :onで指定されたページにリダイレクトされることはありません。customErrors<error statusCode="404" redirect="404.html"/>

私もハンドラーから発生させようとしましnew HttpExcepton(404, "Not Found")たが、応答コードは200理由がわかりません。

質問は次のとおりです。

  1. AnExceptionHTTP404応答に変換する適切な方法は何ですか?
  2. customErrorsApplication_Error で例外を処理するとき、セクションはどのように機能しますか?
  3. HttpException(404) をスローすると、(空白の) ページが成功 (200) ステータスでレンダリングされるのはなぜですか?

ありがとう、
ドミトリー。

4

1 に答える 1

2

簡単に言うと、Application_Error で手動で HTTP ステータスを設定すると、Server.ClearError() を呼び出すため、customErrors セクション ハンドラを使用できなくなります。

Application_Error の前に例外を処理するか、HttpException から例外を派生させます。

  • AnException を HTTP 404 応答に変換する適切な方法は何ですか?

Controller で例外を処理することをお勧めします。基本クラスのコントローラーを導入し、カスタムの HandleError 属性でほとんどの例外を処理できます。HttpException をスローすると、customErrors セクション ハンドラーによって適切に処理されます。

HttpException(404) から ObjectNotFoundException 例外を派生させることもできます。

Application_Error は、例外を処理する最後のチャンスです。それを処理するのは Response API だけです。ステータス コードを手動で設定して応答に書き込むか、カスタム エラー ページへのリダイレクトを手動でトリガーするか、Server.TransferRequest() を既存の html または aspx ファイル (コントローラー アクションではなく) に呼び出すことができます。現在のasp.netバージョンでは、Application_ErrorメソッドでServer.GetLastErrorを設定または変更することはできません。取得またはクリアするだけです。

  • Application_Error で例外を処理するとき、customErrors セクションはどのように機能しますか?

Server.ClearError() を呼び出すと、現在のリクエスト エラーも消去されるため、customErrors セクション ハンドラでは処理されません。

  • HttpException(404) をスローすると、(空白の) ページが成功 (200) ステータスでレンダリングされるのはなぜですか?

Application_Error メソッドで例外をスローしないでください。例外は、エラー処理が失敗したことを意味します。

于 2010-08-03T08:35:39.430 に答える