有什么方法可以在进入生产时从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时,我不会看到它。
我一直在查看文档,但没有找到与此相关的任何内容。
谢谢。
答案 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);
}
}
}
}