我有一个MVC ASP.NET网站,我在web.config
<customErrors mode="On" defaultRedirect="~/Views/Shared/Error.cshtml">
<error statusCode="404" redirect="~/redir/Home/Http404" />
</customErrors>
因此,当我尝试导航到不存在的地址时,我的Http404
视图位于Home
下,这是正确的。
现在我有一个特殊的情况,我想手动返回相同的Http 404,我看到IIS 8错误而不是我的Http404视图。
控制器:
return new HttpNotFoundResult();
如何避免此IIS8错误页面,仍然使我的视图成为错误提供程序?
修改*
我发现,如果不是HttpNotFoundResult()
,我会使用旧版throw new HttpException(404, "HTTP/1.1 404 Not Found");
。
为什么会出现这种差异?
由于
答案 0 :(得分:0)
<customErrors>
部分旨在控制应用程序错误发生时的行为。这也是它在<system.web>
部分定义的原因。
当您明确抛出HttpException
时(或发生任何其他内部异常时),将使用<customErrors>
设置,因为它(正确地)认为是应用程序错误。
另一方面,当你只是return HttpNotFoundResult()
时,没有抛出任何应用程序错误(在内部,它只是将HTTP响应状态代码和消息设置为404),MvcHandler
将移交请求管道中的下一个处理程序。因此,您最终会得到一个由IIS处理的常规服务器错误,就像其他任何未找到的&#39; 404一样。请求,<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>