Sayangnya Anda salah tentang itu - Saya berasumsi bahwa saya dapat membagikan semua atribut saya dll antara api web dan pengontrol mvc jadi secara langsung, tampaknya itu bukan perubahan besar bagi saya.
Banyak konsep yang digunakan oleh Web API dan MVC, meskipun sekilas mirip, sebenarnya tidak kompatibel. Misalnya, atribut API Web adalah System.Web.Http.Filters.Filter
dan atribut MVC adalah System.Web.Mvc.Filter
- dan tidak dapat dipertukarkan.
Hal yang sama berlaku untuk banyak konsep lainnya - pengikatan model (mekanisme yang benar-benar berbeda), rute (API Web menggunakan HTTPRoutes bukan Routes, meskipun keduanya beroperasi pada RouteTable yang mendasari yang sama), resolver ketergantungan (tidak kompatibel) dan banyak lagi - meskipun serupa pada permukaan, sangat berbeda dalam praktiknya. Selain itu, API Web tidak memiliki konsep area.
Pada akhirnya, jika semua yang Anda coba capai adalah memiliki cara yang "baru, trendi" dalam menyajikan konten JSON - pikirkan dua kali sebelum mengambil jalan itu. Saya pasti tidak akan merekomendasikan refactoring kode yang ada kecuali Anda benar-benar ingin merangkul HTTP dan membangun aplikasi Anda dengan cara yang tenang.
Itu semua sangat tergantung pada apa yang Anda bangun. Jika Anda memulai proyek baru, dan yang Anda butuhkan hanyalah menyediakan beberapa JSON untuk memfasilitasi aplikasi web Anda - asalkan Anda bersedia untuk hidup dengan beberapa kode yang berpotensi duplikat (seperti hal yang saya sebutkan di atas), API Web dapat dengan mudah dihosting di dalam proyek yang sama dengan ASP.NET MVC.
Saya hanya akan memisahkan API Web ke dalam proyek terpisah jika Anda akan membangun API yang tepat untuk layanan online Anda - mungkin untuk digunakan oleh pelanggan eksternal, atau oleh berbagai perangkat - seperti mengisi aplikasi seluler Anda.
IMO, keamanan, dan penerapan harus mendorong keputusan Anda. Misalnya, jika aplikasi MVC Anda menggunakan otentikasi Formulir tetapi Anda tertarik untuk menggunakan otentikasi Dasar (dengan SSL) untuk API Anda, proyek terpisah akan membuat hidup Anda lebih mudah. Jika Anda ingin menghosting situs Anda di www.example.com tetapi menghosting API Anda sebagai api.example.com (vs. www.example.com/api), proyek terpisah akan membuat hidup Anda lebih mudah. Jika Anda memisahkan proyek dan subdomainnya sesuai dengan itu dan Anda bermaksud memanfaatkan API Anda sendiri dari aplikasi MVC, Anda harus mencari cara untuk menangani masalah Kebijakan Asal yang Sama untuk panggilan sisi klien ke API Anda. Solusi umum untuk ini adalah dengan memanfaatkan jsonp atau CORS (sebaiknya jika Anda bisa).
Pembaruan (26/3/2013): Dukungan CORS resmi akan datang: http://aspnetwebstack.codeplex.com/wikipage?title=CORS%20support%20for%20ASP.NET%20Web%20API
sumber
Setelah beberapa tingkat pengalaman (membuat API untuk aplikasi dan untuk MVC). Saya kebanyakan melakukan keduanya.
Saya membuat proyek terpisah untuk panggilan api yang berasal dari klien lain atau perangkat lain (aplikasi Android / IOS). Salah satu alasannya adalah karena otentikasi berbeda, itu berbasis token (agar tetap tanpa kewarganegaraan). Saya tidak ingin mencampur ini dalam aplikasi MVC saya.
Untuk panggilan javascript / jquery api saya ke aplikasi MVC saya, saya suka membuat semuanya sederhana jadi saya menyertakan api web di dalam aplikasi MVC saya. Saya tidak bermaksud untuk memiliki otentikasi berbasis token dengan panggilan api javascript saya, karena hei, itu dalam aplikasi yang sama. Saya hanya bisa menggunakan
[authorize]
atribut pada titik akhir API, ketika pengguna tidak masuk, dia tidak akan mendapatkan data.Selanjutnya, ketika berurusan dengan keranjang belanja dan Anda ingin menyimpan keranjang belanja pengguna dalam satu sesi (saat tidak masuk), Anda harus memiliki ini di API Anda juga jika Anda menambahkan / menghapus produk melalui kode javascript Anda. Ini akan membuat API Anda menjadi stateful, tetapi juga akan mengurangi kompleksitas di MVC-API Anda.
sumber
Steven dari SimpleInjector (IoC framework) menyarankan dua proyek terpisah: Apa perbedaan antara DependencyResolver.SetResolver dan HttpConfiguration.DependencyResolver di WebAPI
sumber
Saya baru-baru ini melakukan hal yang hampir sama: Saya mulai dengan proyek aplikasi web MVC 4 baru dengan memilih template API Web di VS2012.
Ini akan membuat API Web yang dihosting di aplikasi yang sama dengan MVC.
Saya ingin memindahkan ApiControllers ke dalam proyek perpustakaan kelas yang terpisah. Ini cukup mudah tetapi solusinya agak tersembunyi.
Dalam AssemblyInfo.cs dari proyek MVC 4 tambahkan baris kode yang serupa
[assembly: PreApplicationStartMethod(typeof(LibraryRegistrator), "Register")]
Sekarang Anda memerlukan LibraryRegistrator kelas (jangan ragu untuk menamainya apa saja)
public class LibraryRegistrator { public static void Register() { BuildManager.AddReferencedAssembly(Assembly.LoadFrom(HostingEnvironment.MapPath("~/bin/yourown.dll"))); } }
Dalam proyek MVC 4 tambahkan juga referensi ke perpustakaan Api.
Sekarang Anda dapat menambahkan pengontrol Api ke perpustakaan kelas Anda yang terpisah (yourown.dll).
sumber
Bahkan jika proyek Anda begitu kompleks sehingga menjamin dua "ujung depan" maka saya masih hanya akan mempertimbangkan membagi webapi menjadi proyek terpisah sebagai pilihan terakhir. Anda akan mengalami sakit kepala penerapan dan akan sulit bagi seorang pemula untuk memahami struktur solusi Anda. Belum lagi masalah perutean.
Saya akan bertujuan untuk menjaga namespace system.Web diisolasi dalam satu "lapisan presentasi". Meskipun webapi tidak sedang disajikan, itu masih merupakan bagian dari antarmuka aplikasi Anda. Selama Anda menyimpan logika di domain Anda dan bukan pengontrol Anda, Anda tidak akan mengalami terlalu banyak masalah. Juga, jangan lupa untuk memanfaatkan Area.
sumber
Selain mengatur DLL terpisah untuk Web.Api.
Hanya sebuah saran:
Buat Metode kelas yang akan dipanggil setelah app_start
[perakitan: WebActivatorEx.PostApplicationStartMethod (typeof (API.AppWebActivator), "Start")]
[perakitan: WebActivatorEx.ApplicationShutdownMethod (typeof (API.AppWebActivator), "Shutdown")]
Daftarkan rute web.api di dalam Metode Mulai
public static void Start () {GlobalConfiguration.Configure (WebApiConfig.Register); }
Referensi Proyek ke Proyek Web. untuk mengaktifkan Metode Mulai.
Semoga ini membantu.
sumber
Saya mencoba membagi pengontrol API menjadi proyek baru. Yang saya lakukan hanyalah membuat proyek perpustakaan baru, memindahkan pengontrol di dalam folder bernama API. Kemudian menambahkan referensi proyek perpustakaan ke proyek MVC.
Konfigurasi webAPI dibiarkan di proyek MVC itu sendiri. Ini bekerja dengan baik.
sumber