16

asp.net mvc アプリケーションがあり、IISExpress で動作するカスタム エラーを取得しようとしています。

カジノでうまく動作します:

<customErrors mode="On" defaultRedirect="/error">
  <error statusCode="404" redirect="/error/notfound"/>
</customErrors>

以前に mvc サイトを IIS (7.5) にデプロイしたことがある場合、カスタム エラーを機能させるには、次のように設定するだけで済みました。

<httpErrors errorMode="Detailed"/>

httpErrors セクション内でステータス コードを明示的に指定しようとしましたが、何も機能しません。次に例を示します。

<httpErrors errorMode="Detailed" defaultResponseMode="Redirect">
  <clear/>
  <error statusCode="404" path="/error/notfound"/>
</httpErrors>

何か案は?

ありがとうベン

4

2 に答える 2

14

これは、カスタム エラーが実際にどのように呼び出されるかについての私の誤解と、(IMHO) asp.net mvc でのエラーの処理が少し混乱しているという事実が原因の 1 つです。

最初の問題は、多くのアクション メソッドで、ブログ投稿などのオブジェクトの存在を確認し、ブログ投稿が null の場合は HttpNotFoundResult を返すことでした。これにより、404 エラー用に設定したカスタム エラー ページが表示されると想定していました。

しかし、そうではありません。HttpNotFoundResult を返すと、単に応答のステータス コードが 404 に設定されます。残りは IIS によって処理され、IIS 404 エラー ページが表示されます。独自のカスタム エラー ページがある場合はブラウザによって処理されます。

ここでの 1 つの解決策は、リクエストが asp.net によって処理されるため、カスタム エラー ページ使用する HttpException を返すことです。

代わりに、http ステータス コードと共にビューを指定できる新しい ActionResult を作成することにしました。私は例外をスローするよりもこれを好みました。

次の問題は、デフォルトで新しい MVC プロジェクトに貪欲なルートが定義されていることです。/foo/barデフォルトの MvcHandler にリクエストを行うと、 というコントローラーが検索されFooます。見つからない場合は 404 を返します。

デフォルト ルートを削除し、貪欲なルートはありませんでした。これは、どのルートにも一致しない URL が asp.net によって処理されず、IIS にフォールバックすることを意味していました。

ここでの解決策は、ルーティング構成の下部にワイルドカード ルートを作成して、他のすべての要求と一致させ、ステータス コードを 404 に設定し、カスタム ビューを表示するカスタム PageNotFound アクションに転送することでした。

指摘する価値のあるいくつかのこと。

  1. httpErrors errorMode="Detailed"カスタム エラー ページが IIS/IISExpress に表示されるように設定する必要があります。ただし、残りはそのままにしておくことができます。
  2. defaultRedirectセクションにパスを設定しcustomErrorsても、500 エラーには影響しません。これは、グローバルHandleErrorAttributeが 500 個のエラーすべてを処理し、表示する「エラー」というビューを探すだけだからです。これは、カスタム エラー ページが実際にコントローラー アクションである場合、呼び出されないことを意味します。上記は、明示的に 500 エラー ページを指定した場合でも当てはまります。
  3. ただし、明示的に指定されていない場合は他のステータス コードに使用されるため、defaultRedirect パスはそのままにしておく必要があります。
于 2011-06-10T23:05:36.123 に答える