首页 > 解决方案 > 使用 C# webApi 的 Swagger UI 正在将我的标头参数更改为查询参数?

问题描述

所以我决定使用这种方法,因为它是为我的 api 调用添加自定义标头最简单的方法,例如:

[HttpPost]
[Route("something")]
public async Task<somethingObject> DoSomething([Microsoft.AspNetCore.Mvc.FromHeader(Name = "deviceGuid")] string deviceGuid)
{
    var somethingObject= await doSomethingWithDevice(deviceGuid)
    return somethingObject;
}

预期的结果是 Swagger 中的一个字段,我可以在其中输入 deviceGuid 并且 Swagger 应该将其视为标题。

手头的问题是 Swagger 将其视为查询而不是标题:

图片

有什么线索可以解决这个问题吗?

标签: c#asp.net-web-apihttp-headersswagger

解决方案


我不认为 SwashBuckle(我猜这是您正在使用的招摇实现)知道 FromHeader。
你能做的,是这个;
制作一个将 ParameterType 更改为 Header 的 OperationFilter - 类似于以下内容;-注意我在这个要点中找到了这个。

public class FromHeaderAttributeOperationFilter : IOperationFilter
{
    public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
    {
        foreach (var httpParameterDescriptor in apiDescription.ActionDescriptor.GetParameters().Where(e => e.GetCustomAttributes<FromHeaderAttribute>().Any()))
        {
            var parameter = operation.parameters.Single(p => p.name == httpParameterDescriptor.ParameterName);
            parameter.name = httpParameterDescriptor.GetCustomAttributes<FromHeaderAttribute>().Single().HeaderName;
            parameter.@in = "header";
        }
    }
}

推荐阅读