.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
相关产品推荐
相关产品推荐

