asp.net-web-api - ASP.NET Web API - Swagger,创建多个视图
问题描述
我将 Swagger 与 ASP.NET Web API 应用程序一起使用。如果我访问 URLhttp://localhost:5000/swagger
Swagger 列出了这些控制器中定义的所有控制器和动作。假设我有五个控制器,每个控制器都有一个动作。我想创建多个视图,这样当
用户说http://localhost:5000/swagger/v1
他可以看到所有控制器,而用户说http://localhost:5000/swagger/v2
他只能看到一个控制器,而用户说http://localhost:5000/swagger/v3
他只能看到两个控制器
基本上我试图通过招摇来限制对控制器的访问。根据用户要求,我将与他们分享特定的 URL。
是否可以使用 Swagger 实现这一目标?
解决方案
是的,你可以做你想做的事。
您应该执行以下步骤:
- 创建一个继承自的类
IDocumentFilter
并将其注册SwaggerConfig.cs
如下c.DocumentFilter<HideSwaggerEndpointsDocumentFilter>();
例子:
public class HideSwaggerEndpointsDocumentFilter : IDocumentFilter
{
public void Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, IApiExplorer apiExplorer)
{
//enter code here
}
}
加载 swagger 页面后会加载此过滤器。在其中,您可以控制每个控制器操作。您可以根据您决定的任何标准删除一些操作。
- 删除它们有点棘手,我这样做如下:
foreach (var apiDescription in apiExplorer.ApiDescriptions)
{
var route = "/" + apiDescription.RelativePath.Substring(0, (apiDescription.RelativePath.IndexOf('?') != -1) ? apiDescription.RelativePath.IndexOf('?') : apiDescription.RelativePath.Length).TrimEnd('/');
var path = swaggerDoc.paths[route];
switch (apiDescription.HttpMethod.Method)
{
case "DELETE": path.delete = null; break;
case "GET": path.get = null; break;
case "HEAD": path.head = null; break;
case "OPTIONS": path.options = null; break;
case "PATCH": path.patch = null; break;
case "POST": path.post = null; break;
case "PUT": path.put = null; break;
default: throw new ArgumentOutOfRangeException("Method name not mapped to operation");
}
if (path.delete == null && path.get == null &&
path.head == null && path.options == null &&
path.patch == null && path.post == null && path.put == null)
{
swaggerDoc.paths.Remove(route);
}
}
免责声明:
如果您将上述代码放在 DocumentFilter 类中,它将删除所有操作,而不管给定的 URL 是什么。
- 所以我们在最后一步,你基本上可以做你想要的逻辑。
在 ( foreach (var apiDescription in apiExplorer.ApiDescriptions)
) 中,您可以播放并执行您的自定义逻辑。您有权访问HttpContext.Current
,因此您可以获得当前 URL。
如果您不想删除当前操作,请在swaggerDoc.paths.Remove(route);
.
bool forDelete = false; // your custom logic when it should be deleted
if (!forDelete)
{
return;
}
希望这对您有所帮助。
推荐阅读
- python - PyPDF2:PdfFileMerger 多次合并文件
- python - 如何在python中循环访问语料库中的pdf
- python - Swagger-codegen - 如何自定义客户端 SDK 调用名称?
- c# - HttpResponseMessage 使用 C# 发布 API json 格式
- vue.js - 如何在 Vue.js 中进行分页的上一个和下一个?
- owasp - ModSecurity:忽略数组 ARGS
- java - 为什么我只能从表中获取一条记录?
- machine-learning - Python SKLearn 训练测试数据
- regex - 正则表达式在后面加上单个空格的单个反斜杠
- powerbi - 如何在 Powerbi 中实现列级安全性?