我总是想知道在下面的情况下最好的错误响应代码是什么:
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在此特定情况下使用的其他响应代码。
答案 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状态代码。希望这有帮助!