【问题标题】:Add a filter for a header in Swagger for ASP .NET Core 3.1在 Swagger for ASP .NET Core 3.1 中为标题添加过滤器
【发布时间】:2020-03-04 08:42:49
【问题描述】:

我遵循了这个:

Web Api How to add a Header parameter for all API in Swagger

还有这个:

How to send custom headers with requests in Swagger UI?

但是,这些 IParameter、Parameter 或 NonBodyParameters 均不适用于 ASP .NET CORE 3.1。

我想在我的 swagger 上添加一个标头,该标头采用一个租户 ID,该 ID 最好取自登录用户。

我也经历过:

https://github.com/domaindrivendev/Swashbuckle.AspNetCore

谁能指出我正确的方向?

using Swashbuckle.AspNetCore.Swagger;
using Swashbuckle.AspNetCore.SwaggerGen;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc.ApiExplorer;
using Microsoft.AspNetCore.JsonPatch.Operations;
using Microsoft.OpenApi.Models;

namespace Intent2.Auth.Utils
{
    public class AddRequiredHeaderParameter : IOperationFilter
    {
        public void Apply(OpenApiOperation operation, OperationFilterContext context)
        {
            
            if (operation.Parameters == null)
                operation.Parameters = new List<IParameter>();

            operation.Parameters.Add(new NonBodyParameter
            {
                Name = "X-User-Token",
                In = "header",
                Type = "string",
                Required = false
            });
        }
    }
}
services.AddSwaggerGen(options =>
{
    options.OperationFilter<AddRequiredHeaderParameter>();
}

【问题讨论】:

  • 请向我们展示您的代码
  • @JérômeMEVEL 我已经添加了它,但它找不到上面提到的命名空间。这就是我寻找替代方案的原因。
  • 我刚刚编辑了我的答案以获取详细信息。考虑到类名是AddRequiredHeaderParameter,我认为你实际上应该写Required = true。如果我的问题解决了您的问题,请考虑将其标记为已接受的答案(不同于赞成)。

标签: c# asp.net-core swagger


【解决方案1】:

使用与 ASP.NET Core 3.1 兼容的最新版本的 Swashbuckle,许多类型已被 Microsoft.OpenApi.Models 命名空间中的等效类型替换。所以你不应该再使用像NonBodyParameterIParameter 这样的类型。这两个都被一个类OpenApiParameter替换了。

您的代码应如下所示

using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
using System.Collections.Generic;

namespace Intent2.Auth.Utils
{
    public class AddRequiredHeaderParameter : IOperationFilter
    {
        public void Apply(OpenApiOperation operation, OperationFilterContext context)
        {

            if (operation.Parameters == null)
                operation.Parameters = new List<OpenApiParameter>();

            operation.Parameters.Add(new OpenApiParameter()
            {
                Name = "X-User-Token",
                Description = "Access Token",
                In = ParameterLocation.Header,
                Schema = new OpenApiSchema() { Type = "String" },
                Required = true,
                Example = new OpenApiString("Tenant ID example")
            });
        }
    }
}

然后在你的启动中,像往常一样简单地注入 SwaggerGen

services.AddSwaggerGen(options =>
{
    options.OperationFilter<AddRequiredHeaderParameter>();
}

例如,您甚至可以将来自外部的租户 ID 设置为配置文件。为此,请按如下方式修改您的AddRequiredHeaderParameter

using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
using System;
using System.Collections.Generic;

namespace Intent2.Auth.Utils
{
    public class AddRequiredHeaderParameter : IOperationFilter
    {
        private string _tenantIdExample;

        public AddRequiredHeaderParameter(string tenantIdExample)
        {
            if (string.IsNullOrEmpty(tenantIdExample )) 
                throw new ArgumentNullException(nameof(tenantIdExample ));

            _tenantIdExample = tenantIdExample;
        }

        public void Apply(OpenApiOperation operation, OperationFilterContext context)
        {

            if (operation.Parameters == null)
                operation.Parameters = new List<OpenApiParameter>();

            operation.Parameters.Add(new OpenApiParameter()
            {
                Name = "X-User-Token",
                Description = "Access Token",
                In = ParameterLocation.Header,
                Schema = new OpenApiSchema() { Type = "String" },
                Required = true,
                Example = new OpenApiString(_tenantIdExample)
            });
        }
    }
}

从你的初创公司就这样称呼它

services.AddSwaggerGen(options =>
{
    options.OperationFilter<AddRequiredHeaderParameter>("Tenant ID example");
}

顺便说一句,我认为如果你的班级被称为AddRequiredHeaderParameter,你实际上应该设置Required = true而不是false

【讨论】:

  • 谢谢。我在哪里设置tenantId?它在“In”参数上吗?
  • 杰罗姆帮了大忙。我现在得到的是 imgur.com/a/aTEWlqs 是否可以在该标题单元格中预定义值?
  • @grozdeto 我刚刚编辑了我的代码以包含租户 ID 示例
  • Jerome 非常感谢您的帮助,并感谢您的详细回答。你真的帮我解决了这个任务。其中很大一部分是查找参数的名称。我希望它也能帮助其他成员。
  • @JérômeMEVEL 从 UI 中,值未传递到后端。 context.Request.Headers 没有 X-User-Token 标头的标头。可能是什么问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-30
  • 1970-01-01
  • 1970-01-01
  • 2020-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多