私はASP.NET MVC 4ベータ版を試してきましたが、現在2つのタイプのコントローラ、ApiController
とController
を見ました。
私はどのような状況で私が特定のコントローラーを選ぶことができるかについて少し混乱しています。
例:ビューを返したい場合は、ApiController
または通常のController
を使用します。 WCF Web APIがMVCと統合されたことを私は知っています。
今から両方のコントローラを使用することができます誰かが対応するコントローラのために行くべき状況を指摘してください。
通常のビューをレンダリングするためにControllerを使用してください。 ApiControllerアクションは、シリアル化されてクライアントに送信されたデータのみを返します。
見積もり:
注ASP.NET MVCを使用したことがある場合は、既にコントローラーに精通しています。これらはWeb APIでも同様に機能しますが、Web APIのコントローラはControllerクラスではなくApiControllerクラスから派生しています。あなたが気づく最初の主な違いは、Web APIコントローラー上のアクションはビューを返さず、データを返すということです。
ApiControllerはデータを返すことを専門としています。たとえば、クライアントから要求された形式にデータを透過的にシリアル化するようにします。また、デフォルトでは別のルーティングスキームに従っており(URLをアクションにマッピングする場合など)、規約によりREST対応のAPIを提供しています。
ApiControllerの代わりにControllerを使って何か(?)手動コーディングをすることでおそらく何でもできるでしょう。結局、どちらのコントローラもASP.NET基盤の上に構築されています。しかし、RESTに対応したAPIを持つことは今日ではそのような共通の要件であり、WebAPIはそのようなAPIの実装を単純化するために作成されました。
HTMLベースのWeb /インターネット/イントラネットアプリケーションを作成している場合 - たまにここであちこちでjsonを返すAJAX呼び出しで - MVC/Controllerを使用してください。データ駆動型/ REST対応のインターフェースをシステムに提供したい場合は、WebAPIを使用してください。もちろん、両方を組み合わせることができます。もちろん、MVCページからのApiControllerのAJAX呼び出しを使用することもできます。
実例を挙げると:私は現在、そのエンティティにREST対応のAPIを提供するERPシステムで作業しています。このAPIの場合は、WebAPIが適しています。同時に、ERPシステムは、REST対応のAPI用のクエリを作成するために使用できる、AJAX対応の高度な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つのパターンを1つにマージしたという事実が大好きです。標準のMVC Controller
を微調整(および/または独自のActionResult
クラスを開発)してApiController
のように振る舞い、振る舞うことができるのは事実ですが、テストする:その上に、ControllersメソッドがActionResult
を返し、他のデータと混合してraw/serialized/IHttpActionResult
データを返すことは、開発者にとって非常に混乱しやすい特に、単独で作業しておらず、他の開発者をそのハイブリッドアプローチでスピードアップする必要がある場合に特に重要です。
ASP.NETの非コアWebアプリケーションでその問題を最小限に抑えるために私がこれまで来た最善の手法は、Web APIパッケージをMVCベースのWebアプリケーションにインポート(および適切に構成)することです。ワールド:Controllers
ビュー用、ApiControllers
データ用。
そのためには、次のことを行う必要があります。
Microsoft.AspNet.WebApi.Core
およびMicrosoft.AspNet.WebApi.WebHost
。/Controllers/
フォルダーに追加します。/App_Config/
フォルダーに追加します。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クラスに登録する必要があります(Startup.cs
またはGlobal.asax.cs
'OWINスタートアップテンプレートを使用しているかどうか)。
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データを返すためには、返されたAction Result型をJsonResultに設定し、それがJSONにパッケージ化されていることを確認するためにオブジェクトのJsonメソッドを呼び出します。
ほぼ1つですが、MVCとAPIの間で名前、使用目的、および透過性が異なります。
主な違いは次のとおりです。WebAPIはあらゆるクライアント、あらゆるデバイスに対するサービスであり、MVC Controllerはそのクライアントにのみサービスを提供します。 MVCプラットフォームだから同じ。
HTMLベースのWeb /インターネット/イントラネットアプリケーションを作成している場合 - たまにここであちこちでjsonを返すAJAX呼び出しで - MVC/Controllerを使用してください。データ駆動型/ REST対応のインターフェースをシステムに提供したい場合は、WebAPIを使用してください。もちろん、両方を組み合わせることができます。もちろん、MVCページからのApiControllerのAJAX呼び出しを使用することもできます。基本的にコントローラはmvcのために使用され、apiコントローラはRest-APIのために使用されますあなたはあなたの必要性と同じプログラムで両方を使うことができます