【问题标题】:Swagger UI sends multiple headers bound to a single action parameter as a single json object, rather than as multiple headersSwagger UI 将绑定到单个操作参数的多个标头作为单个 json 对象发送,而不是作为多个标头发送
【发布时间】: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 中运行良好。 myBodyBody1Body2 字段绑定自 POST 请求的 json 正文。 myHeaderHeader1Header2 绑定自请求的两个“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


【解决方案1】:

Yura 在How to use [FromHeader] attribute with custom model binding in Asp.Net Core 2.2 的回答中给出了解决方案 就是将[FromHeader] MyHeaders myHeaders改为[FromQuery] MyHeaders myHeaders。 这让 Swagger UI 工作,即使 FromQuery 似乎与 Header1 和 Header2 上的 FromHeader 属性相矛盾。

固定代码为:

public class TestController : ControllerBase
{
    [HttpPost]
    [ProducesResponseType(StatusCodes.Status200OK)]
    public ActionResult Post(
        [FromQuery] MyHeaders myHeaders, // FromHeader is changed to FromQuery
        MyBody myBody)
    {
        return Ok();
    }
}

public class MyHeaders // unchanged
{
    [FromHeader]
    public string Header1 { get; set; }

    [FromHeader]
    public string Header2 { get; set; }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-12
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    • 2018-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多