Попытка настроить swagger в сочетании с веб-приложением, размещенным на IIS Express. API построен с использованием ASP Net Core. Я выполнил инструкции, указанные на соответствующей странице справки Microsoft в отношении Swashbuckle и ASP.NET Core.
До сих пор у меня загружалась страница swagger, и я вижу, что SwaggerDoc, который я определил, загружается, однако API отсутствуют. В настоящее время я получаю следующую ошибку:
"Fetch error undefined ./swagger/v1/swagger.json"
public class Startup
{
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
// services.AddDbContext<TodoContext>(opt =>
// opt.UseInMemoryDatabase("TodoList"));
services.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
// Register the Swagger generator, defining 1 or more Swagger documents
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new Info { Title = "API WSVAP (WebSmartView)", Version = "v1" });
});
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
// Enable middleware to serve generated Swagger as a JSON endpoint.
app.UseSwagger();
// Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.),
// specifying the Swagger JSON endpoint.
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("./swagger/v1/swagger.json", "My API V1");
c.RoutePrefix = string.Empty;
});
app.UseMvc();
}
}
Используйте c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
jPhizzle — это осталось от предыдущих попыток устранения неполадок. Я обновил код. Извинения
Akash KC - я пробовал это изначально, к сожалению, без изменений.
Что за сообщение об ошибке на вкладке «Консоль» в инструментах разработки браузера?
'Не удалось загрузить ресурс: сервер ответил со статусом 404 () ... swagger/v1/swagger.json:1 '
@Helen, по какой-то причине мне не пришло в голову проверить DevTools ... Из-за вашего комментария я узнал, что Swagger не нравится, что у меня конфликт с двумя DTO с одинаковым именем. Они находятся в разных пространствах имен, но, видимо, этого недостаточно. В любом случае, спасибо за идею, где проверить!





