Как я могу сделать 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 и пусть лямбда просто прочитает его оттуда.