webentwicklung-frage-antwort-db.com.de

Swashbuckle/Swagger + ASP.Net Core: "Fehler beim Laden der API-Definition"

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?

17
Ash

Die Option ResolveConflictingActions sollte in diesem Fall funktionieren ...

Hier ist der tatsächliche Fehler:

System.NotSupportedException: Ambiguous HTTP method for action

Das kommt von: https://github.com/domaindrivendev/Swashbuckle.AspNetCore/blob/master/src/Swashbuckle.AspNetCore.SwaggerGen/Generator/SwaggerGenerator.cs#L90

Ich denke, das ist ein Fehler. Wenn Sie wirklich interessiert sind, sollten Sie dies dem Projekt melden

5

Fügen Sie für jede Action-Methode das Httpxxx-Attribut ([HttpGet], [HttpPost], ...) oder [ApiExplorerSettings(IgnoreApi = true)] hinzu.

11
LiKui

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.

4
Moshood Aminu

Sie können einfach in das Protokoll im Ausgabefenster schauen. Der eigentliche Fehler ist dort in meinem Fall zu sehen, ich habe das Hinzufügen einer HTTP-Aktion über eine Methode verpasst

enter image description here

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");

});
1
Erick

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.

1
Elphas Tori

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.

0
t-prisar

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}")]
0
Ergin Çelik

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. 

0
daniel.caspers

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.

0
dansc