Asp.Net ядро ​​Swashbuckle установить идентификатор операции - PullRequest
0 голосов
/ 10 сентября 2018

Как мне установить атрибут swagger operationId в проекте Asp.Net Core 2.1?Согласно этой записи я должен использовать SwaggerOperationAttribute, но я не могу найти ее в библиотеке Swashbuckle.AspNetCore.Также есть IOperationFilter

  public interface IOperationFilter
  {
    void Apply(Operation operation, OperationFilterContext context);
  }

, и я не могу найти какие-либо реализации для генерации чванства.

Ответы [ 3 ]

0 голосов
/ 17 января 2019

Вы можете включить аннотацию на сваггере с помощью пакета nuget Swashbuckle.AspNetCore.Annotations.(https://github.com/domaindrivendev/Swashbuckle.AspNetCore/blob/master/README.md#swashbuckleaspnetcoreannotations)

Как только аннотации включены, вы можете обогатить сгенерированные метаданные операции, украсив действия атрибутом SwaggerOperationAttribute.

[HttpPost]

[SwaggerOperation(
    Summary = "Creates a new product",
    Description = "Requires admin privileges",
    OperationId = "CreateProduct",
    Tags = new[] { "Purchase", "Products" }
)]
public IActionResult Create([FromBody]Product product)
0 голосов
/ 21 января 2019

Есть 2 других варианта без необходимости написания дополнительного кода или добавления дополнительных зависимостей, таких как Swashbuckle.AspNetCore.Annotations

Опция 1 : на основе соглашения - SwaggerGen имеет возможность установить CustomOperationIds.Таким образом, вы можете просто настроить его на использование ControllerName_HttpMethod следующим образом:

services.AddSwaggerGen(c =>
{
    c.CustomOperationIds(e => $"{e.ActionDescriptor.RouteValues["controller"]}_{e.HttpMethod}");
    c.SwaggerDoc("v1", new Info { Title = "Test API", Version = "v1" });
});

Это добавит идентификатор операции ко всем вашим методам, следуя соглашению ControllerName_HttpMethod.

Вариант 2 : ActionFilter / Attribute based - вы можете настроить каждый метод Action (как вы сделали бы с SwaggerOperation filter action, просто добавив свойство Name в ваш HTTP-фильтр действий глагола, например:

[HttpPost(Name="Post_Person")]
[ProducesResponseType(200)]
[ProducesResponseType(400)]
[ProducesResponseType(500)]
public async Task<ActionResult<Response>> PostAsync([FromBody]Request request)
{
    Response result = await _context.PostAsync(request);
    return Ok(result);
}

Это работает точно так же, как [SwaggerOperation(OperationId = "Post_Person")], но без необходимости EnableAnnotations

0 голосов
/ 11 сентября 2018

Наконец, я пришел к этому решению:

public class SwaggerOperationNameFilter : IOperationFilter
{
    public void Apply(Operation operation, OperationFilterContext context)
    {
        operation.OperationId = context.MethodInfo.DeclaringType.GetCustomAttributes(true)
            .Union(context.MethodInfo.GetCustomAttributes(true))
            .OfType<SwaggerOperationAttribute>()
            .Select(a => a.OperationId)
            .FirstOrDefault();
    }
}

[AttributeUsage(AttributeTargets.Method)]
public sealed class SwaggerOperationAttribute : Attribute
{
    public SwaggerOperationAttribute(string operationId)
    {
        OperationId = operationId;
    }

    public string OperationId { get; }
}

// Startup.cs
services.AddSwaggerGen(c =>
{
    ...
    c.OperationFilter<SwaggerOperationNameFilter>();
};

[HttpGet("{id:int}")]
[SwaggerOperation("GetById")]
public async Task<IActionResult> Get(int id)
{
    ...
}

Но мне все еще кажется, что я заново изобрел колесо.

...