Ситуация:
У меня есть веб-API .NET Core 3.1. Я хочу разместить его на IIS на сервере. В IIS у меня есть основной сайт, и я хочу, чтобы API размещался ПОД сайтом. например
Адрес будет, например. https://сайт1/апи
Теперь, по какой-то причине, я не могу заставить swagger работать должным образом. Я использую NuGet Swashbuckle.AspNetCore.
Сервер
Я установил пакет хостинга ядра asp.net, IIS настроен, и я могу получить доступ к сайту.
КонфигурироватьСервисы()
Настроить()
ИИС
2 пула приложений:
Я делал это миллион раз, как в примере с Configure(), но он просто не хочет работать.
Я пробую разные вещи, но получаю смесь ошибок, например:
и т. д...
Я пробовал много решений, таких как:
Если я сделаю это, а также изменю launchSettings.json launchUrl на «api», то локально все будет в порядке, хотя гиперссылка в пользовательском интерфейсе Swagger не работает.
Если я публикую это изменение в IIS, то ни swagger.json, ни index.html не отображаются, я получаю ошибку 404.
Я размещал такие веб-API десятки раз, и ЕДИНСТВЕННАЯ вещь, которую мне когда-либо нужно было сделать, это изменить конечную точку swagger, но по какой-то причине на этот раз это не работает.
Я ценю любую помощь.
Что я также пробовал
Я пробую эти ситуации с помощью launchSettings.json launchUrl, установленного на «api».
#1
var swaggerEndpoint = "/swagger/v1/swagger.json";
var routePrefix = "api";
Локально:
http://localhost:50473/api/index.html загружается, НО swagger.json создается в корневой папке (http://localhost:50473/swagger/v1/swagger.json)
В ИИС: index.html не загружается, но swagger.json генерируется правильно (api/swagger/v1/swagger.json)
#2
var swaggerEndpoint = "swagger/v1/swagger.json";
var routePrefix = "api";
app.UseSwagger(c =>
{
c.RouteTemplate = "api/swagger/{documentName}/swagger.json";
});
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint(swaggerEndpoint, "Loyalty API");
c.RoutePrefix = routePrefix;
});
На этот раз я установил RouteTemplate и изменил swaggerEndpoints.
Локально:
index.html загружается, swagger.json генерируется по URL-адресу /api (http://localhost:50473/api/swagger/v1/swagger.json), хотя я не уверен в гиперссылке, поскольку она показывает полный URL
Обратите внимание, что в swaggerEndpoint нет косой черты с префиксом.
ИИС:
Это решение не работает при размещении в IIS. Ни index.html не отображается, ни swagger.json не создается.
@JasonPan хорошо, у меня было предложение if, чтобы проверить, является ли среда dev и test отдельно, но я попробовал решение по ссылке, оно не сработало.
Итак, я понятия не имею, почему, но мое оригинальное решение работает.
var routePrefix = string.Empty;
var swaggerEndpoint = "/swagger/v1/swagger.json";
if (env.IsEnvironment("Test"))
{
swaggerEndpoint = "/api/swagger/v1/swagger.json";
}
app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint(swaggerEndpoint, "Loyalty API");
c.RoutePrefix = routePrefix;
});
Либо я что-то пропустил, либо у меня сгорел мозг. Я МОЖЕТ не установить RoutePrefix при изменении swaggerEndpoint.