c# - how - swashbuckle swagger annotations.net core
Swashbuckle/Swagger+ASP.Net Core: "Error al cargar la definiciĆ³n de la API" (8)
Agregue el atributo Httpxxx ( [HttpGet]
, [HttpPost]
, ...) para cada método de acción, o [ApiExplorerSettings(IgnoreApi = true)]
Desarrollé una aplicación ASP.NET Core 2 e incluí Swagger. Todo funcionó bien hasta que introduje un método sin definir explícitamente la acción HTTP:
public class ErrorController : Controller
{
[Route("/error")]
public IActionResult Index()
{
return StatusCode(500, new Error("Internal error."));
}
}
Cuando inicié la aplicación con este método, apareció el siguiente mensaje:
Error al cargar la definición de la API.
Los errores
Error de recuperación Error interno del servidor /swagger/v1/swagger.json
Tan pronto como establezco explícitamente, por ejemplo [HttpGet]
el error desaparece. El problema con esto es que necesito este método para activar todas las operaciones HTTP posibles. Por supuesto, podría especificar todas las operaciones explícitamente, pero tengo la sensación de que Swagger debería poder manejar esto correctamente.
¿Por qué Swagger se comporta de esta manera?
¿Hay alguna configuración que pueda usar?
En ASP.NET Core, si hay un punto final de controlador como:
[Route("images")]
[HttpGet("{id}")]
Esto también puede fallar con error de recuperación. La solución es tener algo como
[HttpGet("images/{id}")]
Lo mismo ocurre con HttpPost.
La opción ResolveConflictingActions debería estar trabajando en este caso ...
Aquí está el error real:
System.NotSupportedException: Ambiguous HTTP method for action
Creo que esto es un error, si está realmente interesado, debe informarlo al proyecto.
No sé si esto se ha resuelto o no, pero una forma de hacerlo es decorar el método con:
[ApiExplorerSettings(IgnoreApi = true)]
Esto asegurará que Swagger ignore el método en cuestión.
Otro problema posible es que el punto final debe estar completo desde la raíz del dominio.
Tuve:
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "V1 Docs");
});
Tuve que usar:
app.UseSwaggerUI(c=>
{
c.SwaggerEndpoint("/myApi/swagger/v1/swagger.json", "V1 Docs");
});
Swagger también lanza la misma excepción si hay métodos públicos que no son acciones en un controlador. La solución es hacer que todos ellos [ApiExplorerSettings(IgnoreApi = true)]
protected
o sean private
o, como se mencionó, agregar el atributo [ApiExplorerSettings(IgnoreApi = true)]
.
También estaba recibiendo este error porque creé un controlador que dosent tiene [Route("api/[controller]")]
. Después de ponerlo, el error desapareció.
TypeLoadException
una TypeLoadException
en una clase que estaba borrando y que no estaba en uso. La solución en mi caso fue eliminar el contenido de la carpeta bin / obj / Debug. La solución limpia y la solución de reconstrucción no se solucionaron.