Да, вы можете делать именно то, что вы хотите.
Вы должны выполнить следующие шаги:
- Создать класс, который наследуется от
IDocumentFilter
и зарегистрировать его в SwaggerConfig.cs
следующим образом c.DocumentFilter<HideSwaggerEndpointsDocumentFilter>();
Пример:
public class HideSwaggerEndpointsDocumentFilter : IDocumentFilter
{
public void Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, IApiExplorer apiExplorer)
{
//enter code here
}
}
Этот фильтр загружается после загрузки страницы чванства. Внутри него вы можете контролировать каждое действие контроллера. Вы можете удалить некоторые действия на основе любых критериев, выбранных вами.
Удалить их немного сложно, я делаю это следующим образом:
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.
Итак, мы находимся на последнем этапе, где вы в основном делаете желаемую логику c.
Внутри (foreach (var apiDescription in apiExplorer.ApiDescriptions)
) вы можете играть и делать свои собственные логи c. У вас есть доступ к HttpContext.Current
, поэтому вы можете получить текущий URL.
Если вы не хотите удалять текущее действие, сделайте что-то подобное до swaggerDoc.paths.Remove(route);
.
bool forDelete = false; // your custom logic when it should be deleted
if (!forDelete)
{
return;
}
Надеюсь, это поможет вам.