2009-05-12 12 views
17

से MethodInfo पुनर्प्राप्त करना क्या संदेश प्राप्त करने के लिए एक शानदार तरीका है जिसे संदेश निरीक्षक/प्राधिकरण नीति/कुछ अन्य एक्सटेंशन बिंदु से सेवा उदाहरण पर निष्पादित किया जाएगा? मैंडब्ल्यूसीएफ: ऑपरेशन कॉन्टेक्स्ट

OperationContext.Current.IncomingMessageHeaders.Action

इस्तेमाल कर सकते हैं लेकिन मुझे आशा है कि वहाँ कोई रास्ता मैन्युअल OperationContracts साथ सोप कार्रवाई मिलान के बिना यह करने के लिए है।

जो मैं करने की कोशिश कर रहा हूं वह निष्पादित होने से पहले विधि के गुणों की जांच कर रहा है।

उत्तर

24

यह मुझे हमेशा के लिए ले लिया है, लेकिन मैं एक तरीका है कि खोजने और पूरे अनुबंध के माध्यम से slogging से बेहतर मिला:

string action = operationContext.IncomingMessageHeaders.Action; 
DispatchOperation operation = 
    operationContext.EndpointDispatcher.DispatchRuntime.Operations.FirstOrDefault(o => 
     o.Action == action); 
// Insert your own error-handling here if (operation == null) 
Type hostType = operationContext.Host.Description.ServiceType; 
MethodInfo method = hostType.GetMethod(operation.Name); 

और वहाँ आप कर रहे हैं। आप गुण प्राप्त कर सकते हैं या जो कुछ भी आपको पसंद करते हैं।

नोट: आप DispatchRuntime में ऑपरेशन चयनकर्ता का उपयोग करने का प्रयास करने के लिए प्रेरित हो सकते हैं। मुझे मिली समस्या यह थी कि मेरे मामले में, प्रसंस्करण के विशेष चरण में, ऑपरेशन चयनकर्ता एक शून्य संदर्भ था। यदि आपके पास इस संपत्ति तक पहुंच है, तो यह ऊपर के रूप में ऑपरेशन कोलेक्शन "स्कैनिंग" से अधिक तेज़ और अधिक विश्वसनीय है।

+0

मुझे बहुत समय बचाया। धन्यवाद। – user80855

+0

डिस्पैच ऑपरेशन में FirstOrDefault की परिभाषा नहीं है? – fuzz

+1

@ फ़ुलवियो: सुनिश्चित करें कि आपने 'System.Linq' में नामस्थान संदर्भ जोड़ा है। – Aaronaught

1

कैसल डब्ल्यूसीएफ एकीकरण सुविधा आपको डायनेमिक प्रॉक्सी प्रॉक्सी का उपयोग करके बस (कई उपयोगी चीजों के बीच) करने में सक्षम बनाती है। here पर एक नज़र डालें।

इस पर अधिक दस्तावेज नहीं है, इसलिए इसका उपयोग करने के तरीके पर दस्तावेज़ों के लिए अपने परीक्षणों को देखने के लिए सबसे अच्छा है।

+1

मेरे मामले में एक ओवरकिल लगता है, लेकिन वैसे भी धन्यवाद –

13

तो OperationContext.CurrentIncomingMessageHeaders.Action रिक्त है, तो आप ऐसा कर सकते हैं - यह थोड़ा terser है:

string actionName = OperationContext.Current.IncomingMessageProperties["HttpOperationName"] as string; 
Type hostType = operationContext.Host.Description.ServiceType; 
MethodInfo method = hostType.GetMethod(actionName); 
+0

क्या यह ओवरलोडेड विधियों के साथ काम करेगा? – Ahuman

7

@Aaronaught और @TimDog के जवाब के आधार पर, और this SO question मैं एक समाधान के साथ आया था कि काम करना चाहिए आरईएसटी और एसओएपी दोनों के लिए।

///<summary>Returns the Method info for the method (OperationContract) that is called in this WCF request.</summary> 
System.Reflection.MethodInfo GetActionMethodInfo(System.ServiceModel.OperationContext operationContext){ 
    string bindingName = operationContext.EndpointDispatcher.ChannelDispatcher.BindingName; 
    string methodName; 
    if(bindingName.Contains("WebHttpBinding")){ 
      //REST request 
      methodName = (string) operationContext.IncomingMessageProperties["HttpOperationName"]; 
    }else{ 
      //SOAP request 
      string action = operationContext.IncomingMessageHeaders.Action; 
      methodName = operationContext.EndpointDispatcher.DispatchRuntime.Operations.FirstOrDefault(o =>o.Action == action).Name; 
    } 
    // Insert your own error-handling here if (operation == null) 
    Type hostType = operationContext.Host.Description.ServiceType; 
    return hostType.GetMethod(methodName); 
} 
+0

इसे प्यार करो !!!! इस छोटे मणि के लिए धन्यवाद। – ROFLwTIME

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