不同的Http 404 - 从控制器返回

时间:2014-07-09 18:22:43

标签: c# asp.net-mvc http web-config

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

为什么会出现这种差异?

由于

1 个答案:

答案 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>

请参阅Documentation