C# 请求-响应对象和内容类型批注约定

C# 请求-响应对象和内容类型批注约定,c#,asp.net-core,swagger,swashbuckle,C#,Asp.net Core,Swagger,Swashbuckle,我使用的是asp.net core 2.2.6,我不清楚关于使用和注释的预期约定是什么。在没有注释的情况下,API的行为符合预期,内容类型应用于适当的返回类型,但是当使用注释来帮助Swashbuckle时,行为是有限制的 请考虑以下示例: [HttpPut] [Consumes("application/json")] [Produces("application/json", "application/problem+json")] // [Produces("application/json

我使用的是asp.net core 2.2.6,我不清楚关于使用和注释的预期约定是什么。在没有注释的情况下,API的行为符合预期,内容类型应用于适当的返回类型,但是当使用注释来帮助Swashbuckle时,行为是有限制的

请考虑以下示例:

[HttpPut]
[Consumes("application/json")]
[Produces("application/json", "application/problem+json")]
// [Produces("application/json", Type = typeof(ProblemDetails))]
[ProducesResponseType(StatusCodes.Status204NoContent)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status403Forbidden)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
public async Task<IActionResult> Put([FromBody] SomeModel model, CancellationToken cancellationToken)
{
    // ...
}
[HttpPut]
[使用(“应用程序/json”)]
[产生(“应用程序/json”、“应用程序/问题+json”)]
//[products(“application/json”,Type=typeof(ProblemDetails))]
[产品响应类型(StatusCodes.Status204NoContent)]
[产品响应类型(StatusCodes.Status400BadRequest)]
[产品响应类型(StatusCodes.Status403禁止)]
[产品响应类型(StatusCodes.Status500InternalServerError)]
公共异步任务Put([FromBody]SomeModel模型,CancellationToken CancellationToken)
{
// ...
}
当发生错误并返回
ProblemDetails
实例时,将覆盖默认处理,并将返回类型设置为“application/json”

products
属性可以关联单个对象和内容类型,但是它不允许您定义多个实例。解决方案是使用几个
ProducesResponseType
属性,这些属性允许您声明一个类型(尽管它是正确推断的,并且不是必需的),但是该属性不利于内容类型()

行为是明确的根据

“application/problem+json”内容类型在默认情况下甚至不会被swagger ui显示为可用的内容类型之一,因此无法在操作筛选器中过滤媒体类型(您可以获取第一个
ProblemDetails
引用,并使用新的内容类型键重建集合)


最优雅的解决方案是什么?它不会在api中引入不受欢迎的行为,但会限制招摇过市的用户界面以显示所需的内容类型?

同样如此。我认为这是ASP.NET内核中的一个bug,提出了一个问题。见: