Ich entwickle eine ASP.NET Core 2-Anwendung und fügte Swagger hinzu. Alles hat gut funktioniert, bis ich eine Methode eingeführt habe, ohne die HTTP-Aktion explizit zu definieren:
public class ErrorController : Controller
{
[Route("/error")]
public IActionResult Index()
{
return StatusCode(500, new Error("Internal error."));
}
}
Als ich die App mit dieser Methode gestartet habe, wurde folgende Meldung angezeigt:
Fehler beim Laden der API-Definition.
Fehler
Fehler beim Abrufen Interner Serverfehler /swagger/v1/swagger.json
Sobald ich z. [HttpGet]
der Fehler verschwindet. Das Problem dabei ist, ich brauche diese Methode, um alle möglichen HTTP-Vorgänge abzufeuern. Natürlich konnte ich alle Operationen explizit angeben, aber ich habe das Gefühl, dass Swagger damit umgehen kann.
Warum verhält sich Swagger so?
Gibt es eine Konfiguration, die ich verwenden kann?
Die Option ResolveConflictingActions sollte in diesem Fall funktionieren ...
Hier ist der tatsächliche Fehler:
System.NotSupportedException: Ambiguous HTTP method for action
Ich denke, das ist ein Fehler. Wenn Sie wirklich interessiert sind, sollten Sie dies dem Projekt melden
Fügen Sie für jede Action-Methode das Httpxxx-Attribut ([HttpGet]
, [HttpPost]
, ...) oder [ApiExplorerSettings(IgnoreApi = true)]
hinzu.
Ich weiß nicht, ob dies behoben wurde oder nicht, aber Sie können dies tun, indem Sie die Methode mit:
[ApiExplorerSettings(IgnoreApi = true)]
Dadurch wird sichergestellt, dass die betreffende Methode von Swagger ignoriert wird.
Ein weiteres mögliches Problem ist, dass der Endpunkt vom Domänenstamm aus vollständig sein muss.
Ich hatte:
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "V1 Docs");
});
Ich musste verwenden:
app.UseSwaggerUI(c=>
{
c.SwaggerEndpoint("/myApi/swagger/v1/swagger.json", "V1 Docs");
});
Swagger löst auch dieselbe Ausnahme aus, wenn öffentliche Methoden vorhanden sind, die keine Aktionen in einem Controller sind. Das Update besteht darin, alle protected
oder private
zu machen oder, wie erwähnt, das Attribut [ApiExplorerSettings(IgnoreApi = true)]
hinzuzufügen.
Ich habe diese Fehlermeldung auch erhalten, weil ich einen Controller erstellt habe, der [Route("api/[controller]")]
nicht hat. Nach dem Einfügen ging der Fehler weg.
Mein Fehlergrund war derselbe URL-Name.
[HttpGet("get/LeaveCommand/{id}")]
Ich benutze die gleiche URL und Swagger kann sie nicht bekommen
[HttpGet("get/LeaveCommand/{id}")]
Ich bekam eine TypeLoadException
für eine Klasse, die ich löschte und die nicht verwendet wurde. In meinem Fall war das Problem, den Inhalt des Ordners bin/obj/Debug zu löschen. Saubere Lösung + Rebuild-Lösung hat mich nicht behoben.
Wenn in ASP.NET Core ein Controller-Endpunkt vorhanden ist:
[Route("images")]
[HttpGet("{id}")]
Dies kann auch fehlschlagen, wenn der Abruf fehlgeschlagen ist. Die Lösung ist so etwas zu haben
[HttpGet("images/{id}")]
Dasselbe gilt für HttpPost.