2013-05-02 15 views
10

के लिए वेबएपीआई में कस्टम IHttpActionInvoker का उपयोग करके मैं अपने वेबपैआई एप्लिकेशन में एक कस्टम IHttpActionInvoker जोड़ने की कोशिश कर रहा हूं ताकि मेरे क्रिया विधियों में दोहराए गए अपवाद हैंडलिंग कोड की आवश्यकता को रोका जा सके।अपवाद हैंडलिंग

this article के अलावा यह कैसे करना है इसके बारे में वास्तव में बहुत कुछ प्रतीत नहीं होता है। मेरी Global.asax फ़ाइल के भीतर एक विधि में

GlobalConfiguration.Configuration.Services.Remove(typeof(IHttpActionInvoker), 
GlobalConfiguration.Configuration.Services.GetActionInvoker()); 

GlobalConfiguration.Configuration.Services.Add(typeof(IHttpActionInvoker), 
new MyApiControllerActionInvoker()); 

: मेरे IHttpActionInvoker लेख के अनुसार लिखने के बाद मैं इस कोड को जोड़ा। अब जब मेरे एपीआई के लिए एक कॉल को क्रियान्वित मैं निम्नलिखित अपवाद विधि निकालें() पर उठाया मिलती है:

The service type IHttpActionInvoker is not supported 

मुझे लगता है कि मैं दो प्रश्न हैं।

  1. विचार है कि वहाँ इस वेबएपीआई अनुप्रयोगों में अपवाद हैंडलिंग हल करने के लिए एक अच्छा दृष्टिकोण माना जाता है एक भयंकर बहुत सारे कस्टम IHttpActionInvoker वर्गों लिखने के बारे में के रूप में देखा नहीं करता है?

  2. क्या किसी को पता है कि Remove() विधि निष्पादित करते समय मुझे इस तरह के अपवाद क्यों मिलेगा और इस विशेष मुद्दे को कैसे ठीक किया जाए?

उत्तर

7

मुझे सेवा को हटाने का प्रयास करते समय आपको वही त्रुटि का सामना करना पड़ा।

मुझे पता चला कि मुझे वैश्विक कॉन्फ़िगरेशन से कुछ भी हटाने की आवश्यकता नहीं है, जैसा कि ऐसा प्रतीत होता है कि आपने अपने कंटेनर में इंटरफ़ेस पंजीकृत किया है, तो यह पहले इसे हल करेगा।

उदाहरण के लिए, मैं SimpleInjector उपयोग कर रहा हूँ और मेरे Global.asax में मैं इस है:

container.Register<IHttpActionInvoker , MyApiControllerActionInvoker >(); 
// Register the dependency resolver. 
GlobalConfiguration.Configuration.DependencyResolver = 
    new SimpleInjectorWebApiDependencyResolver(container); 

क्रम में, यह MyApiControllerActionInvoker निर्भरता को हल करने है जब भी आवश्यकता हो।

फिर आप अपने ग्राहक एक्शन इनवॉकर में अपवाद हैंडलिंग कर सकते हैं और आपके कन्स्ट्रक्टर में सेट किसी भी निर्भरता को सही तरीके से तारित किया जाएगा। एक्शनइवॉकर को देखने का कारण कन्स्ट्रक्टर इंजेक्शन प्राप्त करना था, क्योंकि गुणों में इंजेक्शन करने से संपत्ति इंजेक्शन की आवश्यकता होती है।

निकालने/डालने के बजाय, प्रतिस्थापन काम करने लगता है। (Global.asax में)

GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpActionInvoker), new MyApiControllerActionInvoker(fooService)); 
+0

मैं फ़िल्टर के लिए जा रहा था लेकिन यह जानना बहुत अच्छा है! – Jammer

1

क्या आपने इसके बजाय अपवाद फ़िल्टर पंजीकृत करने पर विचार किया है? यहाँ इस बारे में कुछ प्रलेखन है:

http://www.asp.net/web-api/overview/web-api-routing-and-actions/exception-handling

आप कार्रवाई invoker परत करने के लिए नीचे गिर अगर एक खास तरह से कुछ अपवाद को संभालने है सब आप क्या करना चाहते नहीं होना चाहिए।

+1

डेवलपर्स को कैप्चर करना चाहते हैं अपवादों में से कई अपवाद वेब एपीआई द्वारा 'HttpResponseException' में परिवर्तित हो गए हैं।अपवाद फ़िल्टर लागू होने से पहले यह अपवाद निगल लिया गया है, इसलिए वैश्विक अपवाद फ़िल्टर सब कुछ कैप्चर नहीं करेगा। –

0

मेरे लिए यह IActionInvoker बजाय IHttpActionInvoker साथ काम करता है। जैसा कि मैं समझता हूं, IHttpActionInvoker का उपयोग एसिंक एपीआई कॉल के लिए किया जाता है, है ना?

public class RepControllerActionInvoker : ControllerActionInvoker 
{ 
    ILogger _log; 

    public RepControllerActionInvoker() 
     : base() 
    { 
     _log = DependencyResolver.Current.GetService<ILogger>(); 
    } 

    public override bool InvokeAction(ControllerContext controllerContext, string actionName) 
    { 
     try 
     { 
      return base.InvokeAction(controllerContext, actionName); 
     } 
     catch (Exception e) 
     { 
      _log.Error(e); 
      throw new HttpException(500, "Internal error"); 
     } 
    } 
} 
संबंधित मुद्दे