WebAPIでIHttpActionResultインターフェイスを使用することについての私の2セント

MicrosoftのWebAPIは、かなり長い間、HTTP上で機能するRESTfulサービスを構築するために選択されるフレームワークでした。IHttpActionResultインターフェースはWebAPIバージョン2で導入され、WebAPIコントローラーメソッドから応答を送り返す別の方法を提供し、デフォルトで非同期と待機を利用します。

基本的に、IHttpActionResultはHttpResponsemessageのファクトリです。IHttpActionResultインターフェイスはSystem.Web.Http名前空間に含まれており、HttpResponseMessageのインスタンスを非同期で作成します。IHttpActionResultは、Ok、BadRequest、Exception、Conflict、Redirect、NotFound、およびUnauthorizedを含むカスタムの組み込み応答のコレクションで構成されます。

IHttpActionResultインターフェイスには、メソッドが1つだけ含まれています。このインターフェースは次のようになります。

namespace System.Web.Http

{

    public interface IHttpActionResult

    {

        Task ExecuteAsync(CancellationToken cancellationToken);

    }

}

以下にリストされているApiControllerクラスのヘルパーメソッドのいずれかを使用して、カスタム応答を返すことができます。

Ok

NotFound

Exception

Unauthorized

BadRequest

Conflict

Redirect

InvalidModelState

WebAPIコントローラーメソッドからの応答を返す

このセクションでは、IHttpActionResultを活用してコントローラーメソッドから応答を送り返す方法について説明します。

ここで、次のWebApiコントローラーについて考えてみます。

public class DefaultController : ApiController

    {

        private readonly DemoRepository repository = new DemoRepository();

        public HttpResponseMessage Get(int id)

        {

            var result = repository.GetData(id);

            if (result != null)

                return Request.CreateResponse(HttpStatusCode.OK, result);

            return Request.CreateResponse(HttpStatusCode.NotFound);

        }

    }

いずれの場合も適切なステータスコードが返されることに注意してください。つまり、データが利用可能な場合はHttpStatusCode.OKが返され、データが利用できない場合はHttpStatusCode.NotFoundが返されます。

同じコントローラーメソッドを変更して、応答をIHttpActionResultとして返す方法を見てみましょう。参考までに、コントローラーメソッドの更新されたコードを次に示します。HttpResponseMessageがIHttpActionResultに置き換えられていることに注意してください。

public IHttpActionResult Get(int id)

        {

            var result = repository.GetData(id);

            if (result == null)

                return NotFound();

            return Ok(result);

        }

上記のGetメソッドを参照してください。コードは非常にシンプルで無駄がなく、コントローラーでHttpメッセージが実際に作成される方法を抽象化します。そして、ここに別の例があります。

成功または失敗を報告するには、HttpResponseMessageを返す次のコードスニペットを参照してください。

public HttpResponseMessage Delete(int id)

        {

            var status = repository.Delete(id);

            if (status)

               return new HttpResponseMessage(HttpStatusCode.OK);

            return new HttpResponseMessage(HttpStatusCode.NotFound);

        }

ここで、IHttpActionResultを使用して同じアクションメソッドをリファクタリングして、コードをよりスリムでシンプルにする方法を確認します。

public IHttpActionResult Delete(int id)

        {

            var status = repository.Delete(id);

            if (status)

              return Ok();

            return NotFound();

        }

どちらを使用する必要があり、その理由は何ですか?

したがって、応答を返送するときに、WebAPIコントローラーのHttpResponseMessageではなくIHttpActionResultを使用する必要がありますか?これがこの質問に対する私の答えです。そうすることで、コントローラーの単体テストが単純化されるので、私は常にHttpResponseMessageよりもIHttpActionResultを好みます。 Http応答を作成するための共通ロジックを他のクラスに移動し、コントローラーメソッドをスリムでシンプルにすることができます。本質的に、Http応答の作成に関する低レベルの詳細はカプセル化されます。

別の注意点として、IHttpActionResultを使用する場合、単一責任の原則に従うことができ、アクションメソッドはHttp応答メッセージを作成するのではなくHttp要求の処理に集中できることに注意してください。言及する価値のある別のポイントがあります。IHttpActionResultを利用して、RazorでHTMLのサポートを提供できます。あなたがする必要があるのは、Razorビューを解析できるカスタムアクション結果を作成することです。カスタムアクションの結果を作成するのは簡単です。IHttpActionResultインターフェイスを拡張してから、独自のバージョンのExecuteAsyncメソッドを実装する必要があります。