ASP.NET Core - Swashbuckle не создает файл swagger.json

У меня возникли проблемы с получением пакета Swashbuckle.AspNetCore(1.0.0) для создания любого результата. Я прочитал файл swagger.json, который должен быть записан в '~/swagger/docs/v1'. Однако я не получаю никаких результатов.

Я начал работу с совершенно нового проекта ASP API Core API. Я бы сказал, это ASP.NET Core 2. API работает, и я могу получить значения из контроллера значений просто отлично.

Мой класс запуска имеет конфигурацию, точно описанную в этой статье (Swashbuckle.AspNetCore on GitHub).

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();

        services.AddSwaggerGen(c =>
        {
            c.SwaggerDoc("v1", new Info { Title = "My API", 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)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();

            // Enable middleware to serve generated Swagger as a JSON endpoint.
            app.UseSwagger();
            app.UseSwaggerUI(c =>
            {
                c.SwaggerEndpoint("/swagger/v1/swagger.json", "MyAPI V1");
            });
        }
        else
        {
            app.UseExceptionHandler();
        }

        app.UseStatusCodePages();
        app.UseMvc();

        //throw new Exception();
    }
}

Вы можете увидеть ссылки NuGet...

enter image description here

Опять же, это все шаблон по умолчанию, но я включаю ValuesController для справки...

[Route("api/[controller]")]
public class ValuesController : Controller
{
    // GET api/values
    [HttpGet]
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // GET api/values/5
    [HttpGet("{id}")]
    public string Get(int id)
    {
        return "value";
    }

    // POST api/values
    [HttpPost]
    public void Post([FromBody]string value)
    {
    }

    // PUT api/values/5
    [HttpPut("{id}")]
    public void Put(int id, [FromBody]string value)
    {
    }

    // DELETE api/values/5
    [HttpDelete("{id}")]
    public void Delete(int id)
    {
    }
}

Ответы

Ответ 1

Я считаю, что вы пропустили эти две строки на своем Configure:

if (env.IsDevelopment())
{
    app.UseDeveloperExceptionPage();

    // Enable middleware to serve generated Swagger as a JSON endpoint.
    app.UseSwagger();
    app.UseSwaggerUI(c =>
    {
        c.SwaggerEndpoint("/swagger/v1/swagger.json", "MyAPI V1");
    });
}

Чтобы получить доступ к пользовательскому интерфейсу Swagger, URL-адрес должен быть следующим: http://localhost: XXXX/swagger/

Json можно найти в верхней части интерфейса Swagger:

enter image description here

Ответ 2

#if DEBUG
   // For Debug in Kestrel
   c.SwaggerEndpoint("/swagger/v1/swagger.json", "Web API V1");
#else
   // To deploy on IIS
   c.SwaggerEndpoint("/webapi/swagger/v1/swagger.json", "Web API V1");
#endif

При развертывании в IIS webapi (базовый URL) используется псевдоним приложения. Вам необходимо сохранить псевдоним приложения (базовый URL-адрес) одинаковым для всех развертываний IIS, поскольку swagger ищет файл swagger.json в папке "/swagger/v1/swagger.json", но не использует префикс псевдонима приложения (базовый URL-адрес), поэтому он не будет работать,

Например:

localhost/swagger/v1/swagger.json - не удалось найти swagger.json

Ответ 3

У меня такая же проблема. Проверьте http://localhost: XXXX/swagger/v1/swagger.json. Если вы обнаружите какие-либо ошибки, исправьте их.

Например, у меня был неоднозначный маршрут в базовом классе контроллера, и я получил ошибку: "Неоднозначный HTTP-метод для действия. Действия требуют явной привязки HttpMethod для Swagger 2.0". Если вы используете базовые контроллеры, убедитесь, что ваши публичные методы используют атрибуты HttpGet/HttpPost/HttpPut/HttpDelete OR Route, чтобы избежать неоднозначных маршрутов.

Затем я также определил атрибуты HttpGet ("route") и Route ("route") в одном и том же методе, что было последней проблемой для swagger.

Ответ 4

Если ваше приложение размещено на IIS/IIS Express, попробуйте следующее:

c.SwaggerEndpoint("../swagger/v1/swagger.json", "MyAPI V1");

Ответ 5

Я столкнулся с подобным, но не совсем тем же вопросом с чванством. Надеюсь, это поможет кому-то другому.

Я использовал собственный заголовок документа и не менял путь к папке в SwaggerEndPoint, чтобы соответствовать названию документа. Если вы оставите конечную точку, указывающую на swagger/v1/swagger.json, он не найдет json файл в пользовательском интерфейсе swagger.

Пример:

services.AddSwaggerGen(swagger =>
        {
            swagger.SwaggerDoc("AppAdministration", new Info { Title = "App Administration API", Version = "v1.0" });

        });


 app.UseSwaggerUI(c =>
        {
            c.SwaggerEndpoint("/swagger/AppAdministration/swagger.json", "App Administration");
        });

Ответ 6

Вы должны соответствовать 2 правилам:

  1. Украсьте все действия явными методами Http, такими как [HttpGet("xxx")], [HttpPost("xxx")] или... вместо [Route("xxx")].
  2. Украсьте открытые методы в контроллерах с помощью атрибута [NoAction].

Обратите внимание, что http://localhost: XXXX/swagger/ страница запрашивает файл http://localhost: XXXX/swagger/v1/swagger.json, но из Чванство, если вы не будете соответствовать вышеуказанным правилам.

Ответ 7

После просмотра ответов и проверки рекомендаций я не понимаю, что происходит не так.

Я буквально все перепробовал. Так что, ребята, если вы окажетесь в той же ситуации, поймите, что проблема может быть в чем-то другом, совершенно неуместном от чванства.

