2013-07-08 19 views
5

सर्विसस्टैक में अनुरोध/प्रतिक्रिया इंटरसेप्टर सेट करने का सबसे आसान तरीका क्या होगा जो किसी विशेष सेवा के लिए निष्पादित होगा?वैश्विक अनुरोध/प्रतिक्रिया इंटरसेप्टर

एक अनुरोध फ़िल्टर (IHasRequestFilter) ठीक काम करता है लेकिन प्रतिक्रिया फ़िल्टर (IHasResponseFilter) ट्रिगर नहीं किया जाता है यदि सेवा गैर 2xx स्थिति कोड लौटाती है। मुझे विधि द्वारा लौटाए गए स्टेटस कोड के साथ-साथ प्रतिक्रिया डीटीओ (यदि कोई हो) पुनर्प्राप्त करने की आवश्यकता है।

एक कस्टम ServiceRunner और अधिभावी OnBeforeExecute और OnAfterExecute तरीकों ठीक से काम करने लगता है, लेकिन मैं यह बहुत दखल सेवा धावक पूरे आवेदन के लिए बदलने की जरूरत के रूप में खोजने के लिए और मैं एक तरह से कार्यक्षमता प्रति अलग करने के लिए स्वच्छ रास्ता नहीं मिल सका वे कार्य जिन्हें उन तरीकों से निष्पादित करने की आवश्यकता है।

क्या सर्विसस्टैक में कुछ विस्तार बिंदु है कि मुझे याद आ रही है जो मुझे प्रत्येक सेवा विधि से पहले और प्रत्येक सेवा विधि के बाद कुछ कोड निष्पादित करने की अनुमति देगी? एक प्लगइन आदर्श होगा लेकिन मैं कुछ कल्पित BeforeExecute और AfterExecute विधियों की सदस्यता कैसे ले सकता हूं जो मुझे कुछ कस्टम कोड चलाने की अनुमति देगी?


अद्यतन:

बस सवाल मुझे पता चला है कि वैश्विक प्रतिक्रिया फिल्टर कोई बात नहीं क्या स्थिति कोड सेवा है जो है मैं वास्तव में क्या जरूरत द्वारा दिया जाता है क्रियान्वित कर रहे हैं पोस्टिंग के बाद। तो एक आखिरी सवाल: क्या सेवा प्रकार को पुनर्प्राप्त करना संभव है जो अनुरोध फ़िल्टर में अनुरोध को संभालेगा? मुझे यह जांचने की ज़रूरत है कि क्या यह सेवा कुछ कस्टम मार्कर विशेषता द्वारा सजाया गया है या नहीं।

उत्तर

3

मैं कैसे एक कस्टम अनुरोध/प्रतिक्रिया फिल्टर में सेवा प्रकार पुनः प्राप्त करने के बारे में मेरे सवाल का समाधान बाहर पाया है:

appHost.RequestFilters.Add((req, res, requestDto) => 
{ 
    var metadata = EndpointHost.Metadata; 
    Type serviceType = metadata.GetServiceTypeByRequest(requestDto.GetType()); 

    ... 
} 
+0

हाँ मैं बस मध्य में था जो आपको मेटाडाटा को इंगित करने वाले क्यू का जवाब दे रहा था :) इसके अलावा आप मेटाडेटा सर्विसस्टैक को [/operations/metadata ](http://razor.servicestack.net/operations/metadata) मार्ग के साथ भी देख सकते हैं । – mythz

2

IHttpRequest में ऑपरेशननाम है। मुझे लगता है कि आप क्या कर रहे हैं।

+0

नहीं, यह वह नहीं है जो मैं बाद में हूं। मुझे सेवा प्रकार ('System.Type') की आवश्यकता है ताकि मैं किसी भी संभावित कस्टम विशेषताओं को पढ़ सकूं जिनके साथ इस सेवा को सजाया गया हो। मुझे पहले से ही एक समाधान मिला है और इसे उत्तर के रूप में पोस्ट कर देगा। –

3

एक कस्टम ServiceRunner और OnBeforeExecute और OnAfterExecute तरीकों अधिभावी काम करने के लिए लगता है ठीक है, लेकिन मैं यह बहुत सेवा धावक की जरूरत के रूप में दखल पूरा आवेदन

त्वरित टिप्पणी, आप ऑप्ट-इन कर सकते हैं और केवल चयन क्या अनुरोधों एक कस्टम सेवा धावक, जैसे का उपयोग करना चाहिए के लिए प्रतिस्थापित किया जा करने के लिए:

public override IServiceRunner<TRequest> CreateServiceRunner<TRequest>(
    ActionContext actionContext) 
{   
    return useCustomRunner(actionContext.RequestType) 
     ? new MyServiceRunner<TRequest>(this, actionContext) 
     : base.CreateServiceRunner<TRequest>(actionContext); 
} 
संबंधित मुद्दे