Perbedaan antara ApiController dan Controller di ASP.NET MVC

343

Saya telah bermain-main dengan ASP.NET MVC 4 beta dan saya melihat dua jenis pengendali sekarang: ApiControllerdan Controller.

Saya agak bingung pada situasi apa saya bisa memilih pengontrol tertentu.

Sebagai contoh: Jika saya ingin mengembalikan tampilan maka saya harus menggunakan ApiControlleratau biasa Controller? Saya sadar bahwa API Web WCF sekarang terintegrasi dengan MVC.

Karena sekarang kita dapat menggunakan kedua pengendali tersebut, tolong tolong tunjukkan situasi apa yang harus dilakukan untuk pengontrol yang sesuai.

VJAI
sumber
23
Penting: ASPNET Core telah 'bergabung' ApiControllerdan Controllerjadi jika Anda menggunakan .NET yang lebih baru, Anda tidak perlu lagi khawatir tentang ApiController - docs.microsoft.com/en-us/aspnet/core/tutorials/first-web- api
Simon_Weaver
2
Senang mereka melakukannya! Saya meramalkan ini sejak lama dengan cara prideparrot.com/blog/archive/2012/10/asp_net_mvc_vs_webapi
VJAI

Jawaban:

356

Gunakan Pengontrol untuk membuat tampilan normal Anda. Tindakan ApiController hanya mengembalikan data yang diserialisasi dan dikirim ke klien.

ini tautannya

Mengutip:

Catatan Jika Anda telah bekerja dengan ASP.NET MVC, maka Anda sudah terbiasa dengan pengontrol. Mereka bekerja serupa di Web API, tetapi pengontrol di Web API berasal dari kelas ApiController bukan kelas Controller. Perbedaan besar pertama yang akan Anda perhatikan adalah bahwa tindakan pada pengontrol API Web tidak mengembalikan tampilan, mereka mengembalikan data.

ApiControllers memiliki spesialisasi dalam mengembalikan data. Misalnya, mereka menangani serialisasi data secara transparan ke dalam format yang diminta oleh klien. Juga, mereka mengikuti skema perutean yang berbeda secara default (seperti dalam: memetakan URL ke tindakan), menyediakan API REST-ful berdasarkan konvensi.

Anda mungkin dapat melakukan apa saja menggunakan Pengontrol alih-alih ApiController dengan beberapa (?) Pengkodean manual. Pada akhirnya, kedua kontroler dibangun di atas dasar ASP.NET. Tetapi memiliki API REST-ful adalah persyaratan yang umum saat ini sehingga WebAPI dibuat untuk menyederhanakan implementasi API semacam itu.

Cukup mudah untuk memutuskan di antara keduanya: jika Anda menulis aplikasi web / internet / intranet berbasis HTML - mungkin dengan panggilan AJAX sesekali mengembalikan json di sana-sini - tetap dengan MVC / Controller. Jika Anda ingin memberikan antarmuka data-driven / REST-ful ke sistem, pergi dengan WebAPI. Anda dapat menggabungkan keduanya, tentu saja, memiliki ApiController yang melayani panggilan AJAX dari halaman MVC.

Untuk memberikan contoh dunia nyata: Saat ini saya sedang bekerja dengan sistem ERP yang menyediakan API REST-ful untuk entitasnya. Untuk API ini, WebAPI akan menjadi kandidat yang baik. Pada saat yang sama, sistem ERP menyediakan aplikasi web yang sangat AJAX-ified yang dapat Anda gunakan untuk membuat kueri untuk API REST-ful. Aplikasi web itu sendiri dapat diimplementasikan sebagai aplikasi MVC, memanfaatkan WebAPI untuk mengambil meta-data dll.

Andre Loker
sumber
9
Catatan: karena data Anda akan dikirim melalui kabel, bagaimana itu akan diformat? Cara data yang dikembalikan oleh ApiController diformat ditentukan oleh negosiasi konten, dan GlobalConfiguration.Configuration.Formatters ... tautan: blogs.msdn.com/b/kiranchalla/archive/2012/02/25/…
Tim Lovell-Smith
1
Apakah benar mengatakan bahwa API Web adalah Platform umum untuk situs web, seluler, dll? dan kita bisa menggunakan Perpustakaan Kelas alih-alih API Web?
Imad Alazani
Terima kasih @ TimLovell-Smith untuk catatan Anda, karena bagi saya Andre tidak menjawab pertanyaan: sebagai Pengontrol juga dapat mengembalikan data, itu tidak menjelaskan mengapa ApiController ada dan berguna.
JYL
2
@ JYL Saya menambah jawaban saya untuk memberikan informasi lebih rinci.
Andre Loker
2
Saya tidak begitu mengerti ketika Anda mengatakan "menyediakan API REST-ful dengan konvensi" . Bagaimana cara menyediakan REST-ful API? Apakah itu tidak bergantung pada data apa yang Anda kembalikan dari API? Tidak ada dalam controller yang memaksa (atau bahkan memfasilitasi) API menjadi REST-ful.
Nawaz
192

