c# - 在 Swagger for ASP .NET Core 3.1 中为标题添加过滤器

标签 c# asp.net-core swagger

我遵循了这个:
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>();
}

最佳答案

随着与 ASP.NET Core 3.1 兼容的最新版本的 Swashbuckle,许多类型已被 Microsoft.OpenApi.Models 中的等效类型替换。命名空间。所以你不应该再使用像 NonBodyParameter 这样的类型。或 IParameter .这两个都被一个类 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")
            });
        }
    }
}
然后在你的启动中,像往常一样简单地注入(inject) 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");
}
顺便说一句,如果你的类(class)被称为 AddRequiredHeaderParameter你应该实际设置Required = true而不是 false

关于c# - 在 Swagger for ASP .NET Core 3.1 中为标题添加过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60522015/

相关文章:

c# - 从 SOAP 请求中读取 XML 属性到 WCF 服务

docker - 如何在 Docker .NET Core Web 应用程序中保存数据?

spring - Grails 3+ (3.0.11) 中的 Swagger 2.0 支持不起作用

asp.net-core - .NET Core 2.1 Swashbuckle - 按区域分组 Controller

c# - 将 Entity Framework 4.1 数据库迁移到 EF5 进行升级,为新安装创建新数据库

c# - 将 C# 列表转换为 JSON 特定格式

c# - 重复属性设计模式

c# - ASP.NET CORE MVC 从对象集合中选择列表

c# - ASP.NET Core 2.0 app.UseAuthentication 未针对每个请求执行

node.js - 如何在 Azure Easy API 中启用 Swagger UI