处理404,403,500 http代码在ASP.asp.net MVC 5
本文关键字:asp ASP net MVC 代码 http 处理 | 更新日期: 2023-09-27 17:49:45
我花了一整天的时间来尝试实现HTTP错误的自定义处理程序。我使用MVC 5和IIS 7。这里有很多好的建议。因为我需要注意的不仅仅是404,我已经尝试了这个选项。
最终我需要能够处理所有这些情况
应该能够处理所有不匹配的路由localhost/404 _t/测试/测试/测试/测试/12/23
应该能够处理HTTP 500从操作
抛出异常应该能够处理所有的html错误,例如400。localhost/404 _t/ddsa
应该能够处理"文件扩展名如url"localhost/404 _t/test.cdd
使用所提供的链接中的代码也通过更新web。配置如下所示,我能够处理除"像url这样的文件扩展名"的所有情况。我收到的是空白页。看起来IIS正在覆盖响应。在添加
之前,对于不匹配的路由也是如此<httpErrors errorMode="Custom" existingResponse="PassThrough" >
以下是不匹配情况的路由图:
routes.MapRoute("NotFound", "{*url}",
new { controller = "Error", action = "NotFound" });
有什么建议如何实现这个?我看到stackoverflow.com完全按照我想要的方式工作,但我不知道它是如何实现的。
网络。配置
<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>
这是我之前在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>
在全球。asax,用来处理MVC视图引擎抛出的"view not found"错误:
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);
}
}
我宁愿不测试错误消息的内容,但我找不到一个更好的方法来区分这个错误与其他invalidoperationexception。
警告:虽然这将处理HttpRequestValidationException
错误,但错误页面的处理可能会抛出更多相同类型的异常(因为URL仍然无效)。我注意到这与Html.RenderPartial
和ASCX以及与SiteMap
相互作用。在这种情况下,最好重定向到简单视图或静态页面。
错误控制器设置Response.StatusCode
,以便将正确的HTTP代码发送回客户端。