वैश्विक ASP.Net वेब एपि फिल्टर कैसे जोड़ें?


98

मैंने एक वेब एपि फ़िल्टर (उपयोग करके System.Web.Http.Filters.ActionFilterAttribute) बनाया है, लेकिन मैं इसे ASP.Net MVC 4 के अंदर काम करने में असमर्थ पा रहा हूं। मैंने इसे RegisterGlobalFilters()विधि में जोड़ने की कोशिश की, लेकिन यह काम नहीं किया।

इसलिए यदि कोई ASP.Net MVC में होस्ट किए गए वेब एप का उपयोग कर रहा है, तो एक फ़िल्टर कैसे पंजीकृत होता है?

जवाबों:


110

निम्न कोड, मेरे Global.asax में, मेरे लिए काम करता है:

public static void RegisterWebApiFilters(System.Web.Http.Filters.HttpFilterCollection filters)
{
  filters.Add(new MyWebApiFilter());
}

protected void Application_Start()
{
  RegisterWebApiFilters(GlobalConfiguration.Configuration.Filters);
}

6
क्या कोई समझा सकता है कि यहाँ क्या हो रहा है? ग्लोबल फ़िल्टर के दो सेट क्यों हैं? क्या यह 'ग्लोबल' को ऑक्सीमोरोन नहीं बनाता है?
ल्यूक पुप्लेट

6
फ़िल्टर का एक सेट MVC के लिए है और दूसरा वेब API के लिए है। वे दो अलग-अलग चीजें हैं और आम तौर पर आप नहीं चाहेंगे कि एक के लिए फ़िल्टर दूसरे पर लागू हो।
शेन कोर्ट्रेल

2
मेरे WebApi फ़िल्टर को दो बार कहा जाता है। किसी को भी यह समस्या है?
एंड्रयू कलशनिकोव

87

ध्यान दें कि यह उत्तर MVC 5 / Web API 2 पर सही है

संक्षिप्त उत्तर: एमवीसी और वेब एपीआई फिल्टर संगत नहीं हैं, और यदि आप उन्हें विश्व स्तर पर पंजीकृत करना चाहते हैं, तो आपको प्रत्येक के लिए उपयुक्त कॉन्फ़िगरेशन कक्षाओं का उपयोग करना चाहिए।

लंबे उत्तर: ASP.NET MVC और वेब एपीआई जानबूझकर समान तरीके से काम करने के लिए डिज़ाइन किए गए हैं, लेकिन वे वास्तव में अलग-अलग जीव हैं।

वेब API System.Web.Httpनाम स्थान के नीचे रहता है , जबकि MVC System.Web.Mvcनाम स्थान के नीचे रहता है । दोनों खुशी-खुशी साथ-साथ रहेंगे, लेकिन एक में दूसरा नहीं है और प्रोग्रामिंग मॉडल में समानता के बावजूद, अंतर्निहित कार्यान्वयन अलग हैं। जिस तरह MVC कंट्रोलर और वेब API कंट्रोलर अलग-अलग बेस कंट्रोलर क्लासेस (MVC's को बस नाम दिया जाता है Controllerऔर वेब एपीआई का नाम दिया गया है ApiController) के आधार पर MVC फिल्टर और वेब एपीआई फिल्टर अलग-अलग FilterAttributeवर्गों से विरासत में मिलते हैं (दोनों इस मामले में एक ही नाम साझा करते हैं, लेकिन अलग-अलग हैं उनके संबंधित नामस्थानों में)।

यदि आप WebActivator के साथ किसी प्रोजेक्ट टेम्प्लेट का उपयोग कर रहे हैं, तो वेब API वैश्विक फ़िल्टर HttpConfigurationआपके लिए उपलब्ध Registerविधि WebApiConfig.cs में मौजूद ऑब्जेक्ट के माध्यम से पंजीकृत हैं।

public static void Register(HttpConfiguration config)
{
    //stuff before
    config.Filters.Add(new MyWebApiFilter());
    //stuff after
}

या अन्यथा global.asax.cs में:

GlobalConfiguration.Configuration.Filters.Add(new MyWebApiFilter());

Mvc वैश्विक फ़िल्टर किसी GlobalFilterCollectionऑब्जेक्ट के माध्यम से पंजीकृत होते हैं , जो RegisterGlobalFiltersकि WebActivator का उपयोग करने वाली परियोजनाओं के लिए FilterConfig.cs की विधि के माध्यम से आपके लिए उपलब्ध है :

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        //stuff before
        filters.Add(new MyMvcFilter());
        //stuff after
    }
}

या GlobalFilters.FiltersWebActivator के बिना संग्रह के माध्यम से global.asax.cs फ़ाइल में :

GlobalFilters.Filters.Add(new MyMvcFilter());

यह ध्यान देने योग्य है कि दोनों मामलों में आपको उपयुक्त FilterAttributeप्रकार से विरासत में प्राप्त करने की आवश्यकता नहीं है । वेब एपीआई फिल्टर को केवल System.Web.Http.IFilter इंटरफ़ेस को लागू करने की आवश्यकता होती है, जबकि MVC फ़िल्टर पंजीकरण यह सुनिश्चित करने के लिए जांचता है कि आपका वर्ग System.Web.Mvcनेमस्पेस में परिभाषित किए गए मुट्ठी भर फ़िल्टर इंटरफेस में से एक को विरासत में मिला है ।


Webapiconfig.cs में कस्टम वेब एपि फिल्टर जोड़ना मेरे लिए काम करता है। मुझे समझ में नहीं आता कि
Global.asax.cs

साभार @tatipaka वेबपिकंफ़िग में जोड़ने से काम हुआ।
गोकुलनाथ

12

MVC 4 RC के रूप में, सही वर्ग का नाम HttpFilterCollection है :

public static void RegisterWebApiFilters(System.Web.Http.Filters.HttpFilterCollection filters)
{
    filters.Add(new MyWebApiFilter());
}

protected void Application_Start()
{
    RegisterWebApiFilters(GlobalConfiguration.Configuration.Filters);
}

8

वैश्विक फिल्टर का उपयोग करने के बजाय मैं ऐसा करना पसंद करता हूं:

[MyWebApiFilter]
public class CustomizedApiControllerBase : ApiController
{
   ...
}

और उसके बाद CustomizedApiControllerBase इस दृष्टिकोण से सभी एपीआई नियंत्रकों को विरासत में मिला। Global.ascx फ़ाइल में वैश्विक फ़िल्टर की तुलना में अधिक अभिव्यंजक है।


मैंने System.Web.Http.Filters.ActionFilterAttribute से विरासत में मिला एक फ़िल्टर बनाया और इसे सीधे उन विधियों पर उपयोग करने के लिए आगे बढ़ा, जिनकी मुझे आवश्यकता है। यह सिर्फ काम करता है, इसलिए मुझे इसे पंजीकृत करने की आवश्यकता क्यों नहीं है?
joedotnot

@joedotnot यह "ग्लोबल" फिल्टर के बारे में है जो विशिष्ट नहीं हैं। यदि आप निर्दिष्ट कर सकते हैं कि आप किस विधि को फ़िल्टर करना चाहते हैं, तो आपका दृष्टिकोण ठीक है लेकिन जब आप नियंत्रक क्रियाओं की परवाह किए बिना फ़िल्टर करना चाहते हैं, तो आपको वैश्विक फ़िल्टर की आवश्यकता होगी।
महमूद मोरवज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.