Saya telah membuat filter Web Api (menggunakan System.Web.Http.Filters.ActionFilterAttribute
) tetapi saya tidak dapat membuatnya berfungsi di dalam ASP.Net MVC 4. Saya mencoba menambahkannya ke RegisterGlobalFilters()
metode tetapi tidak berhasil.
Jadi jika seseorang menggunakan Web Api yang dihosting di ASP.Net MVC, bagaimana cara mendaftarkan filter?
asp.net-mvc-4
asp.net-web-api
Shane Courtrille
sumber
sumber
perhatikan bahwa jawaban ini berlaku hingga MVC 5 / Web API 2
Jawaban singkat: Filter MVC dan Web API tidak kompatibel silang, dan jika Anda ingin mendaftarkannya secara global, Anda harus menggunakan kelas konfigurasi yang sesuai untuk masing-masing.
Jawaban panjang: ASP.NET MVC dan Web API sengaja dirancang untuk bekerja dengan cara yang sama, tetapi pada kenyataannya keduanya adalah makhluk yang berbeda.
API Web berada di bawah
System.Web.Http
namespace, sedangkan MVC berada di bawahSystem.Web.Mvc
namespace. Keduanya akan hidup berdampingan dengan senang hati, tetapi yang satu tidak berisi yang lain dan terlepas dari kesamaan dalam model pemrograman, implementasi yang mendasarinya berbeda. Sama seperti pengontrol MVC dan pengontrol API Web mewarisi kelas pengontrol dasar yang berbeda (MVC diberi nama sederhanaController
dan Web API diberi namaApiController
) filter MVC dan filter API Web mewarisi dariFilterAttribute
kelas yang berbeda (keduanya berbagi nama yang sama dalam kasus ini, tetapi merupakan kelas terpisah yang hidup di ruang nama masing-masing).Filter global API Web didaftarkan melalui
HttpConfiguration
objek yang tersedia untuk Anda dalamRegister
metode WebApiConfig.cs jika Anda menggunakan template proyek dengan WebActivator:atau sebaliknya di global.asax.cs:
Filter global MVC didaftarkan melalui
GlobalFilterCollection
objek, yang tersedia untuk Anda melaluiRegisterGlobalFilters
metode FilterConfig.cs untuk proyek yang menggunakan WebActivator:atau dalam file global.asax.cs sebagai cara
GlobalFilters.Filters
pengumpulan untuk mereka yang tidak memiliki WebActivator:Perlu dicatat bahwa dalam kedua kasus Anda tidak perlu mewarisi dari
FilterAttribute
jenis yang sesuai . Filter API Web hanya perlu mengimplementasikan antarmuka System.Web.Http.IFilter, sementara pendaftaran filter MVC memeriksa untuk memastikan bahwa kelas Anda mewarisi salah satu dari segelintir antarmuka filter yang ditentukan dalamSystem.Web.Mvc
namespace.sumber
Pada MVC 4 RC, nama kelas yang benar adalah HttpFilterCollection :
sumber
Daripada menggunakan filter global, saya lebih suka melakukan ini:
Dan setelah itu mewarisi semua pengontrol api dari
CustomizedApiControllerBase
Pendekatan ini lebih ekspresif dibandingkan dengan filter global di file global.ascx.sumber