Mana yang ingin Anda tulis dan pertahankan?

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();
  }
}
Manish Jain
sumber
6
Ini poin yang bagus tetapi ApiController lebih dari sekedar serialisasi JSON. Ini juga menangani melihat permintaan dan mengembalikan XML jika itu adalah tipe terima.
Jake Almer
10
Jika Anda menggunakan inti asp.net, semuanya berasal dari Controllerkelas.
Tân
2
Ini tampaknya contoh lama, Sekarang kita tidak perlu khawatir ApiControllerhanya : Controllerbekerja, dapatkah Anda menambahkan contoh dot net core Controller baru juga
Ashish Kamble
@AshishKamble, Alih-alih ApiController, ControllerBase sekarang digunakan.
Vladimir Shiyanov
Jujur, saya lebih suka memiliki Json()versinya. Ini lebih jelas dan lebih eksplisit. Saya tidak suka banyak ilmu hitam dalam mencoba mencari tahu bagaimana kode saya akan menanggapi permintaan.
Jez
27

Saya suka fakta bahwa ASP.NET Core's MVC6 menggabungkan dua pola menjadi satu karena saya sering perlu mendukung kedua dunia. Meskipun benar bahwa Anda dapat mengubah MVC standar apa pun Controller(dan / atau mengembangkan ActionResultkelas Anda sendiri ) untuk bertindak & berperilaku seperti ApiController, itu bisa sangat sulit untuk mempertahankan dan menguji: di atas itu, memiliki metode Pengendali kembali ActionResultdicampur dengan yang lain mengembalikan mentah / serial / IHttpActionResultdata bisa sangat membingungkan dari perspektif pengembang, terutama jika Anda tidak bekerja sendiri dan perlu membawa pengembang lain untuk mempercepat dengan pendekatan hybrid.

Teknik terbaik yang saya lakukan sejauh ini untuk meminimalkan masalah itu dalam aplikasi web non-Core ASP.NET adalah mengimpor (dan mengonfigurasi dengan benar) paket Web API ke dalam Aplikasi Web berbasis-MVC, sehingga saya dapat memiliki yang terbaik dari keduanya worlds: Controllersfor Views, ApiControllersuntuk data.

Untuk melakukan itu, Anda perlu melakukan hal berikut:

  • Instal paket Web API berikut menggunakan NuGet: Microsoft.AspNet.WebApi.Coredan Microsoft.AspNet.WebApi.WebHost.
  • Tambahkan satu atau lebih ApiControllers ke /Controllers/folder Anda .
  • Tambahkan file WebApiConfig.cs berikut ke /App_Config/folder Anda :

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

Terakhir, Anda harus mendaftarkan kelas di atas ke kelas Startup Anda (salah satu Startup.csatau Global.asax.cs, tergantung apakah Anda menggunakan template Startup OWIN atau tidak).

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

Pendekatan ini - bersama dengan pro dan kontra - dijelaskan lebih lanjut dalam posting ini yang saya tulis di blog saya.

Darkseal
sumber
1
hal baik. tetapi fungsi ini sudah terintegrasi dengan vs2015. jika Anda membuat proyek webapi asp.net, maka secara otomatis akan melakukan semua kode pelat ketel untuk Anda.
suomi-dev
@Darkseal bisa tolong jelaskan sedikit tentang "itu bisa sangat sulit untuk mempertahankan dan menguji"? (Saya telah membaca posting blog Anda) Saya telah menggunakan WebAPI2 dan saya suka cara kerjanya. Namun saya tidak dapat menemukan "manfaat besar nyata" selain memilikinya "cara umum dalam melakukan sesuatu". Memiliki pengontrol MVC klasik yang mengembalikan string serial "manual" cukup mudah. Menambahkan json / xml switch dengan kata kerja http Accept tidak butuh banyak. Semua itu bisa dibungkus menjadi metode utilitas yang bagus. Terima kasih.
ValGe
2
@ValGe, lihat jawaban @ manish-jain di atas. Singkatnya, Controllermengembalikan string berseri-seri Json yang dibungkus dengan ActionResultjelas lebih sulit untuk diuji dan dipertahankan daripada ApiControlleryang dapat diatur untuk secara langsung mengembalikan daftar [Serializable]item. Metode pengujian apa pun akan jauh lebih mudah untuk ditulis, karena Anda tidak perlu melakukan de-serialisasi secara manual setiap kali: hal yang sama dapat dikatakan untuk hampir semua tugas integrasi sistem dengan ASP.NET atau kerangka kerja lainnya. Controllersbagus, tetapi ApiControllerslebih cocok untuk tugas yang tenang, setidaknya di .NET Framework 4.x
Darkseal
1

Setiap metode di Web API akan mengembalikan data (JSON) tanpa serialisasi.

Namun, untuk mengembalikan Data JSON di pengontrol MVC, kami akan menetapkan tipe Hasil Tindakan yang dikembalikan ke JsonResult dan memanggil metode Json pada objek kami untuk memastikannya dikemas dalam JSON.

Shailesh Uke
sumber
1

Perbedaan utamanya adalah: API Web adalah layanan untuk klien apa pun, perangkat apa pun, dan Pengontrol MVC hanya melayani kliennya. Sama karena itu adalah platform MVC.

ANJYR - KODEXPRESSION
sumber
-1

Cukup mudah untuk memutuskan di antara keduanya: jika Anda menulis aplikasi web / internet / intranet berbasis HTML - mungkin dengan panggilan AJAX sesekali mengembalikan json di sana-sini - tetap dengan MVC / Controller. Jika Anda ingin memberikan antarmuka data-driven / REST-ful ke sistem, pergi dengan WebAPI. Anda dapat menggabungkan keduanya, tentu saja, memiliki ApiController yang melayani panggilan AJAX dari halaman MVC. Pada dasarnya controller digunakan untuk mvc dan api-controller digunakan untuk Rest-API Anda dapat menggunakan keduanya dalam program yang sama dengan kebutuhan Anda


sumber