AspNetCore 2.2 Пользовательский / Явный Swagger OperationId - PullRequest
0 голосов
/ 21 января 2019

Я создаю успокоительные API, используя ядро ​​aspnet 2.2.У меня есть стандартная установка, где каждая модель имеет свой собственный контроллер с действиями GET и POST.Я использую Swashbuckle.AspNetCore NUGET пакет и использую эту статью из документации Microsoft.

Теперь, когда я смотрю на сгенерированный файл чванства, он имеет несколько идентификаторов операций GET и POST.Как настроить пользовательские идентификаторы операций без использования Swashbuckle.AspNetCore.Annotations?

Вот как выглядят мои методы Action:

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

У меня несколько контроллеров, все они следуют одному и тому же шаблону.

Мой класс запуска выглядит так:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    services.AddSwaggerGen(c =>
    {
        c.SwaggerDoc("v1", new Info { Title = "My API", Version = "v1" });
    });

    ...
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseSwagger();

    app.UseSwaggerUI(c =>
    {
        c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
    });

    ...
}

Я уже рассмотрел это решение, но не хочу идти по этому пути.

1 Ответ

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

Потратив пару часов, пытаясь найти лучшее решение, я нашел 2 подхода:

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

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

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

Вариант 2 : на основе ActionFilter / Attribute - вы можете настроить каждый метод Action (как вы это сделали бы с SwaggerOperation фильтром действий, просто добавив свойство 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

Swashbuckle.AspNetCore документацию можно найти здесь

...