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