c# - 不同的 Http 404 - 从 Controller 返回

标签 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 View 位于 Home 下,这是正确的。

现在我有一种特殊情况,我想手动返回相同的 Http 404,但我看到的是 IIS 8 错误,而不是我的 Http404 View 。

Controller :

return new HttpNotFoundResult();

如何避免此 IIS8 错误页面,并且仍然使我的 View 成为错误提供程序?

编辑*

我发现,如果我使用旧的 throw new HttpException(404, "HTTP/1.1 404 Not Found"); 而不是 HttpNotFoundResult(),它会起作用。

为什么会有这种差异?

谢谢

最佳答案

<customErrors>部分旨在控制发生应用程序错误时的行为。这也是它在 <system.web> 下定义的原因部分。

当你显式抛出 HttpException 时(或发生任何其他内部异常时)<customErrors>设置将被使用,因为它被认为(理所当然地)是一个应用程序错误。

另一方面,当您只是 return HttpNotFoundResult() ,没有应用程序错误被抛出(在内部,它只是将 HTTP 响应状态代码和消息设置为 404)和 MvcHandler会将请求移交给管道中的下一个处理程序。因此,您最终会遇到由 IIS 处理的常规 服务器错误,就像任何其他“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

关于c# - 不同的 Http 404 - 从 Controller 返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24661150/

相关文章:

c# - 删除媒体库中的图像

c# - 为什么我的 Uninstall 方法没有被调用?

c# - 如何在庞大的词典中加快搜索速度

asp.net-mvc - 如何使用 div 和 CSS 创建两列

来自 Incontact Studio 脚本的 HTTP 请求

node.js - 在 Jade 页面上获取请求响应?

c# - 更改参数名称 Web Api 模型绑定(bind)

jquery - 如何使用ajax调用将对象传递给 Controller

jquery - 如何使用uploadify上传多个文件时传递动态Form值

c++ - 如何从 cURL HTTP 响应中检索代码页?