You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Framework 4.8下NSwag 12.3自定义Web API接口排序方法问询

NSwag 12.3 自定义OpenAPI文档接口排序解决方案

NSwag 12.3的OpenApiDocument的Paths属性为只读是指无法直接给它赋值新的集合对象,但它本身是可修改的IOpenApiPathCollection类型,你只需要先清空原有内容,再按你整理好的顺序逐个添加路径项即可实现需求,具体实现步骤如下:

步骤1:注册PostProcess处理逻辑

在NSwag的文档生成配置中添加PostProcess委托,所有排序逻辑都在这个委托内执行,配置示例:

// .NET Framework 4.8 Web API 下的NSwag配置示例
GlobalConfiguration.Configure(httpConfig =>
{
    var swaggerSettings = new NSwag.AspNet.WebApi.SwaggerSettings();
    swaggerSettings.GeneratorSettings.PostProcess = document =>
    {
        // 此处插入排序逻辑
    };
    httpConfig.UseSwaggerUi3(swaggerSettings);
});

步骤2:实现排序逻辑

  • 先暂存所有原有路径项,按你指定的优先级筛选排序
  • 清空原有Paths集合,按排好的顺序逐个添加
// 1. 按你要求的顺序定义路径匹配规则,支持前缀匹配
var orderedPathRules = new List<string>
{
    "/api/login",      // 登录接口排在首位
    "/api/client",     // Client接口
    "/api/disaster",   // Disaster接口
    "/api/project",    // Project接口
    "/api/disaster-client" // Disaster Client接口
    // 其余未匹配的接口会自动排在末尾
};

// 2. 暂存所有原有路径
var allPathItems = document.Paths.ToList();
var sortedPathItems = new List<KeyValuePair<string, OpenApiPathItem>>();

// 3. 按优先级筛选路径加入排序列表
foreach (var rule in orderedPathRules)
{
    var matchedItems = allPathItems
        .Where(p => p.Key.StartsWith(rule, StringComparison.OrdinalIgnoreCase))
        .ToList();
    sortedPathItems.AddRange(matchedItems);
    // 移除已排序的项避免重复
    allPathItems.RemoveAll(p => matchedItems.Any(m => m.Key == p.Key));
}

// 4. 剩余未匹配优先级的路径按你需要的规则追加,示例为按字母序排列
sortedPathItems.AddRange(allPathItems.OrderBy(p => p.Key));

// 5. 清空原有集合并按顺序添加排好的路径
document.Paths.Clear();
foreach (var item in sortedPathItems)
{
    document.Paths.Add(item.Key, item.Value);
}

注意事项

  • NSwag 12.3的OpenApiPathItem命名空间为NSwag.OpenApiPathItem,不要和微软官方OpenAPI包的同名类型混淆
  • 如果需要按控制器维度排序,直接把规则替换为控制器对应的路由前缀即可

内容的提问来源于stack exchange,提问作者Bubba

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 06:09:00