2009-09-02 18 views
20

मैं डब्ल्यूसीएफ वेब सेवा से अपवाद के रूप में कुछ त्रुटि संदेश जैसे कस्टम अपवाद फेंकना चाहता हूं और वेब सेवा विधि को कॉल करने पर क्लाइंट ऐप में इस अपवाद त्रुटि संदेश को प्राप्त करने का प्रयास करना चाहता हूं।डब्ल्यूसीएफ वेब सेवा कस्टम अपवाद क्लाइंट के लिए त्रुटि

डब्ल्यूसीएफ वेब सेवा से कस्टम अपवाद कैसे फेंकें और क्लाइंट साइड पर एक ही अपवाद त्रुटि प्राप्त करें।

WCF वेब सेवा विधि:

public bool Read() 
    { 
     if (IsUserValid() == false) 
     { 
      throw new Exception("Authorized user"); 
     } 
    } 

क्लाइंट साइड

try 
{ 
    _client.Read(); 
} 
catch (Exception e) 
{ 
    MessageBox.Show(e.Message); 
    return; 
} 

परिणाम पर: हमेशा एक अपवाद के रूप त्रुटि संदेश फेंक ** अर्थात।

"System.ServiceModel.FaultException: सर्वर में आंतरिक त्रुटि के कारण अनुरोध पर कार्रवाई करने में असमर्थ था त्रुटि के बारे में अधिक जानकारी के , के लिए या तो IncludeExceptionDetailInFaults (या तो ServiceBehaviorAttribute से या से चालू करें। विन्यास व्यवहार) करने के लिए सर्वर पर ग्राहक वापस करने के लिए अपवाद जानकारी भेजने, या प्रति माइक्रोसॉफ्ट .NET फ्रेमवर्क 3.0 एसडीके प्रलेखन के रूप में पता लगाने पर बारी और निरीक्षण रों erver ट्रेस लॉग। "

इस कोड को अपवाद फेंक दिया जाता है लेकिन एक ही त्रुटि संदेश लौटने के रूप में एक अपवाद त्रुटि के रूप में WCF वेब सेवा से फेंका

+0

आप समान प्रश्न में उत्तर मिल सकता है: http://stackoverflow.com/questions/5165004/wcf-data-service-error-handling/8225049#8225049 –

उत्तर

2

सुझाव है कृपया इस प्राप्त करने के लिए आपको दो काम करने की जरूरत है काम करने के लिए:

  • इंटरफ़ेस में गलती अनुबंध को परिभाषित करें (WCF अनुबंध)
  • एक दोष अपवाद के रूप में अपवाद फेंक
+0

-1 इस लिंक मृत –

69

डब्ल्यूसीएफ में, आपको मानक .NET अपवाद नहीं फेंकना चाहिए - यह डब्ल्यूसीएफ की संभावित अंतःक्रियात्मक प्रकृति के विपरीत है - आखिरकार, आपका ग्राहक जावा या PHP क्लाइंट हो सकता है जिसमें .NET अपवादों की कोई अवधारणा नहीं है।

इसके बजाय, आपको FaultExceptions (जो डब्ल्यूसीएफ के लिए मानक व्यवहार है) फेंकने की आवश्यकता है।

आप क्या गलत हो गया था बारे में अधिक जानकारी वापस संप्रेषित करने के लिए चाहते हैं, सामान्य FaultException<T> प्रकार को देखो:

सर्वर:

public bool Read() 
{ 
    if (IsUserValid() == false) 
    { 
     throw new FaultException<InvalidUserFault>("User invalid"); 
    } 
} 

या वैकल्पिक रूप से (के रूप में @MortenNorgaard ने सुझाव दिया):

public bool Read() 
{ 
    if (!IsUserValid()) 
    { 
     InvalidUserFault fault = new InvalidUserFault(); 
     FaultReason faultReason = new FaultReason("Invalid user"); 

     throw new FaultException<InvalidUserFault>(fault, faultReason); 
    } 
} 

ग्राहक:

try 
{ 
    _client.Read(); 
} 
catch (FaultException<InvalidUserFault> e) 
{ 
    MessageBox.Show(e.Message); 
    return; 
} 

आप अपने InvalidUserFault के रूप में WCF डेटा अनुबंध की घोषणा और क्या सदस्यों को बताया कि प्रकार के साथ वापस यात्रा कर सकते हैं परिभाषित करना चाहिए (अर्थात त्रुटि कोड, त्रुटि संदेश आदि)।

[DataContract] 
[Serializable()] 
public class BusinessFault 
{ 
    ... add your fault members here 
} 

और तुम तो संभव दोष के साथ आपकी सेवा तरीकों को सजाने चाहिए फेंक कर सकते हैं:

[FaultContract(typeof(InvalidUserFault)] 
[OperationContract] 
public bool Read() 
..... 
बेशक

, "quick'n'dirty" हैक बस परिभाषित करने के लिए है कि सर्वर रिटर्न इसके FaultExceptions में अपवाद विवरण:

<serviceBehaviors> 
    <behavior name="EmployeeManager_Behavior"> 
     <serviceDebug includeExceptionDetailInFaults="true"/> 
    </behavior> 
</serviceBehaviors> 

और फिर आप निरीक्षण कर सकते हैं FaultException के .Detail वास्तविक अपवाद है कि सर्वर पर हुआ उसके लिए - लेकिन फिर से : यह एक वास्तविक समाधान के बजाय केवल एक विकास समय हैक है।

मार्क

+0

महान है जवाब। +1 – dcw

+1

यह 'नया FaultException फेंक दें <अवैध यूज़रफॉल्ट> ("उपयोगकर्ता अमान्य"); 'मान्य नहीं है, आपको ctor में वास्तविक' अवैध यूजरफॉल्ट' में पास करने की आवश्यकता है। – jajdoo

+0

मैं निम्नलिखित का सुझाव दूंगा, क्योंकि दोष-कारण एसओएपी विनिर्देशन द्वारा आवश्यक लगता है (रेफरी http://stackoverflow.com/questions/9614992/throwing-a-faultexceptiont-from-a-wcf-services-causes-the -creator के- इस-fau) सार्वजनिक bool पढ़ें() { अगर (IsUserValid() == गलत) { InvalidUserFault गलती = नए InvalidUserFault(); FaultReason faultReason = नया FaultReason ("अवैध उपयोगकर्ता"); नया FaultException फेंक <अवैधUserFault> (गलती, गलती रिज़न); } } –

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