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-действия поверх методов

enter image description here

Ответ 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]

Ответ 13

Причиной моей ошибки было то же имя URL,

 [HttpGet("get/LeaveCommand/{id}")]

Я использую тот же URL-адрес, и Swagger не может получить их

 [HttpGet("get/LeaveCommand/{id}")]