使用 Swagger 隐藏服务

Hiding services with Swagger

有什么方法可以在投入生产时隐藏某些服务以防招摇 UI 但在本地主机上显示 运行 时?

例如:

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

当我 运行 在我的环境中大摇大摆 UI localhost:12345/swagger/ui/index 我会看到服务文档等, 但是当我打开 http://someDomain/swagger/ui/index 时,我将看不到它。

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

谢谢。

您可以创建自己的属性并使用它从 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);
            }
        }            
    }
}