web-dev-qa-db-ja.com

MVCサイトでカスタムエラーページを使用することはできますが、Web APIを使用することはできませんか?

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

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

MVCサイトのweb.configに、httpErrorsノードがあり、errorModeを "Custom"に設定して、404s/500s/etcのときにNiceエラーページを表示できるようにしました。 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.kristandyson.com/2012/11/iis-httperrors-aspnet-web-api-fully.html )とありますが、聞きたいですそのブログが公開されてから他の誰かが回避策を見つけた場合。

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

30
BenWillkommen

さて、この質問をマリネさせてからほぼ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"がありますが、WebAPIのパスのそれを<location path="api">ノードとその中のhttpErrors構成でオーバーライドします。

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

66
BenWillkommen

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

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

1
BernardG

私のために働いたこと:

<httpErrors existingResponse="Auto" defaultResponseMode="Redirect" errorMode="Custom">
  <remove statusCode="403" subStatusCode="-1" />
  <error statusCode="403" subStatusCode="-1" responseMode="Redirect" path="<!--path here-->" />
  <remove statusCode="404" subStatusCode="-1" />
  <error statusCode="404" subStatusCode="-1" responseMode="Redirect" path="<!--path here-->" />
  <remove statusCode="500" subStatusCode="-1" />
  <error statusCode="500" subStatusCode="-1" responseMode="Redirect" path="<!--path here-->" />
</httpErrors>

既存のResponse = "Auto"を設定するだけでうまくいくようです。

0
alex kostin