Menggunakan WebAPI atau MVC untuk mengembalikan JSON di ASP.NET

138

Saya sedang membangun aplikasi ASP.NET MVC yang merupakan klien-skrip berat, itu akan menggunakan JSON dan jQuery untuk memanipulasi DOM.

Pemahaman saya adalah Web API Controller dan MVC Controller dapat mengembalikan JSON.

Dengan skenario saya, haruskah saya menggunakan Pengontrol API Web atau Pengontrol MVC ?

Nil Pun
sumber
1
Penting untuk dicatat adalah bahwa pertanyaan ini khusus untuk konteks tertentu: penulis ingin tahu controller apa yang harus digunakan jika HANYA json harus dikembalikan. REST API memungkinkan pemformatan media yang berbeda tergantung pada negosiasi konten (mis: accept xml, accept json). Dalam hal ini kontroler WebAPI adalah pilihan terbaik Anda
Sentinel

Jawaban:

156

Pengontrol API Web dapat dibuat dan dihosting di Aplikasi ASP.NET apa pun, bukan hanya aplikasi MVC. Dengan demikian, alasan yang jelas untuk membuat API Web adalah jika Anda tidak memiliki front-end MVC (mis. Layanan web klasik, RESTful yang diselenggarakan oleh perusahaan / organisasi Anda.)

Pengontrol MVC biasanya bergantung pada Kerangka MVC, jika Anda melihat templat default dan sebagian besar pekerjaan yang dilakukan oleh komunitas dan rekan Anda, Anda akan melihat bahwa hampir semua Pengendali MVC diimplementasikan dengan pandangan dalam pikiran.

Secara pribadi, saya menggunakan Pengontrol MVC ketika saya berniat menanggapi dengan Tampilan (), dan saya akan menggunakan API Web untuk apa pun yang tidak bergantung pada tampilan tertentu.

Ada peringatan, tentu saja, tetapi secara umum jika Anda tidak memerlukan perilaku Model Binding MVC, layanan Anda adalah data-sentris, dan operasi adalah Data-centric (misalnya operasi CRUD) maka Anda mungkin menginginkan 'Web API Controller 'Bukannya' Model-View Controller '. Sebaliknya, jika operasi Anda View-centric (mis. Mengantarkan halaman admin pengguna ke pengguna), atau Anda membutuhkan Pengikatan Model MVC untuk menghasilkan 'ajax partials' (sangat tidak mungkin), maka Anda akan menginginkan MVC Controller sebagai gantinya.

Secara pribadi, saya menggunakan pengontrol API Web untuk menggerakkan klien RESTful berbasis JSON, saya menggunakan pengontrol MVC untuk menangani perutean peramban dasar dan pengiriman SPA.

Shaun Wilson
sumber
32

WebAPI adalah untuk membuat API. Jika Anda ingin seseorang dapat menggunakan API Anda dalam XML, JSON, dll. Anda dapat membuat api web.

Dalam kasus Anda, Anda hanya perlu berbicara dengan klien di JSON.

Meskipun situs web Anda sebagian besar skrip klien didorong Anda masih akan menggunakan ASP.NET MVC Controller kan? Dan karena Anda mungkin sudah secara logis membagi pengontrol Anda berdasarkan entitas maka masuk akal untuk menambahkan metode json serving di dalamnya sebagai lawan membuat kelas lain khusus untuk web api.

Jadi untuk situasi khusus Anda (jika saya mengerti dengan benar), saya akan tetap dengan Controllers.

Muhammad Hasan Khan
sumber
Terima kasih, apakah ada perbedaan dalam cara kami membuat WebAPI vs Controller?
Nil Pun
1
@flybyte ya Anda harus berasal dari ApiController, lihat asp.net/web-api/overview/getting-started-with-aspnet-web-api/…
Muhammad Hasan Khan
4
Web Api dapat melakukan JSON, serta metode lain yang Anda daftarkan. Pengontrol tidak dapat (dengan rapi) diubah menjadi API, Jadi mengingat pengguna memiliki pandangan ke depan untuk bertanya - Saya sarankan menggunakan solusi yang lebih skalabel / fleksibel. Bukannya seperti layanan WCF sekolah tua, api web umumnya kuat dan fleksibel. Jadi, sementara Anda hanya perlu skenario sederhana itu tetap keluar dari jalan Anda. Tapi Anda punya kekuatan jika Anda membutuhkannya
steve
8

Jawabannya bermuara pada pemisahan keprihatinan, kencangkan penciptaan layanan dan bergantung pada konvensi daripada konfigurasi.

Kontroler tanggung jawab utama adalah bekerja sebagai koordinator antara tampilan dan model Anda, tetapi sebagai tanggung jawab utama API adalah bekerja pada data. Dalam kasus konvensi API membuatnya sangat mudah untuk melakukan operasi CRUD. Di bawah ini adalah pemetaan antara operasi CRUD dan tindakan HTTP

  • DAPATKAN: Baca
  • POST: Buat
  • PUT: Perbarui
  • HAPUS: Hapus

