384

ASP.NET MVC 4ベータ版で遊んでいますが、現在、ApiControllerとの2種類のコントローラーが表示されていControllerます。

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

例:ビューを返したい場合は、使用する必要がありますApiControllerか、それとも通常Controllerですか?WCFWebAPIがMVCと統合されたことを認識しています。

今では両方のコントローラーを使用できるので、誰かが対応するコントローラーのどちらの状況に行くかを指摘してください。

4

8 に答える 8

386

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

ここにリンクがあります

引用:

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

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

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

2つのどちらかを決めるのはかなり簡単です。HTMLベースのWeb/インターネット/イントラネットアプリケーションを作成している場合(たまにAJAX呼び出しでjsonをあちこちに返す場合)、MVC/Controllerを使用します。システムにデータ駆動型/RESTフルインターフェイスを提供する場合は、WebAPIを使用してください。もちろん、両方を組み合わせて、MVCページからのAJAX呼び出しにApiControllerが対応できるようにすることもできます。

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

于 2012-02-29T07:32:34.770 に答える
201

どちらを書き、維持しますか?

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();
  }
}
于 2013-04-30T17:42:04.463 に答える
33

ASP.NET CoreのMVC6が2つのパターンを1つにマージしたという事実が気に入っています。これは、両方の世界をサポートする必要があることが多いためです。Controller標準のMVCを微調整して(および/または独自のActionResultクラスを開発して)、のように動作および動作させることができるのは事実ですがApiController、保守とテストが非常に難しい場合があります。さらに、ControllersActionResultメソッドを他のメソッドと混合して返すようにすることもできます。生/シリアル化/IHttpActionResultデータを返すことは、開発者の観点からは非常に混乱する可能性があります。特に、単独で作業しておらず、他の開発者にそのハイブリッドアプローチを高速化する必要がある場合はそうです。

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

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

  • NuGetを使用して次のWebAPIパッケージをインストールします。Microsoft.AspNet.WebApi.CoreおよびMicrosoft.AspNet.WebApi.WebHost
  • 1つ以上のApiControllerを/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 }
        );
    }
}

最後に、上記のクラスをスタートアップクラスに登録する必要があります(OWINスタートアップテンプレートを使用しているかどうかに応じて、またはのいずれか)Startup.csGlobal.asax.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);
    // ...
}

このアプローチは、その長所と短所とともに、私がブログに書いたこの投稿でさらに説明されています。

于 2016-08-11T15:16:49.697 に答える
7

クイックnショートアンサー

ビューを返したい場合は、「コントローラ」にいる必要があります。

通常のコントローラー-ASP.NETMVC: ASP.net Webアプリケーションを使用している場合は、通常の「コントローラー」を処理します。Controller-Actionsを作成し、Views()を返すことができます。

ApiControllerコントローラー: ASP.netRESTAPIを開発するときにApiControllerを作成します。ビューを返すことはできません(ただし、HTMLのJson / Dataを文字列として返すことはできます)。これらのAPIはバックエンドと見なされ、ビューではなくデータを返すためにそれらの関数が呼び出されます

これを答えとしてマークすることを忘れないでください、注意してください

詳細はこちら

于 2020-09-17T19:37:26.743 に答える
1

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

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

于 2018-02-20T04:16:01.273 に答える
1

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

于 2019-02-21T01:40:01.713 に答える
0

ここに画像の説明を入力してください

最新のフレームワーク4.7.2で新しいWebアプリケーションを作成する場合は、両方ともデフォルトで構成され、その上にアプリケーションを構築できます。

ここに画像の説明を入力してください

于 2021-07-13T06:36:29.067 に答える
-2

Asp.net Core3+Vesrionで

コントローラー:IActionResultとデータに関連するものも返したい場合は、コントローラーコントローラーに移動します

ApiController:APIコントローラーの属性/表記として使用されます。ControllerBaseクラスを継承します

ControllerBase:データを返したい場合は、ControllerBaseクラスのみを使用してください

于 2020-09-17T19:56:32.817 に答える