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