2015-06-30 3 views
6

पर अपवाद फेंकने का सही तरीका मैं सबसे सामान्य तरीके से डब्ल्यूसीएफ पर अपवाद भेजने की कोशिश कर रहा हूं। यहाँ मैं क्या कर लिया है:डब्ल्यूसीएफ

[ServiceContract] 
interface IContract 
{ 
    [OperationContract] 
    void Foo(); 
} 

class ContractImplementation: IContract 
{ 
    public void Foo() 
    { 
     try 
     { 
      Bar(); 
     } 
     catch (Exception ex) 
     { 
      throw new FaultException<Exception>(ex, ex.Message); 
     } 
    } 
} 

अपवाद है कि वास्तव में Bar से बाहर आ रहा है:

[Serializable] 
class MyException : Exception 
{ 
    // serialization constructors 
} 

त्रुटि मैं सर्वर साइड WCF लॉगिंग में दिखाई दे रही है है:

डेटा अनुबंध नाम 'MyException: http://schemas.datacontract.org/2004/07/MyException' के साथ 'MyException' टाइप करें। DataContractResolver का उपयोग करने पर विचार करें या किसी भी प्रकारों को ज्ञात प्रकारों की सूची में स्थिर रूप से ज्ञात नहीं है - उदाहरण के लिए, KnownTypeAttribute विशेषता का उपयोग करके या उन्हें डेटाकंट्रैक्टसेरियलाइज़र को ज्ञात ज्ञात प्रकारों की सूची में जोड़कर जोड़ें।

क्या मैं अब तक की कोशिश की है:

[ServiceKnownType(typeof(MyException))] 
[ServiceContract] 
interface IContract 
{ 
    [FaultContract(typeof(MyException))] 
    [OperationContract] 
    void Foo(); 
} 

लेकिन कोई भाग्य।

+0

ऐसा इसलिए हो सकता है क्योंकि आप नए FaultException (पूर्व, ex.Message) फेंक देते हैं; और नहीं "नया FaultException (पूर्व, ex.Message) फेंक दें;" ? इसके अलावा, FaultException की TDetail को अपवाद नहीं होना चाहिए – hazzik

+0

@ हज़िक: मैं विस्तार में वास्तविक अपवाद डाल रहा हूं क्योंकि मैं इसे क्लाइंट पक्ष पर पुनर्स्थापित करना चाहता हूं। – Tudor

उत्तर

2

सबसे पहले, MyException में, अपवाद से विरासत को हटा दें और इसे सार्वजनिक बनाएं।

दूसरा, जब आप अपने सेवा अनुबंध की घोषणा, अपवाद के रूप में यह इस प्रकार की घोषणा:

[FaultContractAttribute(
     typeof(MyException), 
     Action = "", 
     Name = "MyException", 
     Namespace = "YourNamespace")] 
    [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults = true)] 
    [OperationContract] 
    void Foo() 

अंत में, आप इस तरह अपने अपवाद फेंक कर सकते हैं:

throw new FaultException<MyException> 
      (
       new MyException(ex.Message), 
       new FaultReason("Description of your Fault") 

      ); 

आशा है कि यह मदद करता है।

+0

धन्यवाद, यह काम किया। अफसोस की बात है, ऐसा लगता है कि मुझे अपवाद के अपने सुपरक्लास से प्राप्त हर प्रकार के लिए स्पष्ट 'फेंक' बयान होना चाहिए। – Tudor

0

सबसे पहले - क्षमा चाहते हैं, मैं इसे एक टिप्पणी के रूप में पोस्ट करूंगा, न कि उत्तर के रूप में। रिश्तेदार नोब के रूप में, मैं असमर्थ हूं!

यह लेख विस्तार के एक सभ्य स्तर अपवाद विवरण वापस रिले करने के लिए कैसे में चर्चा करता है: http://www.codeproject.com/Articles/799258/WCF-Exception-FaultException-FaultContract

AFAIK, आप वास्तव में वापस ग्राहक के लिए अपवाद ही पारित नहीं हो सकता के रूप में एक अपवाद सोप संगत नहीं है। यह भी विचार करें कि पूरे अपवाद को पारित करने से आपके कोड की सुरक्षा समझौता हो सकती है।

+0

यदि आप ओपी के पोस्ट को पढ़ते हैं तो उन्होंने पहले से ही FaultException को लागू करने का प्रयास किया है। आपके द्वारा लिंक किया गया आलेख FaultException को कार्यान्वित करने के बारे में है। एक टिप्पणी के रूप में, यह ओपी की मदद नहीं करता है। यदि आपके पास कोई सुझाव है कि उन्हें अपना कोड कैसे बदलना चाहिए, तो कृपया इसे पोस्ट करें। मुझे कठोर होने के लिए खेद है, और मुझे पता है कि आप सहायक होने की कोशिश कर रहे हैं लेकिन यह एक अच्छा जवाब नहीं है। –

+0

इसके अतिरिक्त आपको सही तरीके से याद नहीं है। एक FaultException फेंकने और कॉलर को वापस बुलबुला देने दे रहा है * बिल्कुल * आप * यह * कैसे करना चाहिए। फिर कॉलर अपने कॉलिंग कोड में स्वाभाविक रूप से अपवाद को पकड़ और संभाल सकता है। –

+0

@ टॉम रेडफ़र्न, मुझे लगता है कि यह थोड़ा कठोर है। स्वीकृत उत्तर उपयोगकर्ताओं के एक प्रकार के साथ एक गलती अपवाद वापस फेंकता है। इस प्रकार को अपवाद से विरासत में नहीं मिला है और इसलिए इस तरह की अपवाद नहीं है।यह पोस्ट किया गया लेख ठीक है। साथ ही, मैंने यह सुझाव नहीं दिया कि उपयोगकर्ता को FaultException के माध्यम से नहीं होना चाहिए, पूरी तरह से पूर्ण निष्पादन विवरण पैक करना एक अच्छा विचार नहीं हो सकता है। – GinjaNinja