web-dev-qa-db-ja.com

.net Core web api 2(mvcではない)のHttpResponseException / IHttpActionResultと同等

要求に応答し、エラーを処理するためのwebapiについて読んでいるとき、すべてが以下に基づいています:

IHttpActionResult
HttpResponseException

ただし、.netコアwebapiプロジェクトを作成する場合、これらは使用できません。 IActionResultを見つけることができますが、これは同等と思われますか?

しかし、HttpResponseExceptionが使用できないため、.netコアwebapiでエラーを処理する方法である、非常に単純なことを見つけようとして、私は一周します。 「http」が含まれるすべての印象は、完全なMVCアプリケーション用です。

私がやりたいのはエラーを返すことです、確かにそれは簡単でなければなりません...

21
Neil Walker

あなたが提案したように、IActionResultIHttpActionResultと同等です。これは、MVCおよびASP.NET Core MVCのWeb APIとして知られているものの統合の一部です。

HttpResponseExceptionに関しては、これはASP.NET Coreで完全に削除されました。興味深い issue がGitHubのこの周辺にあります。DavidFowlerが、なぜそうなのかを説明しています:

「制御フローに例外を使用したくない」という典型的なパラダイムです。人々は、ビジネスロジック内で使用するようなことをしましたが、これはあらゆる種類の誤りです。私は測定していないのでパフォーマンスの問題について話すことはできませんが、データを取得するためにキャッチすることを意図した例外をスローすることは、その結果を返すよりも悪いです。

これに対する代替案は、さまざまなIActionResult実装を使用して、JSON応答を作成したり、エラーを返したりすることです。ここでも、問題から:

私の提案は、アクションメソッドにIActionResult(または非同期バリエーション)を返すことです。

IActionResultとオブジェクトの両方がサポートされる理由は、それぞれが異なる目的と異なるスタイルに適しているためです。いくつかの最も単純なケースでは、オブジェクトを使用するのは良いことですが、それはまったく強力ではありません。完全に制御するために、よく知られている「コマンドパターン」に従うIActionResultがあります。

IActionResultパターンを使用すると、コントローラーはアクションの結果として何が起こるべきかを明示的に指定できます。エラーコード、リダイレクト、シリアル化されたデータオブジェクト、レンダリングされたビューなどです。

コントローラの外部でエラーを処理する場合は、このトピックの docs を読んでください。ミドルウェアまたはエラー処理用のフィルタの使用の詳細について説明しています。コメントには、エラー処理のいくつかの側面をより詳細に説明する tutorial へのリンクがあります。

完全を期すために、ミドルウェアアプローチのチュートリアルのコードを次に示します。

app.UseExceptionHandler(
 options => {
    options.Run(
    async context =>
    {
      context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
      context.Response.ContentType = "text/html";
      var ex = context.Features.Get<IExceptionHandlerFeature>();
      if (ex != null)
      {
        var err = $"<h1>Error: {ex.Error.Message}</h1>{ex.Error.StackTrace }";
        await context.Response.WriteAsync(err).ConfigureAwait(false);
      }
    });
 }
);

IExceptionFilterアプローチの詳細もありますが、この答えはこれまでよりも大きくしません。

28
Kirk Larkin