Проблемы .NET Core 3.1 Swagger с IIS

Ситуация:

У меня есть веб-API .NET Core 3.1. Я хочу разместить его на IIS на сервере. В IIS у меня есть основной сайт, и я хочу, чтобы API размещался ПОД сайтом. например

  • Сайт1
    • Апи

Адрес будет, например. https://сайт1/апи

Теперь, по какой-то причине, я не могу заставить swagger работать должным образом. Я использую NuGet Swashbuckle.AspNetCore.

Сервер

Я установил пакет хостинга ядра asp.net, IIS настроен, и я могу получить доступ к сайту.

КонфигурироватьСервисы()

Настроить()

ИИС

2 пула приложений:

  • первый для основного сайта, .NET CLR v4.0, интегрированный конвейер
  • второй для веб-API, без управляемого кода, интегрированный конвейер

Я делал это миллион раз, как в примере с Configure(), но он просто не хочет работать.

Я пробую разные вещи, но получаю смесь ошибок, например:

  • index.html выдает ошибку «статус ответа 404 /swagger/v1/swagger.json», но URL-адрес .json существует
  • index.html выдает ошибку «undefined /swagger/v1/swagger.json», но URL-адрес .json существует

и т. д...

Я пробовал много решений, таких как:

  • использование связанного пути в SwaggerEndpoint - не работает, путь просто отображается как буквальная строка
  • установка RouteTemplate в app.UseSwagger() - мне НИКОГДА не приходилось этого делать, но все же это не работает
  • Попытался изменить маршрут swagger по умолчанию - я попробовал это локально, а также изменил launchSettings.json launchUrl на «api». Я могу получить доступ к файлу swagger.json, но index.html выдает ошибку 404.
  • Согласно документации Microsoft, «При использовании каталогов с IIS или обратным прокси-сервером установите конечную точку Swagger на относительный путь, используя префикс ./. Например, ./swagger/v1/swagger.json».

Если я сделаю это, а также изменю 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 не создается.

Можешь попробовать?
Jason Pan 18.04.2023 13:24

@JasonPan хорошо, у меня было предложение if, чтобы проверить, является ли среда dev и test отдельно, но я попробовал решение по ссылке, оно не сработало.

daily_driver 18.04.2023 14:16
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
132
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, я понятия не имею, почему, но мое оригинальное решение работает.

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.

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