我有一个带有/ api文件夹的MVC项目,其中包含我的Web API控制器。我想要以下事项:
在我的MVC站点的web.config中,我有一个httpErrors节点,并将errorMode设置为“Custom”,这样我可以在404s / 500s /等时拥有漂亮的错误页面。在浏览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(这是所需的行为)。
有没有办法将自定义错误配置为仅应用于我的MVC站点而不是Web API?这篇博客说没有(http://blog.kristandyson.com/2012/11/iis-httperrors-aspnet-web-api-fully.html),但我想听听自从该博客发布以来是否有其他人找到了解决方法。
我想如果没有,我可以为我的Web API项目创建一个单独的项目/程序集。这将允许我分别为MVC和Web API配置httpErrors,但我不想创建另一个项目,因此我还有另一个web.config要配置。
答案 0 :(得分:62)
好吧,经过将近一年的问题腌制后,我又给了它一个机会。这是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”,但我们会覆盖使用<location path="api">
节点的Web API路径以及其中的httpErrors配置。
之前我曾见过节点,但直到现在我才知道这是他们的目的。本文详细介绍了IIS / .NET的配置继承模型,我发现它非常有用:http://weblogs.asp.net/jongalloway/10-things-asp-net-developers-should-know-about-web-config-inheritance-and-overrides
答案 1 :(得分:1)
我没有对此进行测试,但如何编写代码来处理MVC应用程序错误,如此处所示http://thirteendaysaweek.com/2012/09/25/custom-error-page-with-asp-net-mvc-4 /?
他的代码显示他正在应用程序级别(Global.asax)执行此操作,但我想您也可以以相同的方式在较低级别捕获异常,其中一种方法用于MVC,另一种方法用于Web API。
答案 2 :(得分:0)
对我有用的东西
<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”就可以了。