用Swagger隐藏服务

时间:2016-12-08 10:28:20

标签: c# .net swagger swagger-ui

有什么方法可以在进入生产时从swagger UI隐藏某些服务但是在localhost上运行时会显示?

EX:

    /// <summary>
    /// GET: .../api/SomeController/{id: int}
    /// </summary>
    /// <param name="id">int</param>
    /// <returns></returns>
public IHttpActionResult SomeService(int id) { return Ok();}

当我在我的环境中运行并转向swagger UI localhost:12345/swagger/ui/index时,我会看到该服务文档等, 但是当我在http://someDomain/swagger/ui/index时,我不会看到它。

我一直在查看文档,但没有找到与此相关的任何内容。

谢谢。

1 个答案:

答案 0 :(得分:3)

您可以创建自己的属性并使用它从swagger中排除该方法或整个控制器:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
public class HideInDocsAttribute:Attribute
{
}

然后:

public class HideInDocsFilter:IDocumentFilter
{
    public void Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, IApiExplorer apiExplorer, IHostingEnvironment env)
    {
        if(env.IsEnvironment("Production")) {
            foreach (var apiDescription in apiExplorer.ApiDescriptions)
            {
                if (!apiDescription.ActionDescriptor.ControllerDescriptor.GetCustomAttributes<HideInDocsAttribute>().Any() && !apiDescription.ActionDescriptor.GetCustomAttributes<HideInDocsAttribute>().Any()) continue;
                var route = "/" + apiDescription.Route.RouteTemplate.TrimEnd('/');
                swaggerDoc.paths.Remove(route);
            }
        }            
    }
}