【发布时间】:2020-10-19 06:23:56
【问题描述】:
我按照通常的 MS 文档在我的 asp.net core 3.1 API 中启用了 Swagger。 https://docs.microsoft.com/en-us/aspnet/core/tutorials/getting-started-with-swashbuckle?view=aspnetcore-3.1&tabs=visual-studio 它工作正常。
以下控制器在 Postman 中运行良好。 myBody 的 Body1 和 Body2 字段绑定自 POST 请求的 json 正文。 myHeader 的 Header1 和 Header2 绑定自请求的两个“Header1”和“Header2”标头。
namespace MyApi.Controllers
{
[ApiController]
[Route("test")]
public class TestController : ControllerBase
{
[HttpPost]
[ProducesResponseType(StatusCodes.Status200OK)]
public ActionResult Post(
[FromHeader] MyHeaders myHeaders,
MyBody myBody)
{
return Ok();
}
}
public class MyHeaders
{
[FromHeader]
public string Header1 { get; set; }
[FromHeader]
public string Header2 { get; set; }
}
public class MyBody
{
public string Body1 { get; set; }
public string Body2 { get; set; }
}
}
但是 Swagger UI 只为两个标头传递 1 个 json 对象: [招摇 ui][1]
并生成相应的 curl 命令:
curl -X POST "https://localhost:5001/test" -H "accept: */*" -H "myHeaders: header1,string,header2,string" -H "Content-Type: application/json" -d "{\"body1\":\"string\",\"body2\":\"string\"}"
问题在于 -H "myHeaders: header1,string,header2,string" 部分。正如预期的那样,模型绑定将 myHeaders.Header1 和 .Header2 设置为 null,因为标头名为“myHeaders”。 用 **-H "Header1: cat" -H "Header2: dog" 替换部分可以正常工作。
Asp.net 非常聪明,可以通过匹配名称将单独的标头映射到单个操作参数中。但是我怎样才能让 Swagger 有多个标题 UI,所以它的 curl 命令有效?
我知道我可以用[FromHeader] string Header1, [FromHeader] string Header2 替换[FromHeader] MyHeaders myHeaders,但我想避免这种情况。将有几十个动作都接收相同的标题集。
【问题讨论】:
-
试试这个线程中给出的解决方案之一:stackoverflow.com/questions/57768912/… 它应该对你有帮助。
-
@Harsh 你成功了,Yura 的第二个回答就是解决方案。非常感谢。如果将 [FromHeader] MyHeaders myHeaders 更改为 [FromQuery] MyHeaders myHeaders,则 Swagger UI 可以正常工作。这似乎很疯狂,但它确实有效。我会在下面写一个正确的答案。
标签: c# asp.net-core swagger swashbuckle.aspnetcore