web-dev-qa-db-ja.com

ASP.NET MVCにおけるApiControllerとControllerの違い

私はASP.NET MVC 4ベータ版を試してきましたが、現在2つのタイプのコントローラ、ApiControllerControllerを見ました。

私はどのような状況で私が特定のコントローラーを選ぶことができるかについて少し混乱しています。

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

今から両方のコントローラを使用することができます誰かが対応するコントローラのために行くべき状況を指摘してください。

309
VJAI

通常のビューをレンダリングするために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を使用してメタデータなどを取得することができます。

321
Andre Loker

どっちを書いて維持しますか。

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

私はしばしば両方の世界をサポートする必要があるので、ASP.NET CoreのMVC6が2つのパターンを1つにマージしたという事実が大好きです。標準のMVC Controllerを微調整(および/または独自のActionResultクラスを開発)してApiControllerのように振る舞い、振る舞うことができるのは事実ですが、テストする:その上に、ControllersメソッドがActionResultを返し、他のデータと混合してraw/serialized/IHttpActionResultデータを返すことは、開発者にとって非常に混乱しやすい特に、単独で作業しておらず、他の開発者をそのハイブリッドアプローチでスピードアップする必要がある場合に特に重要です。

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

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

  • NuGetを使用して、次のWeb APIパッケージをインストールします:Microsoft.AspNet.WebApi.Coreおよび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クラスに登録する必要があります(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);
    // ...
}

このアプローチは、その長所と短所とともに- この投稿 でブログに書いています。

27
Darkseal

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

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

1
Shailesh Uke

ほぼ1つですが、MVCとAPIの間で名前、使用目的、および透過性が異なります。

0
user11592203

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

0
Anjyr

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

0
user9521236