C# 找不到id时如何返回自定义404响应

C# 找不到id时如何返回自定义404响应,c#,asp.net-core,asp.net-core-mvc,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-找不到似乎最合适,但是,从调试的角度来看,不存在的ID和错误的控制器/操

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

public IActionResult Index(Guid id)
{
    var entity = _dbContext.Entities.Find(id);
 
    if (entity == null)
    {
         return NotFound(); //??
    }
    return View(entity)
}
404-找不到似乎最合适,但是,从调试的角度来看,不存在的ID和错误的控制器/操作名称是非常不同的错误

无论如何,我决定返回带有更多解释性信息的自定义错误页面,以便区分404和404

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

我希望避免返回HttpResponseMessage,因为我需要更改操作的返回类型

备注:在评论中,您可以投票选择404 resp,以及在这种特殊情况下使用的其他响应代码。

您可以使用,并可以执行以下操作:

return Request.CreateResponse(HttpStatusCode.NotFound,“foobar”)

我以前用过
HttpStatusCode.NoContent
来表示类似的内容。这实际上取决于您的业务逻辑是什么,以及您希望如何处理这些情况
NoContent
将导致成功的http调用,其中as
NotFound
将是一个错误
NotFound
将触发默认的MVC错误页面路由(如果您有该设置),而
NoContent
不会。这是正常使用/遍历应用程序时可能出现的响应,还是只有恶意用户篡改URL时才会出现的响应?所有这些都是我在决定要返回哪个http状态代码时所考虑的。希望这有帮助

先看一看

理论上,您不应该将HttpStatus代码用作应用程序错误代码

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

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

调用
/getresource/347d2f3a-bd0f-4d0b-8c05-2e7f3f8f265e
是一种资源。如果这不可用,您应该使用404。如果有,则为200。那很好

谷歌甚至说,你应该发送404。从:

为不存在的页面返回404或410以外的代码(或 将用户重定向到其他页面,例如主页,而不是 返回404)可能会有问题。首先,它告诉搜索引擎 在那个URL上有一个真实的页面。因此,该URL可能是 已爬网并对其内容进行索引。因为谷歌机器人花了很多时间 在不存在的页面上,您的唯一URL可能不会被发现 快速或频繁访问,您的站点的爬网覆盖率可能会降低 受影响(此外,您可能不希望您的网站在未来几年排名良好 搜索查询

对于实现,我只需抛出一个定制的
NotFoundException
(如果您想设置更多有意义的完整信息)和您需要的所有数据,并通过全局处理。在那里,您可以将其转换为404响应


当然,您可以让原始异常冒泡到
ExceptionFilterAttribute
,但是您没有太多的可能性使其有意义。

您是否尝试过返回重定向到操作(“FourZeroFourpage”);?重定向到操作返回302,这不是我想要的。您已经使用了最佳方法。
如果(entity==null){return NotFound();/?}
“Request.CreateResponse”在asp.net core中不存在。我希望避免返回HttpResponseMessage,因为我需要更改操作的返回类型。要点是,为什么我会抛出异常,然后使用异常过滤器将其转换为404响应,而不是直接返回NotFound,响应类似于
IActionR的内容esult response=View(“_CustomError”);response.responseCode=404;return response
?因为您编写了我想要避免返回HttpResponseMessage,因为我需要更改操作的返回类型。另外,因为您不需要在ControllerContext/有HttpContext中执行此操作(例如,您可以在服务层中使用它)在ASP.NET团队中有一些关于HTTP异常的讨论,他们认为它是反模式的,这就是为什么他们在MVC CORE中避免它的原因。它的推理是相当好的:它的控制器负责确定HTTP响应。从另一个层这样做是违反SRP的。虽然在很多情况下它是实用的。为什么要抛出一个?
NotFoundException
当该层被告知访问一个无法找到的项目时,是否违反了SRP?