1

私はwebapi、MVC4プロジェクトで作業しています。(リポジトリパターンと作業単位を使用)2つの質問があります

1)WebApiのGetByIdは、エンティティまたはHttpResponseMessageを返す必要がありますか?HttpResponseMessageの場合は、...

[System.Web.Http.HttpGet]
public HttpResponseMessage Get(int id)
{
    var car = Uow.Cars.GetById(id);
    return car == null ? Request.CreateResponse(HttpStatusCode.OK, car) : Request.CreateResponse(HttpStatusCode.NotFound,);
}

また

[System.Web.Http.HttpGet]
public HttpResponseMessage Get(int id)
{
    var car= Uow.Cars.GetById(id);
    if (car!= null) {
        return car;
    }
    throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound));
}

RESTfullの応答をフォローしたいと思います。

2)WebAPIサービスをUIから分離することは論理的ですか?つまり、1つのwebapiプロジェクトでは、ベースApiControllerとCRUD http操作を備えたコントローラーを使用して、どこからでも/任意のデバイスから直接呼び出すことができます。次に、webapiプロジェクトのサービスを呼び出す別のwebapi / MVC4プロジェクトですか?

同じコントローラーにビューを返すサービスと処理があると、サービスを消費するクライアントにサービスを結合するように聞こえるので、これを求めています。

例:これから(同じwebapiコントローラー内で):

[System.Web.Http.HttpGet]
public HttpResponseMessage Get(int id)
{
    var car = Uow.Cars.GetById(id);
    return car!= null ? Request.CreateResponse(HttpStatusCode.OK, car) : Request.CreateResponse(HttpStatusCode.NotFound,);
}

public ViewResult Details(long id)
{
    return View(Get(id));
}

これに移動します:

public ViewResult Details(long id)
{
    return View(webapiService.Cars.Get(id));
}

Get intheserviceを実装する。

4

2 に答える 2

1

リターンタイプとしてHttpResponseMessageまたはエンティティを使用できます。Carを使用HttpResponseMessageすると、応答を作成するときにHTTPプロパティの一部をカスタマイズする際の制御が強化されます。

アクションがリソースを作成するときにHttpResponseMessage、リターンタイプとしてを使用すると、ステータスコード(201)と、作成されたリソースにアクセスできる場所を設定するための非常に柔軟なオプションが提供されます。詳細については、この投稿を参照してください。

RESTは、呼び出し元がリソースを要求したときに、呼び出し元が適切なステータスコード(存在する場合は200、それ以外の場合は404)でリソースを受け入れることができる形式でリソースを返す必要があるため、どのように使用するかを気にしません。

異なるクライアントからサービスを利用できるという選択肢が本当にある場合は、WebAPIコントローラーを別のプロジェクトに移動できます。それ以外の場合は、それを避けてください。WebAPIコントローラーを別のプロジェクトに移動すると、MVCプロジェクトのjavascriptからWebAPIコントローラーを使用しようとすると、クロスドメインの問題が発生します。

于 2012-11-13T12:09:33.130 に答える
0

ポイント1:Web APIの場合、アクションからエンティティを返すことは論理的ですが、HttpResponseMessageプロパティ(HttpStatusCodeなど)を制御することはできません。エンティティを返すことが常によりクリーンなアプローチであることを除いて。それぞれのフィルターでシリアル化、フォーマットなどを制御して、作業を完了することができます。ただし、コンパイラではリターンタイプがHttpResponseMessageでリターンタイプがCarのメソッドをコンパイルできないため、オプションでcar/HttpResponseMessageを返すことはできません。

ポイント2:ビュー呼び出しとREST呼び出し用に別々のコントローラーを用意することをお勧めします。同じ名前で異なる名前空間にあるコントローラーを使用し、ルートでhttp呼び出しを個別に処理することをお勧めします(ただし、残りの呼び出しの前に「/api/」を追加します。ViewResultとHttpResponseMessage/Carの同じコントローラーで異なるアクションを使用することはオプションです。また、しかし、それほどきれいで分離されていません。

于 2012-11-12T08:16:21.250 に答える