我有一个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

07-24 17:57