Swaggerで文書化できるようにProducesResponseTypeを設定しています。
応答が成功した場合(OK => 200)、IEnumerableが生成されます。
[ProducesResponseType(typeof(IEnumerable<MyModel>), 200)]
しかし、例外が発生すると、それをキャッチして、カスタムAPIErrorクラスのオブジェクトを生成します。オブジェクトにデータを入力するときに、別のHttpStatusCodesを設定できますが、最終的には、ProducesResponseTypeが残りのすべてのHttpStatusCodesのAPIErrorクラスであることを設定できるようにする必要があります。つまり、BadRequest、ServerInternalError、Forbiddenなどを取得できますが、すべて同じ応答タイプ(ApiError)になります。すべてのエラーhttpコードに対してこのコード行を設定する方法はありますか?それとも、1つずつ設定する必要がありますか?
[ProducesResponseType(typeof(ApiError), ???)]
最終結果は次のようになります。
[ProducesResponseType(typeof(IEnumerable<MyModel>), 200)]
[ProducesResponseType(typeof(ApiError), AllFailureHttpCodes)]
私はそれが不可能であることを恐れています、少なくとも行動ごとに。
IApiResponseMetadataProvider
( here を参照)には、単一のint StatusCode { get; }
プロパティが定義され、ProducesAttribute
とProducesResponseTypeAttribute
の両方に使用されます。
ただし、特殊なケースでは、GET、POST、PUT、DELETEのいずれであっても、すべてのアクションでエラー結果が同じになるため、グローバルフィルターとして登録できる場合があります。
services.AddMvc(options =>
{
options.Filters.Add(new Microsoft.AspNetCore.Mvc.ProducesResponseTypeAttribute(typeof(ApiError), 400));
options.Filters.Add(new Microsoft.AspNetCore.Mvc.ProducesResponseTypeAttribute(typeof(ApiError), 401));
options.Filters.Add(new Microsoft.AspNetCore.Mvc.ProducesResponseTypeAttribute(typeof(ApiError), 409));
});
これらは、MVC/WebAPIアプリケーションのすべてのアクションに適用する必要があります。
ただし、個人的にはこの使用法が間違っていると思います。これは、すべてのメソッドがこれらのタイプのエラーを処理できることを示すためです。たとえば、409は競合のためのものです。WebAPIでそれを使用すると、リソースの更新でエラーが発生した場合、つまり楽観的同時実行を使用した場合、レコードが別のユーザーによって変更されたため、レコードのバージョンが変更され、更新に失敗しました。
これらをすべてのメソッドに追加するのは間違っています。アクションが本当にこのステータスコードを処理する場合にのみ、ステータスコードを追加する必要があります。たとえば、409はPUTおよびPOSTメソッドにのみ適しています。404はGETおよびPUT(更新)には適していますが、POST(インサート)。
これは特に悪いことです。Swaggerなどのツールを使用してAPIドキュメントを生成すると、誤ったドキュメントが表示されます。ドキュメントの形式としてProducesResponseType
を検討する必要があります。そのため、あまりに一般的なアプローチを使用しないでください。
ASP.NET Core 2.2では、Swagger APIのサポートが大幅に改善されました。これには 慣習ベース 応答タイプとコードも含まれます。
これにはすでにデフォルトの規則の良いセットが付属していますが、それをオーバーライドして独自の規則メソッドを提供することもできます。