В моем случае было исключение OData.

После того, как вы перейдете к localhost: xxxx/swagger, откройте инструменты разработчика, нажмите на ошибку на консоли, и вы увидите внутреннее исключение, которое вызывает проблему.

надеюсь, это поможет

Ответ 8

Если у вас есть какие-либо проблемы в вашем контроллере для сопоставления с уникальным URL, вы получите эту ошибку.

Лучший способ найти причину проблемы - исключить все контроллеры из проекта. Затем попробуйте запустить приложение, включив один контроллер или один или несколько методов в контроллере за раз, чтобы найти метод контроллеров/контроллеров (S), которые имеют проблему. Или вы могли бы проявить смекалку и выполнить бинарную логику поиска, чтобы найти отключение, включить несколько контроллеров/методов для поиска неисправных.

Некоторые из причин

  1. Наличие открытых методов в контроллере без атрибутов HTTP-методов

  2. Наличие нескольких методов с одинаковыми атрибутами Http, которые могут отображаться на один и тот же вызов API, если вы не используете отображение "[action]"

Ответ 9

Лично у меня была такая же проблема, и когда я снова попробовал сегодня через некоторое время, я нашел в новой версии (2.5.0), что в json я мог видеть объяснение ошибки, которая была здесь.

Еще одна вещь, которая помогла мне исправить это, - это удаление информации о хостинге, связанной с веб-сайтом, хранящимся внутри "..vs\config\applicationhost.config" в корне папки решений

Я удалил элемент, который настраивал веб-сайт.

           <site name="**" id="9">
              <application path="/" applicationPool=""></application>
              <bindings></bindings>
           </site>

Ответ 10

Распространенная ошибка, которую мы допускаем при использовании Swagger, заключается в присвоении (NET ASP) одного и того же имени двум или более маршрутам. По этой причине Swagger не может сгенерировать файл JSON. например, это неправильный путь

[HttpPost, Route("Start")]
public async Task<TransactionResult> WipStart(BodyWipStartDTO data)
{
    return await _wipServices.WipStart(data);
}

Другое действие с тем же именем маршрута, но с другим именем действия

[HttpPost, Route("Start")]
public async Task<TransactionResult> WipAbort(BodyWipStartDTO data)
{
    return await _wipServices.WipAbort(data);
}

Это правильный путь

[HttpPost, Route("Start")]
public async Task<TransactionResult> WipStart(BodyWipStartDTO data)
{
    return await _wipServices.WipStart(data);
}

[HttpPost, Route("Abort")]
public async Task<TransactionResult> WipAbort(BodyWipStartDTO data)
{
    return await _wipServices.WipAbort(data);
}

Ответ 11

Попробуйте выполнить эти шаги легко и чисто.

  1. Проверьте вашу консоль, нет ли ошибок типа "Ambiguous HTTP method for action. Actions require an explicit HttpMethod binding for Swagger 2.0."
  2. Если ДА: Причина этой ошибки: Swagger ожидает

каждая конечная точка должна иметь метод (get/post/put/delete)

   Решение:

Пересмотрите ваш каждый контроллер и убедитесь, что вы добавили ожидаемый метод.

(или вы можете просто увидеть в консоли ошибку, какой контроллер вызывает неоднозначность)

  1. Если НЕТ. Пожалуйста, дайте нам знать вашу проблему и решение, если вы нашли.

Ответ 12

Я столкнулся с той же проблемой и заметил, что мой API не размещен в корневой папке и в виртуальном каталоге. Я переместил свой API в корневую папку в IIS и работал.

Дополнительная информация в этом ответе

Ответ 13

app.UseSwagger();
app.UseSwaggerUI(c =>
{
    c.SwaggerEndpoint("./v1/swagger.json", "My API V1");
});

Ответ 14

Убедитесь, что у вас есть все необходимые зависимости, перейдите по ссылке xxx/swagger/v1/swagger.json, в которой вы можете обнаружить, что у вас отсутствует одна или несколько зависимостей.

enter image description here

Ответ 15

Я получал эту ошибку Swagger, когда я создал версию 2 моего API, используя заголовки версий вместо URL-версий. Обходным решением было добавить атрибуты [Obsolete] в методы версии 1, а затем использовать SwaggerGeneratorOptions, чтобы игнорировать устаревшие методы API в методе StartupConfigureServices.

services.AddSwaggerGen(c =>
{
    c.SwaggerGeneratorOptions.IgnoreObsoleteActions = true;
    c.SwaggerDoc("v2", new Info { Title = "My API", Version = "v2" });
});

Ответ 16

Взгляните на инструменты разработчика Chrome, иногда, запрос swagger.json выдает http 500, ведь это означает, что на ваших контроллерах есть некоторая несогласованность. Например: в моем случае есть "Неоднозначный HTTP-метод для действия":

enter image description here

Ответ 17

Также у меня возникла проблема, потому что я управлял версией приложения на уровне IIS, как показано ниже:

enter image description here

В этом случае конфигурация в методе Configure должна добавить номер версии, как показано ниже:

app.UseSwaggerUI(options =>
{
    options.SwaggerEndpoint("/1.0/swagger/V1/swagger.json", "Static Data Service");
});

Ответ 18

У меня была эта проблема, когда я использовал внутренний класс в параметрах сообщения

[HttpPost]
public async Task Post([FromBody] Foo value)
{
}

Где находится Foo

public class Foo
{
    public IEnumerable<Bar> Bars {get;set;}

    public class Bar
    {
    }
}

Ответ 19

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

https://localhost:XXXXX/swagger/v1/swagger.json

На странице будет отображена ошибка и причина, по которой она не найдена.

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

NotSupportedException: HTTP method "GET" & path "api/Values/{id}" overloaded by actions - ...
...
...