我正在尝试使用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功能会解决我的问题吗?
提前致谢。
答案 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操作中添加了必需的标头。