仅在Swashbuckle

时间:2017-02-09 15:21:31

标签: c# asp.net .net swagger swashbuckle

我正在尝试使用Swashbuckle为我们的API设置Swagger。我们的每个控制器都继承自BaseController,它有~8个参数(userId,语言,平台等)。它们每个都有只读变量,其get函数设置为从读入的标题中读取值。例如:

protected int UserID
    {
        get
        {
            return int.Parse(HttpContext.Current.Request.Headers["user_Id"]);
        }
    }

当我第一次安装Swagger时,它只会提供传递方法中列出的参数的选项。这些参数总是排除在BaseController中设置的~8个参数,因此如果控制器使用用户ID,则方法签名中不会列出用户ID。作为用户ID,不会显示在Swagger生成的UI上。

现在,我一直在尝试使用SwaggerOperation属性:

[SwaggerOperation("UserValidate(UserID)")]
    public int UserValidate()
    {
            return this._UserValidateService.UserValidate(this.UserID);

我有一个自定义swagger参数,如果他们的SwaggerOperation名称包含“UserID”,则检查所有方法,如果是,则将UserID标头添加到该调用。

我的问题是我必须手动完成每个调用并添加swagger操作,如果调用发生变化,我们必须记住也要更改SwaggerOperation。

我还考虑过在每个API调用中添加8并将它们标记为可选,但这听起来像是会让UI变得非常糟糕。

请告知情况。我有没有考虑过的选择?他们错过了什么样的Swashbuckle功能会解决我的问题吗?

提前致谢。

1 个答案:

答案 0 :(得分:1)

如果您使用十字花饰> = 5,则可以如下添加操作过滤器。它将仅向选定的请求添加标头:

public class AddHeaderParameter : IOperationFilter
{
    public void Apply(OpenApiOperation operation, OperationFilterContext context)
    {
        if (context.ApiDescription.HttpMethod.Equals("POST") && context.ApiDescription.RelativePath.Contains("login"))
        {
            if (operation.Parameters == null)
                operation.Parameters = new List<OpenApiParameter>();

            operation.Parameters.Add(new OpenApiParameter
            {
                Name = "UserId",
                In = ParameterLocation.Header,
                Schema = new OpenApiSchema
                {
                    Type = "String",
                },
                Required = true
            });
        }

    }

以上仅在操作名称为登录名的POST操作中添加了必需的标头。