ASP.NET MVCのApicontrollerとControllerの違い
-
14-11-2019 - |
質問
私はASP.NET MVC 4ベータ版で遊んでいます。これで2種類のコントローラが表示されます。
私は特定のコントローラを選ぶことができるどのような状況で混乱しています。
EXの場合:ビューを返したい場合は、ApiController
または通常のController
を使用しますか?WCF Web APIがMVCと統合されていることを認識しています。
今から両方のコントローラを使用できます誰かが対応するコントローラのために行く状況を指すことができます。
解決
コントローラを使用して通常のビューをレンダリングします。 Apicontrollerアクションシリアル化されてクライアントに送信されるデータのみを返します。
引用:
注ASP.NET MVCで働いていた場合は、すでにコントローラに精通しています。それらはWeb APIでも同様に機能しますが、Web APIのコントローラは、Controllerクラスの代わりにApicontrollerクラスから派生します。最初の主な違いは、Web APIコントローラのアクションがビューを返さないということです。
Apicontrollersはデータの返却に特殊化されています。たとえば、データをクライアントから要求された形式に透過的にシリアル化するように注意してください。また、それらはデフォルトで異なるルーティング方式をたどります(ActionsへのマッピングURLのように)、規約によってREST-FUL APIを提供します。
ある(?)手動符号化を持つApicontrollerの代わりにコントローラを使用して何でもすることができます。最後に、両方のコントローラがASP.NET Foundationに構築します。しかし、REST-FUL APIを持つことは、このような一般的な要件で、そのようなAPIの実装を単純化するためにWebAPIが作成されたことです。
2つの間を決めるのはかなり簡単です。システムにデータ駆動型/ REST-FULインターフェースを提供したい場合は、WebAPIで行ってください。もちろん、コースの両方をMVCページからApicontroller Cater Ajax呼び出しを持つことができます。
現実世界の例を与えるために:私は現在、そのエンティティにREST-FUL APIを提供するERPシステムを使用しています。このAPIの場合、WebAPIは良い候補者になるでしょう。同時に、ERPシステムは、REST-FUL APIのクエリを作成するために使用できる非常にAJAX-IFIED Webアプリケーションを提供します。 Webアプリケーション自体はMVCアプリケーションとして実装され、WebAPIを使用してメタデータなどを取得することができます。
他のヒント
どちらを書いて維持しますか?
ASP.NET MVC
public class TweetsController : Controller {
// GET: /Tweets/
[HttpGet]
public ActionResult Index() {
return Json(Twitter.GetTweets(), JsonRequestBehavior.AllowGet);
}
}
.
ASP.NET Web API
public class TweetsController : ApiController {
// GET: /Api/Tweets/
public List<Tweet> Get() {
return Twitter.GetTweets();
}
}
. ASP.NET CoreのMVC6が両方の世界をサポートする必要があるため、2つのパターンをマージしたという事実が大好きです。 Controller
のように、標準のMVC ActionResult
(および/または独自のApiController
クラスを開発する)を調整することはできますが、それは維持し、テストするのが非常に難しいことがあります。 Controllers メソッドRaw / Serialized / ActionResult
データを返す他のものとの混合を返すことは、開発者の観点から非常に混乱し、他の開発者がそのハイブリッドアプローチでスピードにする必要がある場合には、開発者の観点から非常に混乱を招く可能性があります。
最良のテクニックASP.NETノンコアWebアプリケーションの問題を最小限に抑えるためにこれまでに来て、Web APIパッケージをMVCベースのWebアプリケーションにインポート(適切に設定)することであるため、両方の世界の最善:IHttpActionResult
for Views用、Data用のControllers
。
それをするためには、次のことを行う必要があります。
- NUGET:
ApiControllers
とMicrosoft.AspNet.WebApi.Core
を使用して、次のWeb APIパッケージをインストールします。 -
Microsoft.AspNet.WebApi.WebHost
フォルダに1つ以上のApicontrollersを追加します。 -
/Controllers/
フォルダに次の webapiconfig.cs ファイルを追加します。
.using System.Web.Http; public static class WebApiConfig { public static void Register(HttpConfiguration config) { // Web API routes config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); } }
最後に、上記のクラスを Startup クラス(OWINスタートアップテンプレートを使用しているかどうかに応じて、
/App_Config/
またはStartup.cs
)に登録する必要があります。startup.cs
.public void Configuration(IAppBuilder app) { // Register Web API routing support before anything else GlobalConfiguration.Configure(WebApiConfig.Register); // The rest of your file goes there // ... AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); ConfigureAuth(app); // ... }
global.asax.cs
.protected void Application_Start() { // Register Web API routing support before anything else GlobalConfiguration.Configure(WebApiConfig.Register); // The rest of your file goes there // ... AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); // ... }
このアプローチ - その長所と短所とともに - この記事私はブログに書いた。
Web APIのすべてのメソッドはシリアル化なしでデータ(JSON)を返します。
しかしながら、MVCコントローラでJSONデータを返すために、返されたアクション結果タイプをJSONRESULTに設定し、JSONのJSONメソッドをJSONにパッケージ化するようにします。
主な違いは次のとおりです.Web APIは、任意のクライアント、デバイス、およびMVCコントローラのサービスがクライアントに提供するためのサービスです。MVCプラットフォームなので同じです。
2つの間を決めるのはかなり簡単です。システムにデータ駆動型/ REST-FULインターフェースを提供したい場合は、WebAPIで行ってください。もちろんMVCページからApicontroller Cater Ajax呼び出しを持つ両方を組み合わせることができます。 基本的にコントローラはMVCに使用されており、APIコントローラはRESTに使用されています。 APIあなたはあなたの必要性と同じプログラムで使用することができます