我有一个mvc asp.net网站,其中web.config
<customErrors mode="On" defaultRedirect="~/Views/Shared/Error.cshtml">
<error statusCode="404" redirect="~/redir/Home/Http404" />
</customErrors>
因此,当我试图导航到一个不存在的地址时,我得到的
Http404
视图位于Home
下面,这是正确的。现在,我有一个特殊的情况,在这种情况下,我想手动返回相同的htp404,我看到的是iis 8错误,而不是我的http404视图。
控制器:
return new HttpNotFoundResult();
如何避免这个iis8错误页面,仍然使我的视图成为错误提供程序?
编辑*
我发现如果我使用旧的
HttpNotFoundResult()
而不是throw new HttpException(404, "HTTP/1.1 404 Not Found");
,它就会工作。为什么会有这种不同?
谢谢
最佳答案
<customErrors>
部分旨在控制发生应用程序错误时的行为。这也是它在<system.web>
部分下定义的原因。
当您显式地抛出HttpException
时(或者当发生任何其他内部异常时),将使用<customErrors>
设置,因为它被认为(正确地)是一个应用程序错误。
另一方面,当您简单地return HttpNotFoundResult()
时,不会抛出任何应用程序错误(在内部,它只是将http响应状态代码和消息设置为404),并且MvcHandler
会将请求移交给管道中的下一个处理程序。因此,最终会出现一个常规服务器错误,该错误与任何其他“404 not found”请求一样由IIS处理,而<customErrors>
部分不会影响其行为。
因此,当发生常规服务器错误时,您需要控制iis行为。为此,请使用<system.webServer/httpErrors>
部分,如下所示:
<system.webServer>
<httpErrors errorMode="Custom">
<remove statusCode="404"/>
<error statusCode="404" path="/redir/Home/Http404" responseMode="ExecuteURL" />
</httpErrors>
</system.webServer>
见Documentation