.net6 swagger 修改路由名称的过滤器 去除掉后缀的Service

using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
using System.IO;
using static System.Net.WebRequestMethods;


public class RemoveServiceSuffixOperationFilter : IOperationFilter
{
    /// <summary>
    /// 修改路由名称的过滤器 去除掉后缀的Service
    /// </summary>
    /// <param name="operation"></param>
    /// <param name="context"></param>
    public void Apply(OpenApiOperation operation, OperationFilterContext context)
    {
        if (operation.Tags.Count > 0)
        {
            foreach (var tag in operation.Tags)
            {
                tag.Name = tag.Name.Replace("Service", "");
            }
        }
    }
}

/// <summary>
/// OpenApi过滤器
/// </summary>
public class TagReorderDocumentFilter : IDocumentFilter
{
    /// <summary>
    /// 修改路由名称的过滤器 去除掉后缀的Service
    /// </summary>
    /// <param name="operation"></param>
    /// <param name="context"></param>
    public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
    {
        //修改模块名称
        foreach (var tag in swaggerDoc.Tags)
        {
            tag.Name = tag.Name.Replace("Service", "");
        }

        //修改路由中的模块
        foreach (var path in swaggerDoc.Paths)
        {
            foreach (var o in path.Value.Operations)
            {
                foreach (var tag in o.Value.Tags)
                {
                    tag.Name = tag.Name.Replace("Service", "");
                }
            }
        }

        //swaggerDoc.Tags.Clear(); //清空Tags
        防止重复
        //Dictionary<string, OpenApiTag> dic = new Dictionary<string, OpenApiTag>();
        重新添加Tags
        //foreach (var path in swaggerDoc.Paths)
        //{
        //    foreach (var o in path.Value.Operations)
        //    {
        //        foreach (var tag in o.Value.Tags)
        //        {
        //            if (!dic.Keys.Contains(tag.Name))
        //            {
        //                dic.Add(tag.Name, tag);
        //                swaggerDoc.Tags.Add(tag);
        //            }
        //        }
        //    }
        //}
    }
}

在program.cs中注册

//添加Swagger的Authiozer的按钮鉴权
builder.Services.AddSwaggerGen(s =>
{
    s.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });

    string netXmlString = AppContext.BaseDirectory + "/WebApiBasics.Net.xml";
    s.IncludeXmlComments(netXmlString, true);

    string entityXmlStringa = AppDomain.CurrentDomain.BaseDirectory + "/WebApiBasics.Entity.xml";
    s.IncludeXmlComments(entityXmlStringa, true);

    string coreXmlStringa = AppDomain.CurrentDomain.BaseDirectory + "/WebApiBasics.Core.xml";
    s.IncludeXmlComments(coreXmlStringa, true);

    // 添加修改路由名称的过滤器 去除掉后缀的Service
    s.OperationFilter<RemoveServiceSuffixOperationFilter>();
    s.DocumentFilter<TagReorderDocumentFilter>();

    s.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme()
    {
        Description = "在下框中输入请求头中需要添加Jwt授权Token:Bearer Token",
        Name = "Authorization",
        In = ParameterLocation.Header,
        Type = SecuritySchemeType.ApiKey,
        BearerFormat = "JWT",
        Scheme = "Bearer"
    });

    s.AddSecurityRequirement(new OpenApiSecurityRequirement
                    {
                        {
                            new OpenApiSecurityScheme{
                                Reference = new OpenApiReference {
                                            Type = ReferenceType.SecurityScheme,
                                            Id = "Bearer"}
                           },new string[] { }
                        }
                    });

});

效果

.NET 6中,如果你想让Swagger识别没有被`[ApiController]`特性标记的控制器,你需要手动配置Swagger以扫描所有控制器。在.NET 6和.NET Core 3.1中,通常Swagger会默认使用反射扫描带有`[ApiController]`特性的控制器,以便生成API文档。如果要去除这个限制,可以使用Swagger的启动配置,特别是`AddApplicationPart`和`AddControllers`方法来确保所有控制器都被包含。 以下是通过代码配置Swagger以识别未标记为`[ApiController]`的控制器的步骤: 1. 首先,确保已经通过NuGet安装了Swashbuckle.AspNetCore包。 2. 在Startup.cs或Program.cs中配置Swagger服务和中间件。 如果使用的是.NET 6,并且你的项目结构可能使用Program.cs作为入口点,下面是如何配置的示例: ```csharp // 在Program.cs文件中 var builder = WebApplication.CreateBuilder(args); // 添加控制器服务,并确保扫描所有控制器 builder.Services.AddControllers(); builder.Services.AddControllers().AddApplicationPart(typeof(YourController).Assembly); // 配置Swagger服务 builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "API名称", Version = "v1" }); // 可能还需要添加其他Swagger配置 // ... }); var app = builder.Build(); // 配置中间件 app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); // 确保控制器路由被正确配置 // 启用Swagger中间件 app.UseSwagger(); app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "API名称 V1"); }); app.Run(); ``` 在上述代码中,`AddApplicationPart(typeof(YourController).Assembly);` 这行代码是关键,它告诉Swagger扫描指定程序集中的所有控制器,无论它们是否有`[ApiController]`标记。`YourController`代表你项目中的任意一个控制器类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值