首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASP.NET Web Swagger,创建多个视图

ASP.NET Web Swagger,创建多个视图
EN

Stack Overflow用户
提问于 2020-04-09 20:37:06
回答 1查看 73关注 0票数 1

我正在使用带有ASP.NET Web API应用程序的Swagger。

Swagger列出所有控制器和在这些控制器中定义的操作。假设我有五个控制器,每个控制器都有一个操作。我想创建多个视图,这样当

用户说http://localhost:5000/swagger/v1他可以看到所有控制器当用户说http://localhost:5000/swagger/v2他只能看到一个控制器当用户说http://localhost:5000/swagger/v3他只能看到两个控制器

基本上,我试图通过swagger限制对控制器的访问。根据用户要求,我将与他们分享具体的网址。

有没有可能用Swagger实现这一点?

EN

回答 1

Stack Overflow用户

发布于 2020-04-09 21:09:58

是的,你可以做任何你想做的事情。

您应该执行以下步骤:

  1. 创建从IDocumentFilter继承的类,并在SwaggerConfig.cs中注册它,如下所示c.DocumentFilter<HideSwaggerEndpointsDocumentFilter>();

示例:

代码语言:javascript
复制
public class HideSwaggerEndpointsDocumentFilter : IDocumentFilter
{
    public void Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, IApiExplorer apiExplorer)
    {
    //enter code here
    }
}

一旦加载swagger页面,就会加载此过滤器。在它里面,你可以控制每一个控制器的动作。您可以根据您决定的任何条件删除某些操作。

  1. 删除它们有点棘手,我这样做:

代码语言:javascript
复制
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是什么。

  1. ,所以我们已经到了最后一步,你基本上是在做你想要的逻辑。

在(foreach (var apiDescription in apiExplorer.ApiDescriptions))中,您可以播放和执行您的自定义逻辑。您可以访问HttpContext.Current,因此可以获取当前的URL。

如果你不想删除当前的操作,可以在swaggerDoc.paths.Remove(route);之前这样做。

代码语言:javascript
复制
bool forDelete = false; // your custom logic when it should be deleted
if (!forDelete)
{
    return;
}

希望这对你有帮助。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61121314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档