2012-03-01 22 views
83

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

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

उत्तर

94

निम्नलिखित कोड, मेरे 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

कोई बता सकता है कि यहां क्या हो रहा है? ग्लोबल फिल्टर के दो सेट क्यों हैं? क्या यह 'ग्लोबल' ऑक्सीमोरॉन नहीं बनाता है? –

+5

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

+2

मेरा वेबएपी फ़िल्टर दो बार बुलाया जाता है। क्या कोई यह समस्या है? –

11

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

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

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

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

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

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

62

ध्यान दें कि यह जवाब MVC अप करने के लिए सच है 5/वेब एपीआई 2

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

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

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

वेब एपीआई वैश्विक फिल्टर Register विधि WebApiConfig.cs में आप के लिए उपलब्ध HttpConfiguration वस्तु के माध्यम से पंजीकृत हैं आप WebActivator के साथ एक परियोजना टेम्पलेट का उपयोग कर रहे हैं:

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

या अन्यथा Global.asax में। सीएस:

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

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

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

या वैश्विक.एक्सएक्स में।WebActivator बिना उन लोगों के लिए GlobalFilters.Filters संग्रह के माध्यम से सीएस फ़ाइल:

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

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

+0

webapiconfig.cs में कस्टम वेब एपीआई फ़िल्टर जोड़ना मेरे लिए काम करता है। मैं समझ नहीं पा रहा हूं कि ग्लोबल.एएसएक्स सीएस – Tatipaka

+0

धन्यवाद @tatipaka में जोड़े जाने पर क्यों काम नहीं किया। webapiconfig में जोड़कर काम किया। – Gokulnath

संबंधित मुद्दे