web-dev-qa-db-ja.com

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はこれを正しく処理できるはずだと感じています。

Swaggerがこのように動作するのはなぜですか?

使用できる構成はありますか?

22
Ash

オプション ResolveConflictingActions は、このケースで機能するはずです...

実際のエラーは次のとおりです。

System.NotSupportedException: Ambiguous HTTP method for action

https://github.com/domaindrivendev/Swashbuckle.AspNetCore/blob/master/src/Swashbuckle.AspNetCore.SwaggerGen/Generator/SwaggerGenerator.cs#L9

これはバグだと思います。もし興味があるなら、プロジェクトに報告してください。

8

各アクションメソッドのHttpxxx([HttpGet][HttpPost]、...)属性、または[ApiExplorerSettings(IgnoreApi = true)]を追加します

21
LiKui

これが解決されたかどうかはわかりませんが、これを解決する方法の1つは、メソッドを次のように修飾することです。

[ApiExplorerSettings(IgnoreApi = true)]

これにより、問題のメソッドがSwaggerによって無視されることが保証されます。

6
Moshood Aminu

別の考えられる問題は、エンドポイントがドメインルートから完全である必要があることです。

私が持っていた:

app.UseSwaggerUI(c =>
{
     c.SwaggerEndpoint("/swagger/v1/swagger.json", "V1 Docs");
});

私は使用しなければなりませんでした:

 app.UseSwaggerUI(c=>
{
     c.SwaggerEndpoint("/myApi/swagger/v1/swagger.json", "V1 Docs");

});
5
Erick

ASP.NET Coreで、次のようなコントローラーエンドポイントがある場合:

[Route("images")]
[HttpGet("{id}")]

これは、フェッチに失敗して失敗することもあります。解決策は次のようなものを持つことです

[HttpGet("images/{id}")]

HttpPostについても同じことが言えます。

4
dansc

Swaggerは、コントローラー内のアクションではないパブリックメソッドがある場合にも同じ例外をスローします。修正するには、それらすべてをprotectedまたはprivateにするか、前述のように属性[ApiExplorerSettings(IgnoreApi = true)]を追加します。

3
Elphas

単純にOutputウィンドウでログを調べることができます。私の場合、実際のエラーはそこにあります。メソッドの上にHTTPアクションを追加できませんでした

enter image description here

[Route("api/[controller]")]を持たないコントローラーを作成したため、このエラーも発生していました。それを置いた後、エラーはなくなりました。

0
prisar

私のエラーの理由は同じURL名でした

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

私は同じURLを使用し、Swaggerはそれらを取得できません

 [HttpGet("get/LeaveCommand/{id}")]
0
Ergin Çelik

削除していたクラスで未使用のTypeLoadExceptionを取得していました。私の場合の修正は、bin/obj/Debugフォルダーの内容を削除することでした。クリーンソリューション+再構築ソリューションは、私にとっては解決しませんでした。

0
daniel.caspers