31

Web API コントローラーを含む /api フォルダーを持つ MVC プロジェクトがあります。私は次のものが欲しいです:

  • エラーが発生したときにカスタム エラー ページを提供する MVC サイト
  • デフォルトのエラー応答を提供する Web API (例外とスタック トレースを含む json/xml)

私の MVC サイトの web.config には、httpErrors ノードがあり、errorMode を "Custom" に設定して、404s/500s/etc のときに適切なエラー ページを表示できるようにしています。MVC サイトの閲覧中に発生します。

<httpErrors errorMode="Custom" existingResponse="Replace">
  <remove statusCode="404" subStatusCode="-1" />
  <remove statusCode="500" subStatusCode="-1" />
  <remove statusCode="403" subStatusCode="-1" />
  <error prefixLanguageFilePath="" statusCode="404" path="Content\notfound.htm" responseMode="File" />
  <error statusCode="500" path="/Errors" responseMode="ExecuteURL" />
  <error statusCode="403" path="/Errors/Http403" responseMode="ExecuteURL" /></httpErrors>

ただし、その構成では、API はエラーが発生したときに、例外/スタック トレースを含む json/xml ではなく、カスタム エラー ページを提供します (これは望ましい動作です)。

Web API ではなく、MVC サイトにのみ適用されるようにカスタム エラーを構成する方法はありますか? このブログには存在しないと書かれていますが ( http://blog.krisandyson.com/2012/11/iis-httperrors-aspnet-web-api-fully.html )、他の誰かが作品を見つけたかどうかを知りたいです。そのブログが公開されて以来。

ない場合は、Web API プロジェクト用に別のプロジェクト/アセンブリを作成できると思います。これにより、MVC と Web API の httpErrors を個別に構成できますが、別のプロジェクトを作成したくないので、さらに別の web.config を構成する必要があります。

4

3 に答える 3

72

さて、この質問を1年近くマリネさせた後、もう一度試してみました. 私が欲しかったものを手に入れたweb.configマジックは次のとおりです。

<!-- inside of <configuration> to allow error
    responses from requests to /api through -->
<location path="api">
    <system.webServer>
      <validation validateIntegratedModeConfiguration="false" />
      <httpErrors errorMode="DetailedLocalOnly" existingResponse="PassThrough" >
        <clear/>
      </httpErrors>
    </system.webServer>
</location>

<!-- original httpErrors, inside of <location path="." inheritInChildApplications="false">
 to serve custom error pages when the MVC site returns an error code -->
<httpErrors errorMode="Custom" existingResponse="Replace">
      <remove statusCode="400" subStatusCode="-1" />
      <remove statusCode="404" subStatusCode="-1" />
      <remove statusCode="500" subStatusCode="-1" />
      <remove statusCode="403" subStatusCode="-1" />
      <error statusCode="400" prefixLanguageFilePath="" path="Content\notfound.htm" responseMode="File"/>
      <error prefixLanguageFilePath="" statusCode="404" path="Content\notfound.htm" responseMode="File" />
      <error statusCode="500" path="/errors" responseMode="ExecuteURL" />
      <error statusCode="403" path="/errors/http403" responseMode="ExecuteURL" />
    </httpErrors>

ここで何が起こっているかの核心は、<location>ノードを使用すると、特定性の低いパスで行われた設定を上書きできることです。そのため、path="." に errorMode="Custom" を指定していますが、Web API のパスを<location path="api">ノードでオーバーライドし、その中の httpErrors 構成をオーバーライドします。

以前にノードを見たことがありましたが、これが彼らの目的であるとは今まで気づきませんでした。この記事では、IIS/.NET の構成継承モデルについて詳しく説明しています。これは非常に有益であることがわかりました。 -web-config-inheritance-and-overrides

于 2014-08-28T18:40:21.733 に答える
1

私はこれをテストしていませんが、ここに示すように、MVC アプリケーション エラーを処理するコードを記述してみてはいかがでしょうかhttp://thirteendaysaweek.com/2012/09/25/custom-error-page-with-asp-net-mvc- 4 / ?

彼のコードは、アプリケーション レベル (Global.asax) でこれを行っていることを示していますが、MVC 用のメソッドと Web API 用の別のメソッドを使用して、同じ方法でより低いレベルで例外をトラップすることもできると思います。

于 2013-09-22T16:32:06.453 に答える