我正在使用带有ASP.NET Web API应用程序的Swagger。
Swagger列出所有控制器和在这些控制器中定义的操作。假设我有五个控制器,每个控制器都有一个操作。我想创建多个视图,这样当
用户说http://localhost:5000/swagger/v1他可以看到所有控制器当用户说http://localhost:5000/swagger/v2他只能看到一个控制器当用户说http://localhost:5000/swagger/v3他只能看到两个控制器
基本上,我试图通过swagger限制对控制器的访问。根据用户要求,我将与他们分享具体的网址。
有没有可能用Swagger实现这一点?
发布于 2020-04-09 21:09:58
是的,你可以做任何你想做的事情。
您应该执行以下步骤:
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;
}希望这对你有帮助。
https://stackoverflow.com/questions/61121314
复制相似问题