クライアントスクリプトが重いASP.NET MVCアプリケーションを構築しています。JSONとjQueryを使用してDOMを操作します。
私の理解はWeb API ControllerとMVC Controllerの両方がJSONを返すことができるということです。
私のシナリオでは、Web API ControllerまたはMVC Controllerを使用する必要がありますか?
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コントローラーを使用します。
WebAPIはAPIを作成するためのものです。 XML、JSONなどでAPIを使用できるようにしたい場合は、Web APIを作成できます。
あなたの場合は、JSONでクライアントと話すだけで済みます。
Webサイトの大部分はクライアントスクリプト駆動ですが、ASP.NET MVCコントローラーを使用しているでしょうか?また、エンティティに基づいてコントローラーを既に論理的に分割している可能性があるため、Web API専用の別のクラスを作成するのではなく、jsonサービスメソッドを追加することは理にかなっています。
そのため、あなたの特定の状況(私が正しく理解している場合)については、コントローラーに固執します。
答えは、懸念の分離、サービスの作成の迅速化、構成ではなく慣習に依存することです。
コントローラーの主な責任は、ビューとモデルの間のコーディネーターとして働くことですが、APIの主な責任はデータに取り組むことです。 APIの規則の場合、CRUD操作の実行が非常に簡単になります。以下は、CRUD操作とHTTPアクション間のマッピングです
そのため、APIを使用すると、個別のアクションを作成してHTTPアクションに関連付ける必要はありません。
このシナリオでは、Javascript要求に基づいてこのようなデータを転送するのに最適なWebApiをお勧めします。通常、WebApiコントローラーを開発して、JSONフレンドリオブジェクトを返し、Javascriptで簡単に解析できるようにします。
この種のことのためにMVCコントローラーでアクションを使用する唯一のリアルタイムは、HTMLを生成し、ページのセグメントをJavascript呼び出しで置き換えたい場合です。
例えば:
選択すると、選択した日のイベントを表すラジオボタンのリストを生成するJQuery UI Datepickerがあります。
このシナリオでは、WebApiを使用してJSONを返し、Javascriptを使用して必要なHTMLを生成できますが、一般的にJavascriptを使用して多くのHTMLを作成することは悪い習慣です。 C#でHTMLを構築し、部分ビューを介して返すと、Javascript解析でエラーが発生する可能性が低くなるため、はるかに優れています。言うまでもなく、HTMLの記述がはるかに簡単になります。
私がApiControllerで懸念しているのは、エリアベースではなくサイトベースであるということです。 1つのサイトには、コントローラーメソッドに名前を付けるためのapicontrollerサブフォルダーを1つだけ持つことができます。異なるエリアでコントローラー名を複製したい場合があります:
domain.com/api/area1/controller1/
domain.com/api/area2/controller1/
これを行うためのカスタムコード設定がいくつかありますが、デフォルトでは機能しません。
私はショーン・ウィルソンの(トップアンサー)答えに同意しますが、私は少し混乱し、以下の(おそらく間違った)予言でまだ理解しようとしているので、なぜかわかりません-
Shaunの答えの最後の行には、「基本的なブラウザルーティングとSPAの配信を処理するためにMVCコントローラーを使用している」と書かれているため、ここで私が間違っているかわかりません。 -おそらく、JSON形式で応答を受け取るJavaScriptメソッドであると仮定した場合、安らかなクライアントが何であるかを完全には知りません。これは、私の質問への回答としてリモートで関連したStackoverflowの最も近い投稿なので、質問を重複させる代わりにこの投稿に回答しています。