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%" ]
}
}