ASP.NET MVCのApiControllerとControllerの違い


343

私はASP.NET MVC 4ベータで遊んでいて、2種類のコントローラーが表示されるようになりました:ApiControllerController

特定のコントローラーを選択できる状況について、私は少し混乱しています。

例:ビューを返したい場合はApiController、通常またはを使用する必要がありControllerますか?WCF Web APIがMVCと統合されていることを知っています。

これで両方のコントローラーを使用できるようになったので、対応するコントローラーがどの状況に行くかを誰かに指摘してもらうことができます。


23
重要:ASPNETコアは「マージ」されApiControllerているControllerため、新しい.NETを使用している場合は、ApiControllerについて心配する必要はありません-docs.microsoft.com/en-us/aspnet/core/tutorials/first-web- api
Simon_Weaver

2
彼らがうれしかった!私はこれまでに、prideparrot.com
blog /

回答:


356

コントローラーを使用して、通常のビューをレンダリングします。ApiControllerアクションは、シリアル化されてクライアントに送信されるデータのみを返します。

ここにリンクがあります

見積もり:

注ASP.NET MVCを使用したことがある場合は、既にコントローラーに精通しています。これらはWeb APIでも同様に機能しますが、Web APIのコントローラーは、ControllerクラスではなくApiControllerクラスから派生します。あなたが気付く最初の大きな違いは、Web APIコントローラー上のアクションはビューを返さず、データを返すということです。

ApiControllersはデータを返すことに特化しています。たとえば、クライアントから要求された形式にデータを透過的にシリアル化します。また、デフォルトでは別のルーティングスキームに従い(URLをアクションにマッピングするなど)、慣例によりRESTフルAPIを提供します。

おそらく、some(?)手動コーディングを使用して、ApiControllerの代わりにControllerを使用して何かを実行できます。最終的に、両方のコントローラーはASP.NETの基盤の上に構築されます。しかし、RESTフルAPIを使用することは、今日のような共通の要件であり、そのようなAPIの実装を簡素化するためにWebAPIが作成されました。

HTMLベースのWeb /インターネット/イントラネットアプリケーションを作成している場合-たまにAJAX呼び出しが時々jsonを返す場合-MVC /コントローラーを使用します。システムにデータ駆動型/ RESTフルのインターフェイスを提供する場合は、WebAPIを使用してください。もちろん、両方を組み合わせることができます。AVCは、MVCページからのAJAX呼び出しに対応します。

実例を挙げましょう。私は現在、エンティティにRESTフルAPIを提供するERPシステムを使用しています。このAPIには、WebAPIが適しています。同時に、ERPシステムは、RESTフルAPIのクエリを作成するために使用できる高度にAJAX化されたWebアプリケーションを提供します。Webアプリケーション自体をMVCアプリケーションとして実装し、WebAPIを利用してメタデータなどを取得できます。


9
注:データはネットワーク経由で送信されるため、どのようにフォーマットされますか?ApiControllerリターンがフォーマットされているデータはコンテントネゴシエーション、およびGlobalConfiguration.Configuration.Formattersによって決定される方法...リンク:blogs.msdn.com/b/kiranchalla/archive/2012/02/25/...
ティム・ラヴェル・スミス

1
Web APIはWebサイト、モバイルなどの一般的なプラットフォームであると言って間違いありませんか?Web APIの代わりにクラスライブラリを使用できますか?
Imad Alazani 2013

@ TimLovell-Smithに感謝します。私にとってAndreは質問に答えません。コントローラはデータを返すこともできるので、ApiControllerが存在し、有用である理由を説明していません。
JYL 2013

2
@JYLより詳細な情報を提供するために、回答を増やしました。
Andre Loker

2
「慣例によりRESTフルAPIを提供する」と言ったとき、私は本当にわかりませんでした。REST-ful APIをどのように提供しますか?APIから返すデータに依存しませんか?コントローラーには、APIをRESTフルに強制する(または促進する)ものはありません。
Nawaz

192

どちらを書いて保守しますか?

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();
  }
}

6
それは良い点ですが、ApiControllerは単なるJSONシリアル化以上のものです。また、リクエストを確認し、それが受け入れタイプの場合はXMLを返します。
Jake Almer 2016年

10
asp.netコアを使用する場合、それらはすべてControllerクラスから派生します。
Tan

2
これは古い例のようですが、動作するApiControllerだけで心配する必要: Controllerはありません。新しいドットネットコアコントローラの例も追加できますか
Ashish Kamble

