Как я могу сделать url-путь в Swashbuckle / Swaggerwork, когда api обслуживается изнутри другого проекта?

все. Я пытаюсь документировать WebApi 2 с помощью пакета Swashbuckle.

все отлично работает, если API работает сам по себе, т. е. localhost / api / swagger приводит меня к ui и localhost/api/swagger/docs / v1 в json.

однако приложение producation инициализирует этот же проект Webapi, запустив метод webapiconfig этого проекта из global.асакс.cs в другом-теперь веб-проект (основное приложение). Таким образом, url api выглядит так localhost/web / api вместо localhost / api.

теперь swashbuckle работает совсем не так.

  • localhost / api / swagger генерирует ошибку не удается загрузить 'API-интерфейс.WebApiApplication', ну конечно
  • localhost / web / swagger = 404
  • localhost / web / api / swagger = 404

Я пытался искать везде, но все, что я нашел, это обходной путь.

c.RootUrl(req => req.RequestUri.GetLeftPart(UriPartial.Authority) + VirtualPathUtility.ToAbsolute("~/").TrimEnd('/'));

к сожалению, это не работает, может, сейчас должен и мне просто нужно что-то изменить, но я даже не знаю, что именно ожидает это свойство и на что оно должно быть установлено.

может быть, это даже не применимо - возможно, настройка у нас требует чего-то еще или некоторых изменений кода swashbuckle.

Я буду признателен за любую помощь вы можете предоставить. Мне действительно начинает нравиться swagger (и swashbuckle) для документации rest.

1 ответов


Для Swashbuckle 5.x:

это, по-видимому, установлено метод расширения httpConfiguration называется EnableSwagger. Swashbuckle 5.x миграция readme отмечает, что это заменяет SwaggerSpecConfig. SwaggerDocConfig RootUrl() специально заменяет ResolveBasePathUsing () из 4.x.

это практически работает так же, как и раньше, похоже, что самым большим изменением было переименование и перемещение в SwaggerDocConfig:

public void RootUrl(Func<HttpRequestMessage, string> rootUrlResolver)

пример readme, для краткости:

string myCustomBasePath = @"http://mycustombasepath.com";

httpConfiguration
    .EnableSwagger(c =>
        {
            c.RootUrl(req => myCustomBasePath);

            // The rest of your additional metadata goes here
        });

Для Swashbuckle 4.x:

используйте SwaggerSpecConfig ResolveBasePathUsing и попросите лямбду прочитать известную конечную точку.

ResolveBasePathUsing:

public SwaggerSpecConfig ResolveBasePathUsing(Func<HttpRequestMessage, string> basePathResolver);

мой API находится за балансировщиком нагрузки, и это было полезным обходным путем для предоставления базового адреса. Вот глупый пример используйте ResolveBasePathUsing для разрешения пути с известным базовым путем.

string myCustomBasePath = @"http://mycustombasepath.com";

SwaggerSpecConfig.Customize(c =>
{
    c.ResolveBasePathUsing((req) => myCustomBasePath);
}

Я жестко закодировал конечную точку для ясности, но вы можете определить ее в любом месте. Вы можете даже используйте объект запроса, чтобы попытаться очистить uri запроса указать на /web / api вместо / api.

разработчик прокомментировал это решение на GitHub в прошлом году:

лямбда принимает текущий HttpRequest (т. е. запрос для данного Swagger ApiDeclaration) и должен возвращать строку, которая будет использоваться как baseUrl для вашего Api. Для приложений с балансировкой нагрузки это должно возвращать путь балансировщика нагрузки.

реализация по умолчанию выглядит следующим образом:

(req) => req.RequestUri.GetLeftPart(UriPartial.Authority) +  req.GetConfiguration().VirtualPathRoot.TrimEnd('/');

...

относительные пути Re, спецификация Swagger требует абсолютных путей, потому что URL-адрес, по которому подается Swagger, не должен быть URL-адресом фактический интерфейс API.

...

лямбда это передал экземпляр HttpRequestMessage ... вы должны иметь возможность использовать это, чтобы добраться до RequestUri и т. д. Другой вариант, вы можете просто разместить имя хоста в своем интернете.config и пусть лямбда просто прочитает его оттуда.