如何找不到ID时如何返回自定义404响应

时间:2017-08-08 14:35:38

标签: c# asp.net-core asp.net-core-mvc

我总是想知道在下面的情况下最好的错误响应代码是什么:

public IActionResult Index(Guid id)
{
    var entity = _dbContext.Entities.Find(id);
 
    if (entity == null)
    {
         return NotFound(); //??
    }
    return View(entity)
}

404 - Not Found似乎最合适,但是,从调试的角度来看,不存在的ID和错误的控制器/动作名称是非常不同的错误。

无论如何,我已经决定返回带有更多解释性消息的自定义错误页面,因此我可以区分404和404.

如何从Controller的操作返回自定义404页面,在其他情况下如何返回默认404?

我想避免返回HttpResponseMessage,因为我需要更改Action的返回类型。

PS:在评论中,您可以投票选择404 resp在此特定情况下使用的其他响应代码。

2 个答案:

答案 0 :(得分:1)

首先看一下this question

理论上你不应该使用HttpStatus代码作为应用程序错误代码。

但是,在公共网站上,404有一个特定含义:

  

找不到请求的资源,但可能在   未来。客户的后续请求是允许的。

调用/getresource/347d2f3a-bd0f-4d0b-8c05-2e7f3f8f265e是一种资源。如果这不可用,你应该使用404.如果它可用,那么200.那是完全没问题的。

谷歌甚至说,你应该发送404.来自google support

  

为不存在的页面返回404或410以外的代码(或   将用户重定向到另一个页面,例如主页,而不是   返回404)可能会有问题。首先,它告诉搜索引擎   那个URL上有一个真实的页面。结果,该URL可能是   抓取并将其内容编入索引。由于Googlebot花费的时间   在不存在的页面上,您的唯一URL可能不会被发现   快速或经常访问,您的网站的爬网覆盖范围可能是   受影响(同样,你可能不希望你的网站排名很好   搜索查询

对于实现,我只是抛出一个自定义NotFoundException(如果你想设置更有意义的信息),包含你需要的所有数据,并通过ExceptionFilterAttribute全局处理它。在那里你可以把它变成404响应。

当然,你可以让最初的例外冒充ExceptionFilterAttribute,但是你没有那么多的可能性让它变得有意义。

答案 1 :(得分:0)

您可以使用CreateResponse extension method并执行以下操作:

return Request.CreateResponse(HttpStatusCode.NotFound, "foobar");

之前我曾使用HttpStatusCode.NoContent之类的东西。这实际上取决于您的业务逻辑是什么以及您希望如何处理这些案例。 NoContent将导致成功的http调用,而NotFound将成为错误。 NotFound将触发您的默认MVC错误页面路由(如果您有此设置)并且NoContent赢了。这是通过正常使用/遍历应用程序可能的响应,还是仅在恶意用户篡改URL时才会发生?所有这些部分都是我考虑确定要返回哪个http状态代码。希望这有帮助!