- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在设置 ProducesResponseType,以便用 Swagger 记录它。
如果响应成功(OK => 200),那么它会生成一个 IEnumerable。
[ProducesResponseType(typeof(IEnumerable<MyModel>), 200)]
但是当我遇到异常时,我会捕获它,然后生成我的自定义 APIError 类的对象。当我填充对象时,我可以设置不同的 HttpStatusCodes,但最后,我想要的是能够将 ProducesResponseType 设置为我的 APIError 类,用于所有剩余的 HttpStatusCodes。我的意思是,我可以获得 BadRequest、ServerInternalError、Forbidden 等,但它们都将具有相同的响应类型 (ApiError)。有没有办法为所有错误的http代码设置这行代码?还是需要一个一个设置?
[ProducesResponseType(typeof(ApiError), ???)]
最终结果应该是这样的:
[ProducesResponseType(typeof(IEnumerable<MyModel>), 200)]
[ProducesResponseType(typeof(ApiError), AllFailureHttpCodes)]
最佳答案
我担心这是不可能的,至少不是每个 Action 。
IApiResponseMetadataProvider
(参见 here)只有一个 int StatusCode { get;
属性已定义,它用于 ProducesAttribute
和 ProducesResponseTypeAttribute
。
但是,在您的特殊情况下,您可以将其注册为全局过滤器,因为无论是 GET、POST、PUT 还是 DELETE,所有操作的错误结果都应该相同。
services.AddMvc(options =>
{
options.Filters.Add(new Microsoft.AspNetCore.Mvc.ProducesResponseTypeAttribute(typeof(ApiError), 400));
options.Filters.Add(new Microsoft.AspNetCore.Mvc.ProducesResponseTypeAttribute(typeof(ApiError), 401));
options.Filters.Add(new Microsoft.AspNetCore.Mvc.ProducesResponseTypeAttribute(typeof(ApiError), 409));
});
然后这些应该应用于您的 MVC/WebAPI 应用程序中的每个操作。
但是,我个人认为这种用法是错误的,因为它表明您的每个方法都可以处理这些类型的错误。例如 409 是专门针对冲突的,在您使用它的 WebAPI 中,当更新资源时出现错误,即当使用乐观并发时,记录被另一个用户更改,因此记录的版本被更改并且更新失败.
将这些添加到每个方法都是错误的。如果您的操作确实处理了此状态代码,则您应该只添加状态代码。例如,409 仅适用于 PUT 和 POST 方法。其中 404 可能适合 GET 和 PUT(更新),但不太适合 POST(插入)。
这尤其糟糕,当你使用诸如 Swagger 之类的工具生成 Api Docs 时,你只会得到一个错误的文档。您应该将 ProducesResponseType
视为一种文档形式,因此不应使用过于通用的方法。
在 ASP.NET Core 2.2 中,Swagger API 支持得到了极大改进,这还包括 convention based响应类型和代码。
它已经带有一组很好的默认约定,但您也可以覆盖它并提供您自己的约定方法。
关于c# - 为多个 HttpStatusCodes 设置一个 ProducesResponseType typeof,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43153621/
目前,我有 20 个端点与这 3 行 ProducesResponseType 的代码相同.我正在使用 .NET Core 3.1 和 Swagger。我如何重构我的代码以使其变干(不要重复自己)?
我有一个通用的 ASP.NET Core WebApi Controller ,例如: public abstract class EntityController { public IAct
我想了解 ProducesResponseType 的用途。 Microsoft 将过滤器定义为指定操作返回的值和状态代码的类型。 所以我很好奇如果 一个人没有放置 ProductResponseTy
我正在设置 ProducesResponseType,以便用 Swagger 记录它。 如果响应成功(OK => 200),那么它会生成一个 IEnumerable。 [ProducesRespons
我必须从使用 NET CORE 制作的 API 到 .NET 进行“反向” 我在将 [ProducesResponseType] 从 Net Core 更改为有效的 .NET 时遇到问题 例如我有这段
在下面有些人为设计的代码片段中,我创建了一个 Controller 方法,它构成了 ASP.NET Core MVC API 的一部分。该方法用 ProducesResponseType 属性修饰,指
我是一名优秀的程序员,十分优秀!