web-dev-qa-db-ja.com

WebAPIまたはMVCを使用してASP.NETでJSONを返す

クライアントスクリプトが重いASP.NET MVCアプリケーションを構築しています。JSONとjQueryを使用してDOMを操作します。

私の理解はWeb API ControllerMVC Controllerの両方がJSONを返すことができるということです。

私のシナリオでは、Web API ControllerまたはMVC Controllerを使用する必要がありますか?

137
Nil Pun

Web APIコントローラーは、MVCアプリケーションだけでなく、ASP.NETアプリケーションで作成およびホストできます。したがって、Web APIを作成する明白な理由は、MVCフロントエンド(たとえば、会社/組織がホストする従来のRESTful Webサービス)がない場合です。

MVCコントローラーは、通常、MVCフレームワークに依存しています。デフォルトのテンプレートと、コミュニティとピアが行うほとんどの作業を見ると、ほぼすべてのMVCコントローラーがビューを念頭に置いて実装されていることがわかります。

個人的に、View()で応答する場合はMVCコントローラーを使用し、特定のビューに依存しないものにはWeb APIを使用します。

もちろん注意点はありますが、一般的に言えば、MVCのモデルバインド動作が必要ない場合、サービスはデータ中心であり、操作はデータ中心(CRUD操作など)であるため、「Web API Controller '' Model-View Controller 'の代わりに。逆に、操作がビュー中心の場合(たとえば、ユーザー管理ページをユーザーに配信する場合)、または 'ajaxパーシャル'を生成するためにMVCのモデルバインディングが必要な場合(非常に低い)、代わりにMVCコントローラーが必要になります。

個人的には、JSONベースのRESTfulクライアントを駆動するためにWeb APIコントローラーを使用し、SPAの基本的なブラウザールーティングと配信を処理するためにMVCコントローラーを使用します。

155
Shaun Wilson

WebAPIはAPIを作成するためのものです。 XML、JSONなどでAPIを使用できるようにしたい場合は、Web APIを作成できます。

あなたの場合は、JSONでクライアントと話すだけで済みます。

Webサイトの大部分はクライアントスクリプト駆動ですが、ASP.NET MVCコントローラーを使用しているでしょうか?また、エンティティに基づいてコントローラーを既に論理的に分割している可能性があるため、Web API専用の別のクラスを作成するのではなく、jsonサービスメソッドを追加することは理にかなっています。

そのため、あなたの特定の状況(私が正しく理解している場合)については、コントローラーに固執します。

30

答えは、懸念の分離、サービスの作成の迅速化、構成ではなく慣習に依存することです。

コントローラーの主な責任は、ビューとモデルの間のコーディネーターとして働くことですが、APIの主な責任はデータに取り組むことです。 APIの規則の場合、CRUD操作の実行が非常に簡単になります。以下は、CRUD操作とHTTPアクション間のマッピングです

  • GET:読み取り
  • POST:作成
  • PUT:更新
  • 削除:削除

そのため、APIを使用すると、個別のアクションを作成してHTTPアクションに関連付ける必要はありません。

7
Kris

このシナリオでは、Javascript要求に基づいてこのようなデータを転送するのに最適なWeb​​Apiをお勧めします。通常、WebApiコントローラーを開発して、JSONフレンドリオブジェクトを返し、Javascriptで簡単に解析できるようにします。

この種のことのためにMVCコントローラーでアクションを使用する唯一のリアルタイムは、HTMLを生成し、ページのセグメントをJavascript呼び出しで置き換えたい場合です。

例えば:

選択すると、選択した日のイベントを表すラジオボタンのリストを生成するJQuery UI Datepickerがあります。

このシナリオでは、WebApiを使用してJSONを返し、Javascriptを使用して必要なHTMLを生成できますが、一般的にJavascriptを使用して多くのHTMLを作成することは悪い習慣です。 C#でHTMLを構築し、部分ビューを介して返すと、Javascript解析でエラーが発生する可能性が低くなるため、はるかに優れています。言うまでもなく、HTMLの記述がはるかに簡単になります。

0
jezzipin

私がApiControllerで懸念しているのは、エリアベースではなくサイトベースであるということです。 1つのサイトには、コントローラーメソッドに名前を付けるためのapicontrollerサブフォルダーを1つだけ持つことができます。異なるエリアでコントローラー名を複製したい場合があります:

domain.com/api/area1/controller1/

domain.com/api/area2/controller1/

これを行うためのカスタムコード設定がいくつかありますが、デフォルトでは機能しません。

0
Ramon Chan

私はショーン・ウィルソンの(トップアンサー)答えに同意しますが、私は少し混乱し、以下の(おそらく間違った)予言でまだ理解しようとしているので、なぜかわかりません-

  • クライアントがビュー操作を処理できるように、WebAPI Controllerを使用してJSONデータをクライアントに配信します。このプロセスは、ビューを必要とせず、クライアントがクライアント側の操作を処理できるように、メソッドを呼び出すもの(つまり、javascriptリクエスト)への応答のみを必要とします。
  • Page_load中または直後にデータを使用してビューを操作する必要がある場合は、MVCコントローラーを使用します(つまり、SPAアプリ用ではありません)。

Shaunの答えの最後の行には、「基本的なブラウザルーティングとSPAの配信を処理するためにMVCコントローラーを使用している」と書かれているため、ここで私が間違っているかわかりません。 -おそらく、JSON形式で応答を受け取るJavaScriptメソッドであると仮定した場合、安らかなクライアントが何であるかを完全には知りません。これは、私の質問への回答としてリモートで関連したStackoverflowの最も近い投稿なので、質問を重複させる代わりにこの投稿に回答しています。

0
R.H. Thorne