500 Ошибка при настройке Swagger в asp.net Приложение CORE/MVC 6

Я пытаюсь настроить базовый API-интерфейс swagger API в новом проекте asp.net CORE/MVC 6 и получить 500 ошибок от пользовательского интерфейса swagger: 500 : http://localhost:4405/swagger/v1/swagger.json

В моем классе запуска есть следующий код:

using Swashbuckle.SwaggerGen;
using Swashbuckle.SwaggerGen.XmlComments;
using Swashbuckle.Application;
....
public void ConfigureServices(IServiceCollection services)
{
  ...
  services.AddSwaggerGen();
  services.ConfigureSwaggerDocument(options =>
  {
    options.SingleApiVersion(new Info
    {
        Version = "v1",
        Title = "Blog Test Api",
        Description = "A test API for this blogpost"
    });
  });
}

а затем в меню Configure:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
....
  app.UseSwaggerGen();
  app.UseSwaggerUi();
....
}

Когда я создаю и запускаю проект, пользовательский интерфейс появится, когда я перейду к swagger/UI/index.html, но отобразится 500 ошибка выше. Когда я перехожу к ссылке swagger/v1/swagger.json, консоль дает следующую ошибку 500: Failed to load resource: the server responded with a status of 500 (Internal Server Error)

Есть ли способ выяснить корневую причину 500 или включить любую дополнительную отладку в swagger, чтобы выяснить, почему она выбрасывает эту ошибку? Основываясь на некоторых обучающих программах, на которые я смотрел, для базовой реализации требуется только то, что у меня есть при запуске. Пожалуйста, дайте мне знать, если я могу предоставить дополнительную информацию.

EDIT: это для rc1 и может не иметь отношения к новому netcore 1.0 в данный момент (6/29/2016)

Ответ 1

Изначально у меня тоже была ошибка 500. В глубине стопки он сказал: System.NotSupportedException: Unbounded HTTP verbs for path 'api/hotels'. Are you missing an HttpMethodAttribute?

Оказалось, что у меня отсутствует атрибут HttpGet для одного из моих методов api:

[Microsoft.AspNetCore.Mvc.HttpGet]

Ответ 2

Если кто-то хочет узнать точную ошибку в трассировке стека Swagger, запросите URL:

<your-app-url>/swagger/v1/swagger.json

Или нажмите на ссылку swagger.json в консоли инструментов разработчика браузера:

Chrome DevTools with error log

Ответ 3

Во-первых, вы можете включить страницу исключения разработчика, добавив app.UseDeveloperExceptionPage(); в свой Configure(), чтобы лучше видеть, что является основной причиной. Посмотрите здесь

В моем случае проблема заключалась в том, что я должен установить также Microsoft.AspNetCore.StaticFiles nuget, чтобы заставить Swagger работать.

Попробуйте также удалить/переустановить Swashbuckle.AspNetCore nuget.

Ответ 4

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

Смена функции на private заставила проблему уйти.

В качестве альтернативы, непосредственно перед вашей public функцией вы можете поместить команду [NonAction], чтобы сказать Swagger игнорировать ее.

[NonAction]
public async Task<IActionResult> SomeEvent(string id)
{ 
   ...
}

(Я хочу, чтобы Swagger фактически сообщала имя функции, которая вызвала эту проблему, а не просто жаловалась, что она больше не может найти файл "../swagger/v1/swagger.json"... это не особенно полезно. )

Ответ 5

Может показаться очевидным, но, помимо отсутствующих HttpGet или HttpPost, не забудьте дифференцировать почтовые методы.

У вас может быть два разных метода (с разными именами), отмеченные HttpPost, и это также вызовет такую проблему. Не забудьте указать имя метода в атрибуте: [HttpPost("update")].

Ответ 6

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

Не делайте этого:

[Produces("application/json")]
[Route("/v1/myController")]
[Authorize]
public class myController
{
    [SwaggerResponse((int)System.Net.HttpStatusCode.OK, Type = typeof(RestOkResponse<Response>))]
    [SwaggerResponse((int)System.Net.HttpStatusCode.InternalServerError, Type = typeof(RestErrorResponse))]
    [SwaggerResponse((int)System.Net.HttpStatusCode.BadRequest, Type = typeof(RestErrorResponse))]
    [SwaggerResponse((int)System.Net.HttpStatusCode.Forbidden, Type = typeof(RestErrorResponse))]
    [SwaggerResponse((int)System.Net.HttpStatusCode.NotFound)]
    [HttpPost]
    [Authorize()]
    public async Task<IActionResult> Create([FromBody] MyObject myObject)
    {
        return Ok();
    }
}

