2013-02-20 56 views
10

मैं एक आवेदन के लिए सेवा परत बनाने के लिए एमवीसी 4 वेब एपीआई का उपयोग कर रहा हूं। मैं एक वैश्विक फ़िल्टर बनाने की कोशिश कर रहा हूं जो एपीआई के सभी आने वाले अनुरोधों पर कार्य करेगा। अब मैं समझता हूं कि इसे मानक एमवीसी ग्लोबल एक्शन फ़िल्टर से अलग कॉन्फ़िगर किया जाना है। लेकिन मुझे काम करने के लिए ऑनलाइन खोज रहे कुछ उदाहरण प्राप्त करने में समस्याएं आ रही हैं।एमवीसी 4 वेब एपीआई रजिस्टर फ़िल्टर

जिस समस्या में मैं चल रहा हूं वह वेब एपीआई के साथ फ़िल्टर पंजीकृत करने में है।

मैं

public class MvcApplication : System.Web.HttpApplication 
{ 
    protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     MVCConfig.RegisterRoutes(RouteTable.Routes); 
     MVCConfig.RegisterGlobalFilters(GlobalFilters.Filters); 

     WebApiConfig.RegisterRoutes(GlobalConfiguration.Configuration); 
     WebApiConfig.RegisterGlobalFilters(GlobalConfiguration.Configuration.Filters); 
    } 
} 

मेरे मानक Mvc मार्ग और फिल्टर सही ढंग से काम मेरी Global.asax इस तरह की स्थापना की है ...। जैसा कि मेरी वेबएपी रूटिंग करता है। यहाँ मैं अपने WebAPI फिल्टर पंजीकरण के लिए है

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

,

public class PerformanceTestFilter : ActionFilterAttribute 
{ 
    private readonly Stopwatch _stopWatch = new Stopwatch(); 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     _stopWatch.Reset(); 
     _stopWatch.Start(); 
    } 

    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     _stopWatch.Stop(); 
     var executionTime = _stopWatch.ElapsedMilliseconds; 
     // Do something with the executionTime 
    } 
} 

इस फिल्टर ठीक काम करता है जब यह मानक Mvc GlobalFilterCollection के साथ पंजीकृत है ... और यहाँ PerformanceTestFilter है ... लेकिन जब मैं इसे System.Web.Http.Filters.HttpFilterCollection के साथ पंजीकृत करने का प्रयास करता हूं तो मुझे यह कहते हुए एक त्रुटि मिलती है कि यह पैरामीटर प्रकार System.Web.Http.Filters.IFilter को असाइन करने योग्य नहीं है।

तो मुझे लगता है कि मेरे प्रदर्शनटेस्टफिल्टर को वेबपै फ़िल्टर के रूप में पंजीकृत होने के लिए ActionFilterAttribute के अलावा किसी अन्य चीज़ से प्राप्त करने की आवश्यकता है। मुझे यकीन नहीं है कि यह क्या होना चाहिए।

मुझे कल्पना है कि मुझे क्रमशः एमवीसी और वेबपी के साथ काम करने के लिए दो अलग-अलग फ़िल्टर बनाने की आवश्यकता होगी। यदि फ़िल्टर बनाने का कोई तरीका है जो दोनों के लिए पंजीकृत हो सकता है, तो यह बहुत अच्छा होगा। लेकिन मेरी प्राथमिक चिंता बस इसे वेबपी के लिए काम करने के लिए है।

धन्यवाद

उत्तर

10

निम्नलिखित कार्य करना चाहिए। हम वास्तव में इसका उपयोग हमारी वेब एपीआई परियोजना के लिए करते हैं।

GlobalConfiguration.Configuration.Filters प्रकार के HttpFilterCollection

var filters = System.Web.Http.GlobalConfiguration.Configuration.Filters; 
filters.Clear(); 
filters.Add(new ValidationActionFilterAttribute()); 

public class ValidationActionFilterAttribute : FilterAttribute, IActionFilter, IFilter 
{ 
    ... 
} 

इसके अलावा, अगर आप एक परियोजना है कि दोनों MVC और वेबएपीआई assembilies शामिल में काम कर रहे हैं, तो आप जांच कर सकता है नाम स्थान अपने ActionFilterAttribute के नाम स्थान क्या। यह काफी भ्रामक कारण है वहाँ दोनों के तहत दो ActionFilterAttributes हैं:

System.Web.Http.Filters 
    System.Web.Http.Mvc 

स्रोत: Why is my ASP.NET Web API ActionFilterAttribute OnActionExecuting not firing?

ऐसा लगता है कि आप दो फिल्टर, एपीआई के लिए एक और MVC के लिए एक की आवश्यकता होगी। आप सामान्य कोड को एक अलग वर्ग में कारक बना सकते हैं, और फिर अपने सामान्य वर्ग के माध्यम से कॉल करने के लिए केवल विशिष्ट फ़िल्टर का उपयोग कर सकते हैं, इस प्रकार डीआरवाई का उल्लंघन नहीं कर सकते हैं और अनिवार्य रूप से वास्तविक फिल्टर का उपयोग रैपर के रूप में कर सकते हैं जिन्हें फ़िल्टर के रूप में पंजीकृत किया जा सकता है।

+3

ठीक है, इस समाधान ने मेरी परियोजना को बनाने की अनुमति दी है और मेरे पास वेब एपीआई के लिए "System.Web.Http.Filters.HttpFilterCollection" और मानक एमवीसी एक्शन फ़िल्टरिंग के लिए "ग्लोबलफिल्टर कोलेक्शन" दोनों में मेरा फ़िल्टर पंजीकृत है। हालांकि, जब मैं एपीआई तरीकों में से एक पर नेविगेट करता हूं, तो फ़िल्टर निष्पादित नहीं किया जा रहा है। फ़िल्टर मानक एमवीसी नियंत्रक कार्यों के लिए काम कर रहा है, लेकिन वेब एपीआई विधियों के लिए नहीं। कोई सुझाव? – jdavis

+0

नया सवाल बनाएं।टिप्पणियों में नए प्रश्न मत पूछो। –

+1

@ सैम, आप स्वयं को जोड़ने से पहले फ़िल्टर संग्रह को क्यों साफ़ करते हैं? – Vegar

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