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


138

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

私の理解では、Web APIコントローラーMVCコントローラーの両方がJSONを返すことができます。

私のシナリオでは、Web APIコントローラーまたはMVCコントローラーを使用する必要がありますか?



1
注意すべき重要な点は、この質問は特定のコンテキストに固有であるということです。作者は、jsonのみを返す必要がある場合に使用するコントローラーを知りたいと考えています。REST APIは、コンテンツネゴシエーションに応じて異なるメディアフォーマットを許可します(例:XMLの受け入れ、JSONの受け入れ)。この場合、WebAPIコントローラが最良のオプションです
Sentinel '19年

回答:


156

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

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

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

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

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


32

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

あなたのケースでは、JSONでクライアントと話す必要があるだけです。

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

だからあなたの特定の状況(私が正しく理解しているなら)のために、私はコントローラーにこだわります。


ありがとう、WebAPIとコントローラーの作成方法に違いはありますか?
Nil Pun 2012

1
@flybyteはい、ApiControllerから派生する必要があります。asp.net/ web
Muhammad Hasan Khan

4
Web APIは、JSON、およびリストされている他のメソッドを実行できます。コントローラは(きちんと)APIに変換できません。そのため、ユーザーが尋ねる先見性を持っていることを考えると、よりスケーラブルで柔軟なソリューションを使用することをお勧めします。昔ながらのWCFサービスのようなものではなく、Web APIは一般に強力かつ柔軟です。したがって、必要なのは単純なシナリオだけですが、邪魔になりません。必要に応じてパワーを手に入れましょう
steve

8

答えは結局のところ、懸念の分離、サービスの作成の高速化、および構成ではなく慣例に依存することです。

コントローラの主な責任は、ビューとモデルの間のコーディネータとして機能することですが、APIの主な責任は、データを処理することです。APIの規約の場合、CRUD操作を実行することは本当に簡単になります。以下はCRUD操作とHTTPアクション間のマッピングです

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

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


0

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

domain.com/api/area1/controller1/

domain.com/api/area2/controller1/

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


これは回答ではなくコメントのようです。
ディランヘイズ

あなたが何を言っているのか、本当に気にしないでください。コントローラーにArea1XControllerという名前を付けると、domain.com / Area1X / 1、コントローラーにArea2XControllerを作成して、domain.com / Area2X / 1でアクセスできます。大きな問題は、なぜとにかくそれをしたいのかということです。エリア名は抽象的であり、ユーザーには何も言わない。あなたが4つのエリアを言うことができるなら、それには機能的な目的の名前を使用する方が良いです。
Herman Van Der Blom、2015

0

私はショーン・ウィルソンの(トップアンサー)の回答に同意しますが、私が少し混乱していて、次の(おそらく正しくない)予知で理解しようとしているので、理由はわかりません-

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

Shaunの回答の最後の行に「基本的なブラウザーのルーティングとSPAの配信を処理するためにMVCコントローラーを使用している」と記載されているため、私はここがどのように間違っているのかわからず混乱しています。-JSON形式で応答を受信するJavaScriptメソッドである可能性があると想定した場合、私は静止クライアントが何であるかを完全には知りません。これは、私の質問への回答としてリモートで関連していたStackoverflowの最も近い投稿なので、質問を複製する代わりにこの投稿に回答します。


MVCコントローラーを使用してビューを配信する」ビューを構成するために、SPAをMVCパーシャルにラップできます。ASP.NET MVC開発者は、この概念を理解する必要があります。ビューの生成(サーバー側の処理など)中に通常のRazor + ASP.NET機能を利用して、HTML + JSをクライアントにレンダリングできます。多くの開発者がここで経験する問題は、静的なHTML + JSファイルがSPAをSPAにするものではないという考えです。コンテンツは動的でユーザーに固有である必要がある場合がありますが、すべてのフレームワークはこの事実を損なう傾向があります。「SPA」と「MVC」は相互に排他的ではありません。
Shaun Wilson

0

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

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

例えば:

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

このシナリオでは、WebApiを使用して一部のJSONを返し、JavaScriptを使用して必要なHTMLを生成できますが、通常、JavaScriptを使用して大量のHTMLを作成することはお勧めできません。C#でHTMLを作成し、部分ビューを介して返すようにすると、JavaScript解析でエラーが発生する可能性が低くなるため、はるかに優れています。言うまでもなく、これによりHTMLの記述がはるかに簡単になります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.