Swagger не загружается - не удалось загрузить определение API: ошибка выборки не определена

Попытка настроить 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();
    }
}

Можете ли вы объяснить, что происходит в Startup, где вы назначаете интерфейс классу Configuration?

jPhizzle 02.07.2019 22:33

Используйте c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");

Akash KC 02.07.2019 22:34

jPhizzle — это осталось от предыдущих попыток устранения неполадок. Я обновил код. Извинения

Jeremy S. 02.07.2019 22:42

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

Jeremy S. 02.07.2019 22:51

Что за сообщение об ошибке на вкладке «Консоль» в инструментах разработки браузера?

Helen 03.07.2019 12:02

'Не удалось загрузить ресурс: сервер ответил со статусом 404 () ... swagger/v1/swagger.json:1 '

Jeremy S. 03.07.2019 15:04

@Helen, по какой-то причине мне не пришло в голову проверить DevTools ... Из-за вашего комментария я узнал, что Swagger не нравится, что у меня конфликт с двумя DTO с одинаковым именем. Они находятся в разных пространствах имен, но, видимо, этого недостаточно. В любом случае, спасибо за идею, где проверить!

Mike Devenney 19.02.2021 15:56
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
72
7
122 287
30
Перейти к ответу Данный вопрос помечен как решенный

Ответы 30

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

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

Во-первых, если вы когда-либо застряли с вышеупомянутой ошибкой, лучший способ увидеть, что происходит, — добавить следующую строку в ваш метод 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 решил эту проблему. Недекорированное действие.

MarkD 02.10.2020 05:17

Переход к swagger/v1/swagger.json также дал мне решение моей проблемы — для действия требовался явный атрибут [HttpGet]

Mog0 16.11.2020 12:37

Перейдите к файлу swagger.json вашего приложения в браузере, чтобы четко показать ошибку. локальный: 808/swagger/v1/swagger.json

Syed Mohamed 10.06.2021 10:18

добавление этой строки ResolveConflictingActions решило мою проблему.

Pranesh Janarthanan 20.06.2021 18:27

Я также изменил тот же путь конечной точки на "./v1/swagger...", чтобы заставить его работать на веб-сервере. Очень странное требование. Новый путь отлично работает в локальной отладке и на сервере. Похоже, это будет значение по умолчанию из шаблона проекта.

Matthew MacFarland 21.09.2021 23:07

У меня была аналогичная проблема, я решил ее, используя атрибут 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...
    }

удаление одного метода решило проблему для меня.

У меня было две проблемы, которые вызвали одну и ту же ошибку.

  1. У меня есть два класса с одинаковым именем в двух разных пространствах имен. Swagger не смог согласовать это при создании документа swagger. Чтобы исправить это, я добавил строку options.CustomSchemaIds(x => x.FullName);Смотрите объяснение здесь

  2. У меня был метод без аннотации [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 и потратил некоторое время, чтобы выяснить и понять, что происходит.

Проблема может возникнуть по разным причинам:

  1. Ошибки конфигурации Swagger

  2. Классы с одинаковыми именами, но в разных пространствах имен

  3. Публичные методы без атрибута rest (Get, Post и т.д.)

Во-первых, взгляните на ссылку ниже, чтобы проверить, все ли в порядке с вашей настройкой:

Добавьте документацию API Swagger (OpenAPI) в ASP.NET Core 3.1.

Потом,

Хороший совет, чтобы выяснить проблему, — запустить приложение без использования IISExpress и проверить журнал консоли. Любая ошибка, обнаруженная при создании документации, будет отображаться там.

В моем случае проблема заключалась в том, что у меня был публичный метод (который должен быть приватным) без каких-либо остальных атрибутов:

После изменения метода с публичного на частный я решаю проблему.

Для меня это был номер три. «Общие методы без остатка атрибута». Вы мне очень помогаете. Спасибо!

levi 27.10.2020 16:55

Другая причина, с которой я только что столкнулся, заключается в том, что имя атрибута [HttpPost("NAME_HERE") не совпадает с именем действия.

Marc Roussel 13.11.2020 18:18

Для меня это были «Классы с одинаковым именем, но в разных пространствах имен». У меня есть .Net Core Api и класс «Пользователь» в двух разных пространствах имен. Переименование второго исправило проблему

Moondog 2112 22.04.2021 13:23

Для меня это номер 3. Спасибо.

Mahdi Abyaznezhad 18.12.2021 13:16

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

JonK 16.02.2022 22:10

Я смог найти ошибку, открыв вкладку сети и посмотрев ответ для swagger.json.

Ты гений. Просто потратил впустую день, не смог найти ошибку, спасибо.

Hopeless 10.02.2021 00:57

Спасибо за это, большую помощь в моей отладке.

japes Sophey 07.06.2021 12:36

Я сталкивался с той же ошибкой раньше, после попыток найти причину, я обнаружил, что один из моих 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)]

Naod Agere 03.03.2021 01:27

Просто перейдите к https://localhost:{PortNo}/swagger/v1/swagger.json и получите более подробную информацию о сообщении об ошибке.

Спасибо!!! моей проблемой был ODataController со следующей ошибкой: типы носителей не найдены в Microsoft.AspNet.OData.Formatter.ODataInputFormatter.Suppor‌​tedMediaTypes

Júlio Almeida 29.04.2021 17:54

У меня была проблема с конфликтующими путями. Это показало это очень ясно. Спасибо!

Droobie 19.05.2021 20:13

это сработало и помогло мне найти исключение

Syed Mohamed 10.06.2021 10:18

Эта ошибка может возникнуть при развертывании службы приложений в Лазурный. Я повторно развернул службу приложений в Azure, и ошибка исчезла.

Когда это случилось со мной, я отследил его до параметра URL-адреса, имеющего подчеркивание, которое совместимо с генератором asp.

Изменение этого:

/block-content/{machine_name}:

К этому

/block-content/{machineName}:

Решил это для меня

также у меня была аналогичная проблема в .NET 5.0, я решил ее следующим образом:

Я добавил эту строку как атрибут над контроллером:

[Consumes("application/json")]

Я просто забыл добавить атрибуты HTTP в свой контроллер, как только я добавлю атрибут HTTP, он работает как шарм для меня.

Источник : https://www.benday.com/2020/12/16/webapi-core-swagger-failed-to-load-api-definition-error/

Укажите источник как минимум benday.com/2020/12/16/…

M Fuat 29.04.2021 14:13

У меня была та же проблема, поэтому я проверил ее с помощью элемента проверки в браузере. На вкладке «Консоль» показан файл, из которого возникла проблема (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 и потратил некоторое время, пытаясь понять, что происходит.

Я получил ошибку, как показано ниже:

Swagger Loading Error

Затем я решил эту проблему следующим образом:

Откройте файл 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]

Скоро обновлю больше

Решенная проблема в dotNet 6! Просто измените порядок атрибутов [ApiController]

Конечно, это один из методов контроллера, который неисправен. Чтобы получить метод, иногда вам может потребоваться вынуть все ваши контроллеры. Попробуйте вставить их один за другим, а затем вы будете тестировать, чтобы найти контроллер с ошибками.

Например Если у вас есть как 3Controllers говорят

>Controller
>>>AuthController
>>>UserController
>>>HomeController

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

>Controller
>>>AuthController
If the methods in AuthenController is fine, It will run, If not Check the methods.
>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] в мой контроллер.

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