Swashbuckle/Swagger + ASP.Net Core: "Не удалось загрузить определение API"
Я разрабатываю приложение ASP.NET Core 2 и включаю Swagger. Все работало нормально, пока я не ввел метод без явного определения действия HTTP:
public class ErrorController : Controller
{
[Route("/error")]
public IActionResult Index()
{
return StatusCode(500, new Error("Internal error."));
}
}
Когда я начал приложение с помощью этого метода, появилось следующее сообщение:
Не удалось загрузить определение API.
ошибки
Ошибка выборки Внутренняя ошибка сервера /swagger/v1/swagger.json
Как только я установлен явно, например [HttpGet]
ошибка исчезает. Проблема в том, что мне нужен этот метод для всех возможных HTTP-операций. Конечно, я мог бы четко указать все операции, но у меня такое чувство, что Swagger должен справиться с этим правильно.
Почему Сваггер ведет себя так?
Есть ли какая-либо конфигурация, которую я могу использовать?
Ответы
Ответ 1
Параметр ResolveConflictingActions должен работать в этом случае...
Вот фактическая ошибка:
System.NotSupportedException: Ambiguous HTTP method for action
Это исходит от: https://github.com/domaindrivendev/Swashbuckle.AspNetCore/blob/master/src/Swashbuckle.AspNetCore.SwaggerGen/Generator/SwaggerGenerator.cs#L90
Я думаю, что это ошибка, если вы действительно заинтересованы, вы должны сообщить об этом в проект
Ответ 2
Добавьте атрибут Httpxxx ([HttpGet]
, [HttpPost]
,...) для каждого метода Action или [ApiExplorerSettings(IgnoreApi = true)]
Ответ 3
Я не знаю, было ли это разрешено или нет, но один способ, которым вы можете это сделать, - это украсить метод:
[ApiExplorerSettings(IgnoreApi = true)]
Это гарантирует, что метод, о котором идет речь, игнорируется Swagger.
Ответ 4
Другая возможная проблема заключается в том, что конечная точка должна быть завершена от корня домена.
Я имел:
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "V1 Docs");
});
Я должен был использовать:
app.UseSwaggerUI(c=>
{
c.SwaggerEndpoint("/myApi/swagger/v1/swagger.json", "V1 Docs");
});
Ответ 5
Просто вы можете заглянуть в журнал в окне вывода. Фактическая ошибка может быть замечена там в моем случае, я пропустил добавление HTTP-действия поверх методов
Ответ 6
В ASP.NET Core, если есть конечная точка контроллера, такая как:
[Route("images")]
[HttpGet("{id}")]
Это также может привести к сбою при получении. Решение состоит в том, чтобы иметь что-то вроде
[HttpGet("images/{id}")]
То же самое относится и к HttpPost.
Ответ 7
Swagger также выдает то же исключение, если есть открытые методы, которые не являются действиями в контроллере. Исправление заключается в том, чтобы сделать их все protected
или private
или, как уже упоминалось, добавить атрибут [ApiExplorerSettings(IgnoreApi = true)]
.
Ответ 8
У меня была эта проблема, причиной было наличие пространства имен в параметре действия:
public async Task<IActionResult> Create([FromBody] Models.Request.CreateModel model)
{
return Ok();
}
Мне просто нужно было избавиться от Models.Request
и использовать только CreateModel
.
Я переместил Models.Request
в пункт using
, я не знаю, почему это было не в первую очередь.
Ответ 9
Я получал TypeLoadException
для класса, который я TypeLoadException
который не использовался. В моем случае исправлением было удаление содержимого папки bin/obj/Debug. Чистое решение + восстановление решения не исправить для меня.
Ответ 10
Я также получал эту ошибку, потому что я создал контроллер, который имеет [Route("api/[controller]")]
. После этого ошибка ушла.
Ответ 11
Добавьте этот атрибут маршрута через ваш контроллер API
[Маршрут ("api/[контроллер]/[действие]")] [ApiController]
Ответ 12
Однажды у меня возникла та же проблема, но потом я нашел это правильное рабочее решение. Надеюсь, что это поможет вам. Добавьте swagger в ядро asp.net 3.0
http://dotnetdetail.net/how-to-add-swagger-to-asp-net-core-3-0-web-api/
Ответ 13
Причиной моей ошибки было то же имя URL,
[HttpGet("get/LeaveCommand/{id}")]
Я использую тот же URL-адрес, и Swagger не может получить их
[HttpGet("get/LeaveCommand/{id}")]