不可接受的响应 (406) 消息 Asp.NET 代码 Web API (C#) - .NET 5.0

Posted

技术标签:

【中文标题】不可接受的响应 (406) 消息 Asp.NET 代码 Web API (C#) - .NET 5.0【英文标题】:Not Acceptable Response(406) Message Asp.NET Code Web API (C#) - .NET 5.0 【发布时间】:2022-01-03 12:37:08 【问题描述】:

通常我使用 Ok() 从 API 控制器返回 200OK 消息。还有 NotFound() 和 NoContent()。但我找不到像 Acceptable Response(406) 这样的东西。所以,我的问题是是否可以在不使用 HttpResponseMessage 的情况下从 API 控制器返回 Acceptable Response(406)。

我知道我可以使用 HttpResponseMessage(System.Net.HttpStatusCode.NotAcceptable) 之类的东西,但我想知道是否有更好的方法可以覆盖所有状态代码并且可以返回自定义错误消息。我试图寻找另一种方式的原因是因为在邮递员中它显示了错误的状态代码(给出了下面的截图)。

这是一个我认为我正在寻找的问题Click Here。但我无法在当前正在使用的 .NET 5.0 中使用 CreateResponse。

谢谢。

【问题讨论】:

您不应从 .NET Core 控制器返回 HttpResponseMessage。正如您在响应中看到的那样,MVC 只是将该 .NET 类序列化到输出,因为它没有特殊含义,它是“旧”Web API 和 HttpClient 使用的类。 那么,应该在新的 .NET Core 控制器和 .NET 5/6 中使用哪个类。 在下面查看@jegtugado 的回答:(I)ActionResult(<T>) 【参考方案1】:

您可以使用以下方式返回状态代码:

return StatusCode(StatusCodes.Status406NotAcceptable);

return new ObjectResult("Some message or object")  StatusCode = StatusCodes.Status406NotAcceptable ;

【讨论】:

控制器的返回类型会是IActionResult和ActionResult吗?我认为动作只在 MVC 期间使用,它也可以在 API 期间使用。我想知道的还有 1 件事。在 Get 中,当你想从控制器返回对象时,哪个更好?使用 ObjectResult 返回或直接返回对象或列表。 这种方法将可用于 IActionResult。您也可以在 API 上使用它。 MVC 独有的唯一结果是PartialViewResultViewResultViewComponentResultIActionResult 是允许我们返回不同结果的抽象,例如 FileResult。 ASP.NET Core 支持返回对象和 IActionResults,但根据经验,IActionResult 更好,因为它是抽象的。您需要抽象,以便您的代码具有灵活性和可扩展性。 只是澄清你的观点(这样我就不会弄错了)。 Api 基本上支持 IActionResults 及其抽象类 ActionResults 和实现它们的任何类。除了返回视图的实现。而且由于 IActionResults 是所有类的抽象,因此最好使用它,因为它将解耦代码。我想这就是它的要点。谢谢,真的很感激。做错了很久。 @KevinStephenBiswas 您的理解是正确的。如果您查看 MVC 控制器使用的父类 Controller,它内部实现了 BaseController,这是您在 .NET 中制作 API 控制器时使用的类

以上是关于不可接受的响应 (406) 消息 Asp.NET 代码 Web API (C#) - .NET 5.0的主要内容,如果未能解决你的问题,请参考以下文章

406 Spring MVC Json,根据请求“接受”标头不可接受

从 Ember 发布到 DRF API 时出现 406(不可接受)

Spring-boot 执行器端点 - 406 不可接受

如何在 jquery 中获取 406 错误(不可接受)

已完成 500 内部服务器错误; RestClient::NotAcceptable(406 不可接受)

Spring JSON请求获得406(不可接受)