Jadi dengan API Anda tidak perlu membuat tindakan terpisah dan mengaitkannya dengan tindakan HTTP.

Keris
sumber
0

Satu-satunya masalah yang saya miliki dengan ApiController adalah bahwa ia berbasis situs bukan berbasis area. Satu situs hanya dapat memiliki satu subfolder apicontroller untuk Anda beri nama metode pengontrol Anda. Ada situasi yang Anda mungkin ingin menduplikasi nama pengontrol di berbagai bidang:

domain.com/api/area1/controller1/

domain.com/api/area2/controller1/

Saya ingat ada beberapa pengaturan kode khusus untuk dapat melakukan ini tetapi tidak berfungsi secara default.

Ramon Chan
sumber
ini seperti komentar, bukan jawaban.
Dylan Hayes
Jangan benar-benar tidak apa yang Anda katakan. Jika Anda menamai pengontrol Area1XController maka Anda dapat melakukannya: domain.com/Area1X/1, membuat pengontrol: Area2XController dan kemudian mengaksesnya dengan: domain.com/Area2X/1. Pertanyaan besarnya adalah mengapa Anda tetap ingin melakukan itu. Nama area abstrak, tidak mengatakan apa-apa kepada pengguna. Jika Anda memiliki katakanlah 4 Area maka lebih baik menggunakan nama tujuan fungsional untuk itu.
Herman Van Der Blom
0

Saya setuju dengan jawaban Shaun Wilson (jawaban atas) tetapi tidak yakin mengapa karena saya hanya sedikit bingung dan masih mencoba memahami dengan firasat (mungkin salah) berikut -

  • Gunakan Kontroler WebAPI untuk mengirimkan data JSON ke klien sehingga klien dapat menangani manipulasi tampilan. Proses ini TIDAK memerlukan tampilan melainkan respons kembali ke apa pun yang disebut metode (yaitu permintaan javascript) sehingga klien dapat menangani manipulasi sisi klien.
  • Gunakan pengontrol MVC ketika Anda perlu menggunakan data untuk memanipulasi tampilan selama atau tepat setelah page_load (yaitu bukan untuk aplikasi SPA).

Anda tahu, saya hanya tidak tahu bagaimana saya salah di sini dan saya bingung karena baris terakhir jawaban Shaun menyatakan "Saya menggunakan pengontrol MVC untuk menangani perutean peramban dasar dan pengiriman SPA." - mungkin saya tidak sepenuhnya tahu apa itu klien yang tenang ketika saya berasumsi itu bisa menjadi metode JavaScript yang menerima respons dalam bentuk JSON. ini adalah pos terdekat di Stackoverflow yang terkait dengan jarak jauh sebagai jawaban atas pertanyaan saya, jadi saya menjawab posting ini alih-alih kemungkinan menggandakan pertanyaan.

RH Thorne
sumber
" Gunakan pengontrol MVC untuk menampilkan Tampilan " Anda dapat membungkus SPA ke dalam parsial MVC untuk komposisi menjadi Tampilan. ASP.NET MVC devs harus memahami konsep ini. Anda dapat menggunakan fasilitas Razor + ASP.NET biasa selama pembuatan tampilan (mis. Pemrosesan sisi server) untuk merender HTML + JS ke klien. masalah yang akan dialami banyak pengembang di sini adalah gagasan bahwa file HTML + JS statis bukan yang membuat SPA menjadi SPA. terkadang konten harus dinamis , dan spesifik untuk pengguna, tetapi semua kerangka kerja cenderung mengurangi fakta ini. "SPA" dan "MVC" tidak saling eksklusif.
Shaun Wilson
0

Dalam skenario ini, saya akan merekomendasikan WebApi karena sangat cocok untuk mentransfer data seperti ini berdasarkan permintaan Javascript. Saya biasanya akan mengembangkan pengontrol WebApi saya sehingga mereka mengembalikan objek ramah JSON yang kemudian dapat diuraikan dengan mudah oleh Javascript saya.

Satu-satunya waktu nyata di mana Anda ingin menggunakan aksi pada pengontrol MVC untuk hal semacam ini adalah jika Anda ingin menghasilkan beberapa HTML dan mengganti segmen halaman Anda dengan panggilan Javascript.

Sebagai contoh:

Anda memiliki JQuery UI Datepicker yang setelah dipilih menghasilkan daftar tombol radio yang mewakili acara pada hari yang dipilih.

Dalam skenario ini, Anda bisa menggunakan WebApi untuk mengembalikan beberapa JSON dan kemudian menghasilkan HTML yang diperlukan menggunakan Javascript tetapi umumnya merupakan praktik yang buruk untuk membuat banyak HTML menggunakan Javascript. Akan jauh lebih baik untuk memiliki C # membangun HTML dan kemudian mengembalikannya melalui tampilan parsial karena cara ini Anda cenderung mengalami kesalahan dengan penguraian Javascript. Belum lagi itu membuat HTML jauh lebih mudah untuk ditulis.

jezzipin
sumber