@ AshishKamble、ApiControllerの代わりに、ControllerBaseが使用されるようになりました。
Vladimir Shiyanov

正直なところ、私はJson()バージョンが欲しいです。より明確で明確です。私のコードがリクエストにどのように応答するかを理解しようとする際に、多くの黒魔術が好きではない
Jez、

27

ASP.NET CoreのMVC6が2つのパターンを1つに統合したのは、私が両方の世界をサポートする必要があるためです。それはあなたが任意の標準MVCを微調整することができますことは事実だがController(および/または独自の開発ActionResultと同じように行動&動作するクラス)ApiController、非常に維持するのは難しいとテストになりますその上、持つコントローラ返すメソッドActionResult他者との混合を生のIHttpActionResultデータやシリアル化されたデータを返すことは、開発者の観点から見ると非常に混乱する可能性があります。特に、単独で作業しておらず、他の開発者にそのハイブリッドアプローチでスピードを上げる必要がある場合は特にそうです。

ASP.NET非コアWebアプリケーションの問題を最小限に抑えるためにこれまでに行った最良の方法は、Web APIパッケージをMVCベースのWebアプリケーションにインポート(および適切に構成)することです。ワールド:ControllersビューApiControllers用、データ用。

そのためには、次のことを行う必要があります。

  • NuGet:Microsoft.AspNet.WebApi.Coreとを使用して、次のWeb APIパッケージをインストールしますMicrosoft.AspNet.WebApi.WebHost
  • 1つ以上のApiControllersを/Controllers/フォルダーに追加します。
  • 次のWebApiConfig.csファイルを/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.csまたはGlobal.asax.csOWINスタートアップテンプレートを使用しているかどうかに応じて、)。

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);
    // ...
}

このアプローチとその長所と短所については、ブログに書いたこの投稿で詳しく説明しています。


1
良いこと。ただし、この機能はvs2015ですでに組み込まれています。webapi asp.netプロジェクトを作成すると、すべてのボイラープレートコードが自動的に作成されます。
suomi-dev 2018

@Darksealは、「保守およびテストが非常に困難になる可能性がある」について少し詳しく説明してもらえますか?(私はあなたのブログ投稿を読みました)私はWebAPI2を使用しており、それがどのように機能するかが気に入っています。しかし、「物事の一般的な方法」以外に「本当の大きなメリット」を理解することはできません。「手動で」シリアル化された文字列を返す従来のMVCコントローラーを使用するのは簡単です。json / xmlスイッチをhttp Accept動詞で追加しても、それほど時間はかかりません。これらはすべて、便利なユーティリティメソッドにラップすることができます。
ValGe

2
@ValGe、上記の@ manish-jainの回答を参照してください。簡単に言えば、ControllerJsonでシリアル化された文字列をにラップして返すことは、アイテムのリストを直接返すように設定できるものActionResultよりもテストと管理ApiControllerが明らかに困難[Serializable]です。毎回手動でシリアル化を解除する必要がないため、どのテストメソッドでも簡単に記述できます。ASP.NETまたは他のフレームワークとのほぼすべてのシステム統合タスクについて、同じことが言えます。Controllersは素晴らしいApiControllersですが、少なくとも.NET Framework 4.xでは、RESTfulタスクに適しています
Darkseal

1

Web APIのすべてのメソッドは、シリアル化せずにデータ(JSON)を返します。

ただし、MVCコントローラーでJSONデータを返すために、返されるAction ResultタイプをJsonResultに設定し、オブジェクトでJsonメソッドを呼び出して、JSONにパッケージ化されていることを確認します。


1

主な違いは次のとおりです。WebAPIはあらゆるクライアント、あらゆるデバイス向けのサービスであり、MVCコントローラーはそのクライアントにのみサービスを提供します。MVCプラットフォームなので同じです。


-1

HTMLベースのWeb /インターネット/イントラネットアプリケーションを作成している場合-たまにAJAX呼び出しがあり、あちこちにjsonを返す場合-MVC /コントローラーを使用します。システムにデータ駆動型/ RESTフルのインターフェイスを提供する場合は、WebAPIを使用してください。もちろん、両方を組み合わせることができます。AVCは、MVCページからのAJAX呼び出しに対応します。基本的にコントローラーはmvcに使用され、api-controllerはRest- APIに使用されます。両方を同じプログラムで必要に応じて使用できます

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