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

Я пытаюсь настроить базовый документ API swagger в новом проекте 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"
    });
  });
}

а затем в разделе Настройка:

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

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

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

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

6 ответов


Первоначально я тоже получил ошибку 500. В глубине трассировки стека он сказал: Система.NotSupportedException: неограниченные http-глаголы для пути "api/hotels". Пропущена HttpMethodAttribute?

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

[Microsoft.AspNetCore.Mvc.HttpGet]

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

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

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


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

изменение функции private сделал ошибку уйдет.

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

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

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


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

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

[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();
    }
}

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


взгляните на этот проект. https://github.com/domaindrivendev/Ahoy/tree/master/test/WebSites/Basic

Это РЕПО от владельца Swashbuckles, является основным ASP.NET 5 пример приложения, это поможет вам исправить настройки вашего middlewares (и заботиться о порядке их, его дело, например, использовать " приложение.UseSwaggerGen (); app.UseSwaggerUi (); после приложения.UseMvc ();)

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


настройка для Swagger сильно варьируется от версии к версии. Этот ответ для Swashbuckle 6.0.0-beta9 и Asp.Net ядро 1.0. Внутри метода запуска ConfigureServices.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.Сваггерген.Генератор;

мой проект.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%" ]
  }
}