Какова цель параметра EnableSwagger routeTemplate?

Я пытаюсь решить проблему, когда мои контроллеры украшены RoutePrefix следующим образом:

[RoutePrefix("api/v{version:apiVersion}/users")]

Но Swagger отображает URL в оглавлении следующим образом:

/api/v{version}/users/search

Я экспериментировал с параметром EnableSwagger routeTemplate, но в итоге получил ошибки, отображаемые во встроенных комментариях ниже:

GlobalConfiguration.Configuration
    .EnableSwagger(
    //"v{version:apiVersion}",  //A potentially dangerous Request.Path value was detected from the client (:).
    //"v{version}",             //Can't read swagger JSON from http://localhost:52056/v{version}
    //"{version}",              //Can't read swagger JSON from http://localhost:52056/{version}
    //"v2",                     //Can't read swagger JSON from http://localhost:52056/v2
    c =>
    {
        //...
    }
}

Как правильно использовать параметр EnableSwagger routeTemplate? И к каким типам сценариев использования предназначен этот параметр? Этот параметр предназначен для решения конкретной проблемы, которую я описал? Или я пытаюсь использовать этот параметр неправильно или неправильно?

1 ответ

Насколько я понимаю, это позволяет не задавать настройку маршрутов традиционными конфигами маршрутов ASP.NET MVC/Web API, например:

config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

Хотя вы можете найти что-то подобное в WebApiConfig.cs файл, вы можете изменить путь для конечных точек Swagger JSON, используя RouteTemplate,

Из файла Readme:

По умолчанию Swagger JSON будет представлен по следующему маршруту - "/swagger/ enjdocumentName‹/swagger.json". При необходимости вы можете изменить это при включении промежуточного программного обеспечения Swagger. Пользовательские маршруты ДОЛЖНЫ включать параметр {documentName}.

app.UseSwagger(c =>
{
    c.RouteTemplate = "api-docs/{documentName}/swagger.json";
});

ПРИМЕЧАНИЕ. Если вы используете промежуточное ПО SwaggerUI, вам также необходимо обновить его конфигурацию, чтобы отразить новые конечные точки:

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

Для API управления версиями вы можете написать собственный распознаватель, скорее всего. И к этому моменту, я думаю, вы сделали это немного сложнее для себя, версионируя свои API так. Если вы просто создали v1/{resource} а также v2/{resource} Вы могли бы, конечно, написать собственный распознаватель, чтобы посмотреть версию в маршруте и использовать c.MultipleApiVersions() API, чтобы связать все по маршруту.

Другие вопросы по тегам