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

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

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

最好的方法是什么?

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

【问题讨论】:

  • 你还必须保持 Response.TrySkipIisCustomErrors = true; @ganders 的回答是救命之恩……

标签: asp.net-mvc error-handling http-status-code-404


【解决方案1】:

有多种方法可以做到,

  1. 你是对的常见的 aspx 代码它可以以你指定的方式分配
  2. 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);
            

            【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-10-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-07-07
            • 2010-12-26
            • 1970-01-01
            相关资源
            最近更新 更多