使用 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);
}
}
}
}
有什么方法可以在投入生产时隐藏某些服务以防招摇 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);
}
}
}
}