Итак, после долгих поисков и устранения неполадок все сводилось к двум вещам, но я чувствую, что в целом это может быть полезно кому-то еще в будущем, поэтому я публикую ответ.
Во-первых, если вы когда-либо застряли с вышеупомянутой ошибкой, лучший способ увидеть, что происходит, — добавить следующую строку в ваш метод Configure().
app.UseDeveloperExceptionPage();
Теперь, если вы перейдете на страницу «swagger/v1/swagger.json», вы должны увидеть дополнительную информацию, которая укажет вам полезное направление.
Во-вторых, теперь для меня ошибка была чем-то вроде строк
'Multiple operations with path 'some_path' and method 'GET' '
Однако эти API были расположены внутри библиотек зависимостей, поэтому я не смог применить решение в момент определения. В качестве обходного пути я обнаружил, что добавление следующей строки в ваш метод ConfigureServices() решило проблему.
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new Info { Title = "API WSVAP (WebSmartView)", Version = "v1" });
c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First()); //This line
});
Наконец-то после всего этого я смог сгенерировать файл JSON, но все же не смог открыть пользовательский интерфейс. Чтобы это заработало, мне пришлось изменить конечную точку в Configure()
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("./v1/swagger.json", "My API V1"); //originally "./swagger/v1/swagger.json"
});
Я не уверен, почему это было необходимо, хотя, возможно, стоит отметить, что виртуальный каталог веб-приложения размещен в IIS, что может иметь эффект.
ПРИМЕЧАНИЕ. Переход к swagger/v1/swagger.json даст вам более подробную информацию, для меня это вызывало проблему из-за необработанного действия. Эта информация упоминается в комментарии @MarkD
Надеюсь, это поможет кому-то в будущем.
переход непосредственно к swagger/v1/swagger.json решил эту проблему. Недекорированное действие.
Переход к swagger/v1/swagger.json также дал мне решение моей проблемы — для действия требовался явный атрибут [HttpGet]
Перейдите к файлу swagger.json вашего приложения в браузере, чтобы четко показать ошибку. локальный: 808/swagger/v1/swagger.json
добавление этой строки ResolveConflictingActions решило мою проблему.
Я также изменил тот же путь конечной точки на "./v1/swagger...", чтобы заставить его работать на веб-сервере. Очень странное требование. Новый путь отлично работает в локальной отладке и на сервере. Похоже, это будет значение по умолчанию из шаблона проекта.
У меня была аналогичная проблема, я решил ее, используя атрибут Route в методе контроллера-нарушителя:
[HttpGet, Route("Throw")]
public ActionResult<string> Throw()
{
_logger.LogInformation("I think I am going to throw up");
throw new NotSupportedException("For testing unhandled exception logging.");
}
Я чувствовал, что ResolveConflictingActions потенциально может замести реальную проблему под ковер.
В моем случае в классе Controller было 2 метода с одинаковыми аннотациями и URL. (Наша команда использовала Entity Framework, ASP.NET и Swagger.)
[HttpGet("GetMyGreatData/{patientId}")]
[ValidatePatient]
public async Task<ActionResult<ServiceResponse<IEnumerable<MyGreatModel>>>> GetMyGreatData(
[FromRoute] int patientId, int offset = 0, int limit = 0)
{
//method details...
}
[HttpGet("GetMyGreatData/{patientId}")]
[ValidatePatient]
public async Task<ActionResult<ServiceResponse<IEnumerable<MyGreatModel>>>> GetMyGreatData(
[FromRoute] int patientId,
[FromQuery] DateTimeOffset? startdate = null,
[FromQuery] DateTimeOffset? endDate = null,
int offset = 0,
int limit = 0)
{
//method details...
}
удаление одного метода решило проблему для меня.
У меня было две проблемы, которые вызвали одну и ту же ошибку.
У меня есть два класса с одинаковым именем в двух разных пространствах имен. Swagger не смог согласовать это при создании документа swagger. Чтобы исправить это, я добавил строку options.CustomSchemaIds(x => x.FullName);Смотрите объяснение здесь
У меня был метод без аннотации [HttpGet]. Swagger требует явного определения конечных точек HTTP.
Я обнаружил обе проблемы, проверив вывод в Visual Studio после загрузки API.
Я только что потратил два часа на эту проблему, но моя причина была совершенно другой, она не имела НИЧЕГО общего с маршрутами или аннотациями. У меня было 2 класса с одинаковым именем (но разными пространствами имен): MyProject.Common.ClassName и MyProject.Api.ClassName. Swagger/swashbuckle не мог определить разницу между ними, поэтому я получил эту бесполезную ошибку.
Эти 2 часа были потрачены на метод проб и ошибок, комментирующий контроллеры и конечные точки, чтобы, наконец, найти 3 конечные точки, нарушающие конечные точки. Все 3 конечные точки имели разные маршруты, разные (или отсутствовали) авторизацию и разные имена методов. Оказалось, что все 3 конечные точки либо принимали параметр, либо возвращали объект, содержащий версию API моего класса. Нигде не использовалась Общая версия. Сваггер не мог отличить их друг от друга, и его вырвало на себя.
Почему, почему Swagger или Swashbuckle не могут предоставить фактические сообщения об ошибках? Сэкономил бы пару часов...
Я работал с .Net Core 3.1 и потратил некоторое время, чтобы выяснить и понять, что происходит.
Проблема может возникнуть по разным причинам:
Ошибки конфигурации Swagger
Классы с одинаковыми именами, но в разных пространствах имен
Публичные методы без атрибута rest (Get, Post и т.д.)
Во-первых, взгляните на ссылку ниже, чтобы проверить, все ли в порядке с вашей настройкой:
Добавьте документацию API Swagger (OpenAPI) в ASP.NET Core 3.1.
Потом,
Хороший совет, чтобы выяснить проблему, — запустить приложение без использования IISExpress и проверить журнал консоли. Любая ошибка, обнаруженная при создании документации, будет отображаться там.
В моем случае проблема заключалась в том, что у меня был публичный метод (который должен быть приватным) без каких-либо остальных атрибутов:
После изменения метода с публичного на частный я решаю проблему.
Для меня это был номер три. «Общие методы без остатка атрибута». Вы мне очень помогаете. Спасибо!
Другая причина, с которой я только что столкнулся, заключается в том, что имя атрибута [HttpPost("NAME_HERE") не совпадает с именем действия.
Для меня это были «Классы с одинаковым именем, но в разных пространствах имен». У меня есть .Net Core Api и класс «Пользователь» в двух разных пространствах имен. Переименование второго исправило проблему
Для меня это номер 3. Спасибо.
для меня это был номер 2. В итоге мне пришлось немного смазать названия вещей, что было немного грустно, но понятно.
Я сталкивался с той же ошибкой раньше, после попыток найти причину, я обнаружил, что один из моих API в одном из моих контроллеров не имеет HTTP-глагола в качестве атрибута, поэтому я исправил это, поместив [HttpGet] в свой API. Итак, вот мой совет, проверьте свои контроллеры API, возможно, вы забываете то же самое, что и я!
Взгляните на мой код, я понял, что должен изменить это:
public async Task<Product> ProductDetail(int id)
{
return await _productQueries.GetProductDetail(id);
}
к этому:
[Route("ProductDetail")]
[HttpPost]
public async Task<Product> ProductDetail(int id)
{
return await _productQueries.GetProductDetail(id);
}
У меня была такая же проблема, базовый контроллер не был украшен Http, и его удаление заставило его работать.
Еще лучшим решением является украшение класса/контроллера, выпустившего ошибку, с помощью ApiExplorerSettings (IgnoreApi = true)]
Просто перейдите к https://localhost:{PortNo}/swagger/v1/swagger.json и получите более подробную информацию о сообщении об ошибке.
Спасибо!!! моей проблемой был ODataController со следующей ошибкой: типы носителей не найдены в Microsoft.AspNet.OData.Formatter.ODataInputFormatter.SupportedMediaTypes
У меня была проблема с конфликтующими путями. Это показало это очень ясно. Спасибо!
это сработало и помогло мне найти исключение
Эта ошибка может возникнуть при развертывании службы приложений в Лазурный. Я повторно развернул службу приложений в Azure, и ошибка исчезла.
Когда это случилось со мной, я отследил его до параметра URL-адреса, имеющего подчеркивание, которое совместимо с генератором asp.
Изменение этого:
/block-content/{machine_name}:
К этому
/block-content/{machineName}:
Решил это для меня
Я просто забыл добавить атрибуты HTTP в свой контроллер, как только я добавлю атрибут HTTP, он работает как шарм для меня.

