如何让 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 控制器?