Сделайте это:

[Produces("application/json")]
[Authorize]
public class myController
{
    [SwaggerResponse((int)System.Net.HttpStatusCode.OK, Type = typeof(RestOkResponse<Response>))]
    [SwaggerResponse((int)System.Net.HttpStatusCode.InternalServerError, Type = typeof(RestErrorResponse))]
    [SwaggerResponse((int)System.Net.HttpStatusCode.BadRequest, Type = typeof(RestErrorResponse))]
    [SwaggerResponse((int)System.Net.HttpStatusCode.Forbidden, Type = typeof(RestErrorResponse))]
    [SwaggerResponse((int)System.Net.HttpStatusCode.NotFound)]
    [HttpPost("/v1/myController")]
    [Authorize()]
    public async Task<IActionResult> Create([FromBody] MyObject myObject)
    {
        return Ok();
    }
}

Мне потребовалось некоторое время, чтобы понять, что причина, по которой я получал внутреннюю ошибку сервера, была связана с этой проблемой маршрутизации. Надеюсь, это поможет кому-то!

Ответ 7

Когда я добавляю параметр Version, он работает

services.AddSwaggerGen(options =>
        {
            options.SwaggerDoc("v1", new Info { Title = "My API", Version = "v1" });
        });

Ответ 8

Чтобы увидеть источник исключения

  • открытый хромированный браузер
  • открытые инструменты для разработчиков
  • см. исключения на вкладке консоли
  • почини это.

Ответ 9

Также была эта проблема. В моем случае это было вызвано двумя конечными точками в одном контроллере с тем же именем маршрута и метода (но разными типами параметров). Конечно, тогда стало очевидно, что это была, вероятно, плохая практика, так что я изменил имена конечных точек, и все было хорошо.

Ответ 10

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

Ответ 11

Я получаю эту ошибку, потому что в STARTUP.CS я не указывал название версии в параметрах SwaggerDoc:

Ошибка => c.SwaggerDoc("", blablabla

WORK => c.SwaggerDoc("v1",blablabla

тогда, теперь все в порядке хорошо!

services.AddSwaggerGen(c => 
    {
c.SwaggerDoc("v1", new Swashbuckle.AspNetCore.Swagger.Info {Title = "PME SERVICES", Version = "v1"});
            });

Ответ 12

Сегодня я столкнулся с этой проблемой при настройке Swagger в проекте .Net Core 2.2 Web Api. Я начал путь, о котором @Popa Andrei упоминал выше, включив в свой проект зависимость Microsoft.AspNetCore.StaticFiles как решил, что это, скорее всего, виновник. Это превратилось в кроличью нору цепочечных зависимостей, хотя в конечном итоге это сработало для меня.

Затем я понял, что в моем методе ConfigureServices в Startup меня были services.AddMvcCore(...) который просто дает вам голые кости, и вы добавляете зависимости по мере необходимости. Когда я изменил это на services.AddMvc(...) он начал работать без необходимости вручную добавлять все зависимости, необходимые для Microsoft.AspNetCore.StaticFiles.

Это не значит, что вы не можете выбрать путь к services.AddMvcCore(...) а затем добавить все необходимые зависимости. Вы можете, и это будет работать.

Просто гораздо проще воспользоваться services.AddMvc(...) и все готово.

Надеюсь, что это помогает кому-то.

Ответ 13

Убедившись, что мои чванливые версии выровнены друг с другом, я решил проблему. Поскольку я начинал новый проект, я установил версию api v0.1

services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("v0.1", new Info { Title = "Tinroll API", Version = "v0.1" });
});

Но оставил мой чванливый URL-адрес v1.

app.UseSwaggerUI(c =>
{
    c.SwaggerEndpoint("/swagger/v1/swagger.json", "Tinroll API v0.1");
    c.RoutePrefix = string.Empty;
});

