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がこのように動作するのはなぜですか?
使用できる構成はありますか?
オプション ResolveConflictingActions は、このケースで機能するはずです...
実際のエラーは次のとおりです。
System.NotSupportedException: Ambiguous HTTP method for action
これはバグだと思います。もし興味があるなら、プロジェクトに報告してください。
各アクションメソッドのHttpxxx([HttpGet]
、[HttpPost]
、...)属性、または[ApiExplorerSettings(IgnoreApi = true)]
を追加します
これが解決されたかどうかはわかりませんが、これを解決する方法の1つは、メソッドを次のように修飾することです。
[ApiExplorerSettings(IgnoreApi = true)]
これにより、問題のメソッドがSwaggerによって無視されることが保証されます。
別の考えられる問題は、エンドポイントがドメインルートから完全である必要があることです。
私が持っていた:
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "V1 Docs");
});
私は使用しなければなりませんでした:
app.UseSwaggerUI(c=>
{
c.SwaggerEndpoint("/myApi/swagger/v1/swagger.json", "V1 Docs");
});
ASP.NET Coreで、次のようなコントローラーエンドポイントがある場合:
[Route("images")]
[HttpGet("{id}")]
これは、フェッチに失敗して失敗することもあります。解決策は次のようなものを持つことです
[HttpGet("images/{id}")]
HttpPostについても同じことが言えます。
Swaggerは、コントローラー内のアクションではないパブリックメソッドがある場合にも同じ例外をスローします。修正するには、それらすべてをprotected
またはprivate
にするか、前述のように属性[ApiExplorerSettings(IgnoreApi = true)]
を追加します。
[Route("api/[controller]")]
を持たないコントローラーを作成したため、このエラーも発生していました。それを置いた後、エラーはなくなりました。
私のエラーの理由は同じURL名でした
[HttpGet("get/LeaveCommand/{id}")]
私は同じURLを使用し、Swaggerはそれらを取得できません
[HttpGet("get/LeaveCommand/{id}")]
削除していたクラスで未使用のTypeLoadException
を取得していました。私の場合の修正は、bin/obj/Debugフォルダーの内容を削除することでした。クリーンソリューション+再構築ソリューションは、私にとっては解決しませんでした。