Источник : https://www.benday.com/2020/12/16/webapi-core-swagger-failed-to-load-api-definition-error/
Укажите источник как минимум benday.com/2020/12/16/…
У меня была та же проблема, поэтому я проверил ее с помощью элемента проверки в браузере. На вкладке «Консоль» показан файл, из которого возникла проблема (v1/swagger/json:1). Открытие его щелчком показало, что одним из вспомогательных методов, которые я использовал в своем контроллере, был «Общий». Изменение его на «Частный» решило проблему для меня.
На этой странице также есть полезные советы: https://btrehberi.com/swagger-failed-to-load-api-definition-fetch-error-undefined-hatasi-cozumu/yazilim/
Swagger в моем случае нуждался в [HttpAction] со всеми открытыми членами в контроллере. К сожалению, я неправильно написал имя конструктора, и, поскольку он был общедоступным, выдавал эту ошибку.
Для ASP.NET Core 3.1 мне нужно было убедиться, что глагол не является двусмысленным, и я обнаружил это, сначала запустив проект API без IIS в VS2019 (зеленая стрелка> щелкните левой кнопкой мыши значок моркови и выберите имя проекта, это вызывает окно консоли, которое появится при запуске, чтобы вы могли проверить, что происходит, и увидеть ошибки).
[HttpGet("MyEndPointA")
Тогда Swagger сможет правильно сгенерировать документацию.
<b>make sure the name "v1" matches the path in the swagger endpoint</b>
<p>
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo {
Title = "ODAAPP",
Version = "v1" });
});
</p>
<br/>
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json",
"ODAAPP v1"));
enter code hereЯ работал с .NET 5 и потратил некоторое время, пытаясь понять, что происходит.
Я получил ошибку, как показано ниже:
Затем я решил эту проблему следующим образом:
Откройте файл startup.cs Добавьте следующий код в метод Настроить
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseSwagger(c =>
{
c.RouteTemplate = "/swagger/{documentName}/swagger.json";
});
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "API v1"));
}
А в методе Конфигуресервисс
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "API", Version = "v1" });
c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());
});
Спасибо TheCodeBuzz за Решено: не удалось загрузить определение API (не определено /swagger/v1/swagger.json).
Обратите внимание на разницу между строкой RouteTemplate и строкой SwaggerEndpoint. Один использует {documentName}, а другой использует "v1" как литерал.
Это также произойдет, если вы используете один и тот же маршрут для нескольких методов действия (перегрузка в порядке).
В моем случае проект был настроен для аутентификации с использованием сервера идентификации 4 с использованием AddPolicy() в startup.cs, и было использование [Authorize]
Я удалил вещи для startup.cs и использование [Authorize]
Скоро обновлю больше
Конечно, это один из методов контроллера, который неисправен. Чтобы получить метод, иногда вам может потребоваться вынуть все ваши контроллеры. Попробуйте вставить их один за другим, а затем вы будете тестировать, чтобы найти контроллер с ошибками.
Например Если у вас есть как 3Controllers говорят
>Controller
>>>AuthController
>>>UserController
>>>HomeControllerВыньте два из контроллеров и протестируйте контроллер, добавляя один контроллер после каждого успешного тестирования. С этим вы будете знать контроллер, у которого есть неисправный метод.
>Controller
>>>AuthController>Controller
>>>AuthController
>>>UserControllerи провести следующую проверку на контроллере как у Authen.
В моем случае у меня было два идентичных внутренних класса. Извлек их в одно, отрефакторил пространства имен и вуаля, все вернулось к нормальной работе.
Я столкнулся с той же ошибкой, когда использовал Swagger, а также Microsoft.AspNetCore.OData. Обычно я стараюсь использовать последнюю версию, но снижение ее до версии 7.5.12 решило мою проблему.
Также добавление следующего к каждому методу действия в контроллере позволяет ему работать и с OData v8.x: [HttpGet], [HttpPost] или [ApiExplorerSettings(IgnoreApi = true)].
У меня был аналогичный Ошибка извлечения 404 swagger/v1/swagger.json при попытке интегрировать документацию Swagger в проект веб-API ASP.NET Core 3.1. Я попробовал почти все вышеперечисленные предложения, но потерпел неудачу. После часа испытаний я решил попробовать NSwag, используя эта ссылка вместо Свашбакл, и это сработало как по маслу :)
У меня похожие проблемы - основная причина в том, что я забыл добавить аннотации :-(
Причины этой ошибки
я решил эту проблему таким образом
Используйте атрибут [HttpGet] над методом контроллера API.
И, из-за разных версий swashbuckle, могут появляться эти ошибки.
вы должны использовать правильный URL-адрес конечной точки swagger
v1/swagger.json or swagger/v1/swagger.json
выберите выше один в зависимости от версии, которую вы используете.
Примечание:
Используйте этот URL для справки https://myget.org/feed/domaindrivendev/package/nuget/Swashbuckle.AspNetCore.Swagger/6.2.3-preview-1963
Обратитесь к официальной документации swagger. там много информации с кристально чистыми документами https://swagger.io/docs/
'Multiple operations with path 'some_path' and method 'GET' '
[HttpGet]
public IActionResult Get()
{
return Ok(_userService.Get());
}
[HttpGet]
public IActionResult Get(int Id)
{
return Ok(_userService.Get(Id));
}
Просто измените DataAnnotation:
[HttpGet]
public IActionResult Get()
{
return Ok(_userService.Get());
}
[HttpGet("{Id}"] //HERE
public IActionResult Get(int Id)
{
return Ok(_userService.Get(Id));
}
У меня была такая же ошибка, и что исправлено, так это добавление атрибута [HttpGet] в мой контроллер.
Можете ли вы объяснить, что происходит в Startup, где вы назначаете интерфейс классу Configuration?