首页 > 解决方案 > 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 实现这一目标?

标签: asp.net-web-apiswaggerswagger-uiswagger-2.0

解决方案


是的,你可以做你想做的事。

您应该执行以下步骤:

  1. 创建一个继承自的类IDocumentFilter并将其注册SwaggerConfig.cs如下c.DocumentFilter<HideSwaggerEndpointsDocumentFilter>();

例子:

public class HideSwaggerEndpointsDocumentFilter : IDocumentFilter
{
    public void Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, IApiExplorer apiExplorer)
    {
    //enter code here
    }
}

加载 swagger 页面后会加载此过滤器。在其中,您可以控制每个控制器操作。您可以根据您决定的任何标准删除一些操作。

  1. 删除它们有点棘手,我这样做如下:
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);.

bool forDelete = false; // your custom logic when it should be deleted
if (!forDelete)
{
    return;
}

希望这对您有所帮助。


推荐阅读