Я обновил свою версию до /swagger/v0.1/swagger.json вместо v1 и Swagger работал как положено.

Ответ 14

Поскольку я не вижу опубликованного здесь решения, которое сработало для меня, я добавлю его в текущую ветку. В моем случае это был атрибут Route, который был установлен отдельно с помощью HttpPost/HttpGet на уровне функций (не на уровне контроллера).

НЕПРАВИЛЬНО:

[HttpPost]

[Route("RequestItem/{itemId}")]

ПРАВИЛЬНЫЙ:

[HttpPost("RequestItem/{itemId}")]

Кроме того, Swagger, по-видимому, ожидает результата Ok (объект) вместо результата StatusCode (объект) для возврата успешного запроса.

Ответ 15

Для меня это было из-за наличия двух типов классов с одинаковыми именами, но с разными пространствами имен, которые используются в качестве типа возврата двух разных действий в разных контроллерах!

Когда я сменил имя одного из них, проблема решилась!

Ответ 16

Посмотрите на этот проект. https://github.com/domaindrivendev/Ahoy/tree/master/test/WebSites/Basic

Это репо от владельца Swashbuckle, является основным приложением ASP.NET 5 Sample, это поможет вам скорректировать конфигурацию ваших посредников (и позаботиться о их заказах, это важно, например, использовать " app.UseSwaggerGen(); app.UseSwaggerUi(); после app.UseMvc();)

Чтобы включить ведение журнала в вашем приложении, посмотрите: https://docs.asp.net/en/latest/fundamentals/logging.html?highlight=logging (журнал будет сгенерирован внутри папки "wwwroot"

Ответ 17

Настройка Swagger сильно отличается от версии к версии. Этот ответ предназначен для Swashbuckle 6.0.0-beta9 и Asp.Net Core 1.0. Внутри метода ConfigureServices для Startup.cs вам нужно добавить -

 services.AddSwaggerGen(c =>
    {
      c.SingleApiVersion(new Info
      {
        Version = "v1",
        Title = "My Awesome Api",
        Description = "A sample API for prototyping.",
        TermsOfService = "Some terms ..."
      });
    });

Затем в методе Configure необходимо добавить -

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();

    app.UseMvc();
    app.UseSwaggerGen();
    app.UseSwaggerUi();
}

Убедитесь, что вы указали в Startup.cs -

с использованием Swashbuckle.SwaggerGen.Generator;

Мой файл project.json выглядит как

"dependencies": {
    "Microsoft.AspNetCore.Mvc": "1.0.0-rc2-final",
    "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0-rc2-final",
    "Microsoft.AspNetCore.Server.Kestrel": "1.0.0-rc2-final",
    "Microsoft.EntityFrameworkCore.SqlServer": "1.0.0-rc2-final",
    "Microsoft.EntityFrameworkCore.SqlServer.Design": "1.0.0-rc2-final",
    "Microsoft.EntityFrameworkCore.Tools": "1.0.0-*",
    "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0-rc2-final",
    "Microsoft.Extensions.Configuration.FileExtensions": "1.0.0-rc2-final",
    "Microsoft.Extensions.Configuration.Json": "1.0.0-rc2-final",
    "Microsoft.Extensions.Logging": "1.0.0-rc2-final",
    "Microsoft.Extensions.Logging.Console": "1.0.0-rc2-final",
    "Microsoft.Extensions.Logging.Debug": "1.0.0-rc2-final",
    "Swashbuckle": "6.0.0-beta9"
  },

  "tools": {
    "Microsoft.AspNetCore.Server.IISIntegration.Tools": {
      "version": "1.0.0-preview1-final",
      "imports": "portable-net45+win8+dnxcore50"
    },
    "Microsoft.EntityFrameworkCore.Tools": {
      "version": "1.0.0-preview1-final",
      "imports": [
        "portable-net45+win8+dnxcore50",
        "portable-net45+win8"
      ]
    }
  },

  "frameworks": {
    "net452": { }
  },
  "buildOptions": {
    "emitEntryPoint": true,
    "preserveCompilationContext": true,
    "xmlDoc": false
  },

  "publishOptions": {
    "include": [
      "wwwroot",
      "Views",
      "appsettings.json",
      "web.config"
    ]
  },

  "scripts": {
    "postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
  }
}