我花了一整天时间尝试为HTTP错误实现自定义处理程序。 我正在使用MVC 5和IIS 7.有很多好的建议HERE。由于我不仅需要注意404,我还是尝试了THIS选项。
最终我需要能够处理所有这些案件
应该能够处理所有不匹配的路线 本地主机/ 404_test /测试/检验/测试/检验/23分之12
应该能够处理HTTP 500 从动作中抛出异常
应该能够处理例如400的所有html错误。 本地主机/ 404_test / DDSA
应该能够处理“像url这样的文件扩展名” 本地主机/ 404_test / test.cdd
使用提供的链接中的代码也通过更新web.config,如下所示我能够处理除“文件扩展名如url”之外的所有情况。我收到空白页。看起来IIS正在覆盖响应。在添加
之前,对于不匹配的路线来说是一样的<httpErrors errorMode="Custom" existingResponse="PassThrough" >
以下是不匹配案例的路线图:
routes.MapRoute("NotFound", "{*url}",
new { controller = "Error", action = "NotFound" });
有任何建议如何实施?我看到stackoverflow.com完全按照我想要的方式工作,但我不知道它是如何实现的。
Web.config
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
<httpErrors errorMode="Custom" existingResponse="PassThrough" >
<remove statusCode="404" subStatusCode="-1" />
<error statusCode="404" subStatusCode="-1" responseMode="ExecuteURL" path="/Error/NotFound" />
<remove statusCode="500" subStatusCode="-1" />
<error statusCode="500" subStatusCode="-1" responseMode="ExecuteURL" path="/Error/ServerError" />
</httpErrors>
</system.webServer>
答案 0 :(得分:0)
这是我之前在MVC3应用程序中实现的解决方案,所以它是不久前的。它应该处理任何无效的URL以及从应用程序抛出的未处理的异常。您应该能够将此与上面链接中的代码结合使用,以处理其他40x错误。 此代码在www.carbsandcals.com上运行。
在web.config中:
<httpErrors errorMode="Custom" existingResponse="Replace">
<remove statusCode="500" subStatusCode="-1" />
<remove statusCode="404" subStatusCode="-1" />
<remove statusCode="400" subStatusCode="-1" />
<error statusCode="400" prefixLanguageFilePath="" path="/Error/Error/400" responseMode="ExecuteURL" />
<error statusCode="404" prefixLanguageFilePath="" path="/Error/Error/404" responseMode="ExecuteURL" />
<error statusCode="500" prefixLanguageFilePath="" path="/Error/Error/500" responseMode="ExecuteURL" />
</httpErrors>
在Global.asax中,处理&#34;查看未找到&#34; MVC视图引擎抛出的错误:
protected void Application_Error()
{
Exception ex = Server.GetLastError();
bool handleError = false;
int errorCode = 500;
if (handleError = (ex is InvalidOperationException && ex.Message.Contains("or its master was not found or no view engine supports the searched locations. The following locations were searched")))
{
errorCode = 404;
}
else if (handleError = ex is HttpException)
{
errorCode = ((HttpException)ex).GetHttpCode();
}
if (handleError)
{
Server.ClearError();
Server.TransferRequest("/error/error/" + errorCode);
}
}
我不希望不必测试错误消息内容,但我找不到更好的方法来区分此错误与其他InvalidOperationExceptions。
警告:虽然这会处理HttpRequestValidationException
错误,但错误页面的处理可能会抛出相同类型的更多异常(因为URL仍然无效)。我注意到了Html.RenderPartial
和ASCX,以及与SiteMap
的互动。在这种情况下,重定向到简单视图或静态页面可能更好。
错误控制器设置Response.StatusCode
,以便将正确的HTTP代码发送回客户端。