如何使MVC操作返回404


142

我有一个操作,它接收一个用于检索某些数据的字符串。如果此字符串导致未返回任何数据(可能是因为已删除),那么我想返回404并显示错误页面。

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

最好的方法是什么?

设置Response.StatusCode = 404一样简单吗?


您还必须保持Response.TrySkipIisCustomErrors = true; @ganders的回答是救生员……
雷霆队

Answers:


111

有多种方法可以做到

  1. 您对通用的aspx代码是正确的,可以按照您指定的方式进行分配
  2. throw new HttpException(404, "Some description");

1
需要注意的一件事是,如果您有一个customError页面设置为处理404,则此错误页面将返回200(找到未找到的页面... :-()。我倾向于抛出BlogController异常并让NotFound操作设置了正确的响应代码
Nigel Sampson 2010年

20
我最终做了:Response.StatusCode = 404; Response.TrySkipIisCustomErrors = true; 返回View(“ MyCustomView”); 在我的情况下,这非常有效。
Paul Hiles 2010年

@PaulHiles:这是我在MVC3中的答案。希望我可以把它作为回答而不是评论。
Valamas 2014年

我认为,如果使用IIS,这是行不通的。在我的测试网站,它工作正常,但在活动网站的自定义错误页踢英寸
安迪·布朗

@AndyBrown它适用于IIS和IIS Express,您需要查看IIS的配置(管理控制台)
Dewfy

150

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

return new HttpNotFoundResult("optional description");

4
用法:return new HttpNotFoundResult("optional description");
瓦拉马斯(Valamas)2015年

6
如果要从控制器内部返回,则还有一个便捷方法称为HttpNotFound()。因此,您可以返回return HttpNotFound("optional description")
路易斯·佩雷斯

1
事情在2012年就不那么方便了;-)
Stefan Paul Noack

61

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

if (notWhatIExpected)
{
    return HttpNotFound();
}

要么

if (notWhatIExpected)
{
    return HttpNotFound("I did not find message goes here");
}

26

代码:

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。
user2173353

12

我用了这个:

Response.StatusCode = 404;
return null;

谢谢。这看起来比在服务器上引发代价高昂的异常要好得多。想知道404是否会记录在IIS日志中...理想情况下是这样。
fozylet 2012年

1
但是,在asp.net中,此方法不是一个好的解决方案,对吗?因为该网页将显示服务器的所有相关敏感信息。
lzlstyle

1
一个异常将花费不到一毫秒的时间来处理。与仅建立HTTP连接和返回HTTP连接几百毫秒相比,这毫无意义。抛出HttpException或返回HttpNotFoundResult,手动设置状态代码并返回null是很糟糕的。
乔治,


5

在NerdDinner中。尝试

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

谢谢,但是在幕后,它抛出了HttpException,类似于Dewfy帖子中的第二个建议。我正在寻找更多控制权,因此我可以显示特定于操作的漂亮错误页面,而不仅仅是重定向到控制器/全局404页面。似乎设置状态代码并返回到自定义视图是解决我的情况的方法。
Paul Hiles 2010年

4

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

public ActionResult FourOhFour()
{
    Response.StatusCode = 404;
    Response.TrySkipIisCustomErrors = true; // this line made it work
    return View();
}

2
您是在认真告诉我简单的东西return HttpNotFound();对您不起作用吗?您的系统多大了?
Gone Coding

1
你尝试了return HttpNotFound();吗?对于MVC 4或更高版本,它可以正常工作。msdn.microsoft.com/zh-cn/library/… “仅当您的应用程序托管在IIS 7.0中时,才使用TrySkipIisCustomErrors属性。在IIS 7.0中以经典模式运行时,TrySkipIisCustomErrors属性的默认值为true。在集成模式下运行,TrySkipIisCustomErrors属性的默认值为false。”
Gone Coding

2

我用:

Response.Status = "404 NotFound";

这对我有用:-)




-1

请尝试以下演示代码:

public ActionResult Test()

{
  return new HttpStatusCodeResult (404,"Not found");
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.