如何让 MVC 动作返回 404

Posted

技术标签:

【中文标题】如何让 MVC 动作返回 404【英文标题】:How to get MVC action to return 404 【发布时间】:2011-02-26 06:27:56 【问题描述】:

我有一个动作,它接收一个用于检索一些数据的字符串。如果这个字符串导致没有数据被返回(可能是因为它已经被删除了),我想返回一个 404 并显示一个错误页面。

我目前只使用返回一个特殊的视图,该视图显示一个针对此操作的友好错误消息,指出该项目未找到。这可以正常工作,但理想情况下希望返回 404 状态代码,以便搜索引擎知道该内容不再存在并可以将其从搜索结果中删除。

最好的方法是什么?

设置Response.StatusCode = 404这么简单吗?

【问题讨论】:

你还必须保持 Response.TrySkipIisCustomErrors = true; @ganders 的回答是救命之恩…… 【参考方案1】:

有多种方法可以做到,

    你是对的常见的 aspx 代码它可以以你指定的方式分配 throw new HttpException(404, "Some description");

【讨论】:

需要注意的一点是,如果您将 customError 页面设置为处理 404,则此错误页面将返回 200(找到未找到的页面... :-( )。我倾向于从说 BlogController 抛出异常并让 NotFound 操作设置正确的响应代码。 我最终做了:Response.StatusCode = 404; Response.TrySkipIisCustomErrors = true;返回视图(“我的自定义视图”);这在我的情况下非常有效。 @PaulHiles:这就是我在 MVC3 中的答案。希望我可以将其作为答案而不是评论来投票。 这不起作用,我认为,如果使用 IIS。在我的测试站点上它工作正常,但在实时站点上,自定义错误页面会启动。 @AndyBrown 它适用于 IIS 以及 IIS Express,您需要检查您的 IIS 配置(管理控制台)【参考方案2】:

我用:

Response.Status = "404 NotFound";

这对我有用:-)

【讨论】:

【参考方案3】:

在 NerdDinner 例如。试试it

public ActionResult Details(int? id) 
    if (id == null) 
        return new FileNotFoundResult  Message = "No Dinner found due to invalid dinner id" ;
    
    ...

【讨论】:

谢谢,但在幕后,这会引发类似于 Dewfy 帖子中第二条建议的 HttpException。我正在寻找更多控制,以便我可以显示特定于操作的漂亮错误页面,而不仅仅是重定向到控制器/全局 404 页面。看起来设置状态代码并返回自定义视图是我的情况。【参考方案4】:

我用过这个:

Response.StatusCode = 404;
return null;

【讨论】:

谢谢。这看起来比在服务器上抛出一个代价高昂的异常要好得多。想知道 404 是否会记录在 IIS 日志中...理想情况下会记录。 但是,在 asp.net 中,这种方法不是一个好的解决方案,对吧?因为网页会显示服务器的所有相关敏感信息。 处理一个异常需要不到一毫秒的时间。与仅仅建立和返回 HTTP 连接的几百毫秒相比,它毫无意义。抛出 HttpException 或者返回 HttpNotFoundResult,手动设置状态码返回 null 太可怕了。【参考方案5】:

代码:

if (id == null)

  throw new HttpException(404, "Your error message");//RedirectTo NoFoundPage

Web.config

<customErrors mode="On">
  <error statusCode="404" redirect="/Home/NotFound" />
</customErrors>

【讨论】:

另外,所有可用的状态码都存在于这个枚举中:HttpStatusCode。【参考方案6】:

在 ASP.NET MVC 3 及更高版本中,您可以从控制器返回 HttpNotFoundResult。

return new HttpNotFoundResult("optional description");

【讨论】:

用法:return new HttpNotFoundResult("optional description"); 如果您从控制器内部返回,还有一个称为HttpNotFound() 的便捷方法。所以你可以返回return HttpNotFound("optional description") 在 2012 年,事情并不是那么方便 ;-)【参考方案7】:

在 MVC 4 及更高版本中,您可以使用内置的 HttpNotFound 辅助方法:

if (notWhatIExpected)

    return HttpNotFound();

if (notWhatIExpected)

    return HttpNotFound("I did not find message goes here");

【讨论】:

【参考方案8】:

在我添加下面的中间行之前,上述示例均不适用于我:

public ActionResult FourOhFour()

    Response.StatusCode = 404;
    Response.TrySkipIisCustomErrors = true; // this line made it work
    return View();

【讨论】:

你是认真地告诉我简单的return HttpNotFound(); 对你不起作用吗?你的系统几岁了? 你试过return HttpNotFound();吗?它适用于 MVC 4 以上。 msdn.microsoft.com/en-us/library/… “TrySkipIisCustomErrors 属性仅在您的应用程序托管在 IIS 7.0 中时使用。在 IIS 7.0 中以经典模式运行时,TrySkipIisCustomErrors 属性默认值为 true。在集成模式下运行时,TrySkipIisCustomErrors 属性默认值为 false。” 【参考方案9】:

请尝试以下演示代码:

public ActionResult Test()


  return new HttpStatusCodeResult (404,"Not found");

【讨论】:

【参考方案10】:

你也可以这样做:

        if (response.Data.IsPresent == false)
        
            return StatusCode(HttpStatusCode.NoContent);
        

【讨论】:

【参考方案11】:

如果你正在使用 .NET Core,你可以return NotFound()

【讨论】:

【参考方案12】:

在 .NET Core 1.1 中:

return new NotFoundObjectResult(null);

【讨论】:

如果你不返回一个对象,那么 return NotFound() 更合适,但在任何一种情况下,你都不会得到一个友好的错误页面,除非你用 StatusCodePagesWithReExecute 之类的东西来处理它。见devtrends.co.uk/blog/handling-404-not-found-in-asp.net-core

以上是关于如何让 MVC 动作返回 404的主要内容,如果未能解决你的问题,请参考以下文章

如何通过在 Spring MVC 中返回自定义错误页面来全局处理 404 异常?

如何返回 404 状态,其中无效参数被传递到我的 ASP.NET MVC 控制器?

MVC如何从视图调用控制器中的动作以返回值

如何在 asp.net mvc 5 中返回模型和参数中的另一个动作?

如何在 ASP.NET MVC 中使用路由修复 404?

带有 MVC 的 Angular CLI 从 API 调用返回 404