2008-09-15 11 views
9

मैं अपने अनुप्रयोगों में सबसे अच्छा उपयोग पैटर्न निर्धारित करने के लिए FaultException और FaultException < टी > का उपयोग कर के साथ प्रयोग कर रहा हूँ। हमें एसओएपी 1.1 और एसओएपी 1.2 क्लाइंट सहित डब्ल्यूसीएफ के साथ-साथ गैर-डब्ल्यूसीएफ सेवा उपभोक्ताओं/ग्राहकों का समर्थन करने की आवश्यकता है।नेट WCF दोष गलत SOAP 1.1 faultcode मूल्यों पैदा

एफवाईआई: एसओएपी 1.2 सेमेन्टिक्स में wsHttp बाइंडिंग परिणामों के साथ FaultExceptions का उपयोग करते हुए, बुनियादी एचटीपीबींडिंग परिणामों के साथ FaultExceptions का उपयोग SOAP 1.1 semantics में करते हैं।

throw new FaultException<FaultDetails>(
     new FaultDetails("Throwing FaultException<FaultDetails>."), 
     new FaultReason("Testing fault exceptions."), 
     FaultCode.CreateSenderFaultCode(new FaultCode("MySubFaultCode")) 
    ); 

FaultDetails वर्ग सिर्फ एक साधारण परीक्षण वर्ग के रूप में आप नीचे देख सकते हैं कि एक स्ट्रिंग "संदेश" प्रॉपर्टी वाला है:

मैं एक FaultException <FaultDetails> फेंकने के लिए निम्नलिखित कोड का उपयोग कर रहा

जब प्रतिक्रिया wsHttpBinding उपयोग कर रहा है:

<?xml version="1.0" encoding="utf-16"?> 
<Fault xmlns="http://www.w3.org/2003/05/soap-envelope"> 
<Code> 
    <Value>Sender</Value> 
    <Subcode> 
    <Value>MySubFaultCode</Value> 
    </Subcode> 
</Code> 
<Reason> 
    <Text xml:lang="en-US">Testing fault exceptions.</Text> 
</Reason> 
<Detail> 
    <FaultDetails xmlns="http://schemas.datacontract.org/2004/07/ClassLibrary" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <Message>Throwing FaultException&lt;FaultDetails&gt;.</Message> 
    </FaultDetails> 
</Detail> 

यह सोप 1.2 विनिर्देश के अनुसार सही लग रहा है। मुख्य/रूट "कोड" "प्रेषक" है, जिसमें "MySubFaultCode" का "सबकोड" है। यदि सेवा उपभोक्ता/ग्राहक WCF का उपयोग कर रहा है तो क्लाइंट पक्ष पर FaultException भी उसी संरचना की नकल करता है, faultException.Code.Name "प्रेषक" और faultException.Code.SubCode.Name "MySubFaultCode" होने के साथ।

जब प्रतिक्रिया basicHttpBinding उपयोग कर रहा है:

<?xml version="1.0" encoding="utf-16"?> 
<s:Fault xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <faultcode>s:MySubFaultCode</faultcode> 
    <faultstring xml:lang="en-US">Testing fault exceptions.</faultstring> 
    <detail> 
    <FaultDetails xmlns="http://schemas.datacontract.org/2004/07/ClassLibrary" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
     <Message>Throwing FaultException&lt;FaultDetails&gt;.</Message> 
    </FaultDetails> 
    </detail> 
</s:Fault> 

यह सही नहीं लगता है। एसओएपी 1.1 चश्मे को देखते हुए, मैं "गलती कोड" का मान रखने की उम्मीद कर रहा था, जब मैं FaultCode.CreateSenderFaultCode (नया FaultCode ("MySubFaultCode") का उपयोग करता हूं तो "s: Client.MySubFaultCode" का मान रखने के लिए। इसके अलावा एक डब्ल्यूसीएफ क्लाइंट को गलत संरचना मिलती है। FaultException.Code.Name "प्रेषक" होने के बजाय "MySubFaultCode" है, और faultException.Code.SubCode faultException.Code.SubCode.Name के बजाय शून्य है "MySubFaultCode"। इसके अलावा, faultException.Code.IsSenderFault गलत है।

इसी समस्या है जब FaultCode.CreateReceiverFaultCode (नई FaultCode ("MySubFaultCode")) का उपयोग:

  • काम करता है के रूप में सोप 1.2
  • के लिए उम्मीद उत्पन्न Server.MySubFaultCode: के बजाय "एस" रों MySubFaultCode " "और faultException.Code.IsReceiverFault सोप 1,1

इस आइटम में भी 2006 में http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=669420&SiteID=1 पर किसी और के द्वारा पोस्ट किया गया था के लिए गलत है और कोई भी इसका उत्तर दिया। मुझे यह विश्वास करना बहुत मुश्किल लगता है कि अभी तक कोई भी इसमें भाग नहीं चुका है।

यहाँ किसी और इसी तरह की एक समस्या हो रही है: http://forums.microsoft.com/msdn/ShowPost.aspx?PostID=3883110&SiteID=1&mode=1

माइक्रोसॉफ्ट कनेक्ट बग: https://connect.microsoft.com/wcf/feedback/ViewFeedback.aspx?FeedbackID=367963

कैसे दोष काम करना चाहिए का विवरण: http://blogs.msdn.com/drnick/archive/2006/12/19/creating-faults-part-3.aspx

Am मैं कुछ गलत कर या इस सही मायने में एक बग है डब्ल्यूसीएफ में?

उत्तर

8

यह मेरे वर्तमान समाधान नहीं है:

/// <summary> 
    /// Replacement for the static methods on FaultCode to generate Sender and Receiver fault codes due 
    /// to what seems like bugs in the implementation for basicHttpBinding (SOAP 1.1). wsHttpBinding 
    /// (SOAP 1.2) seems to work just fine. 
    /// 
    /// The subCode parameter for FaultCode.CreateReceiverFaultCode and FaultCode.CreateSenderFaultCode 
    /// seem to take over the main 'faultcode' value in the SOAP 1.1 response, whereas in SOAP 1.2 the 
    /// subCode is correctly put under the 'Code->SubCode->Value' value in the XML response. 
    /// 
    /// This workaround is to create the FaultCode with Sender/Receiver (SOAP 1.2 terms, but gets 
    /// translated by WCF depending on the binding) and an agnostic namespace found by using reflector 
    /// on the FaultCode class. When that NS is passed in WCF seems to be able to generate the proper 
    /// response with SOAP 1.1 (Client/Server) and SOAP 1.2 (Sender/Receiver) fault codes automatically. 
    /// 
    /// This means that it is not possible to create a FaultCode that works in both bindings with 
    /// subcodes. 
    /// </summary> 
    /// <remarks> 
    /// See http://stackoverflow.com/questions/65008/net-wcf-faults-generating-incorrect-soap-11-faultcode-values 
    /// for more details. 
    /// </remarks> 
    public static class FaultCodeFactory 
    { 
     private const string _ns = "http://schemas.microsoft.com/ws/2005/05/envelope/none"; 

     /// <summary> 
     /// Creates a sender fault code. 
     /// </summary> 
     /// <returns>A FaultCode object.</returns> 
     /// <remarks>Does not support subcodes due to a WCF bug.</remarks> 
     public static FaultCode CreateSenderFaultCode() 
     { 
      return new FaultCode("Sender", _ns); 
     } 

     /// <summary> 
     /// Creates a receiver fault code. 
     /// </summary> 
     /// <returns>A FaultCode object.</returns> 
     /// <remarks>Does not support subcodes due to a WCF bug.</remarks> 
     public static FaultCode CreateReceiverFaultCode() 
     { 
      return new FaultCode("Receiver", _ns); 
     } 
    } 

दुख की बात है मैं या तो सोप 1.1 या 1.2 ग्राहकों को तोड़ने के बिना subcodes उपयोग करने के लिए एक तरह से दिखाई नहीं देता।

आप Code.SubCode सिंटैक्स का उपयोग करें, तो आप SOAP 1.1 संगत faultcode मान बना सकते हैं, लेकिन यह सोप 1.2 टूट जाता है।

आप नेट में उचित subcode समर्थन का उपयोग करते हैं (स्टैटिक FaultCode तरीकों या भार के में से एक के माध्यम से) यह SOAP 1.1 टूट जाता है लेकिन सोप 1.2 में काम करता है। Microsoft से

7

प्रतिक्रिया:

(1) के रूप में आप का वर्णन "डॉट" संकेतन का उपयोग

:

रूप http://msdn.microsoft.com/en-us/library/ms789039.aspx में चर्चा की, वहाँ दो तरीकों कस्टम गलती कोड के लिए साबुन 1.1 विनिर्देश में उल्लिखित हैं

(2) को परिभाषित करना पूरी तरह से नया गलती कोड

दुर्भाग्य से, "डॉट" अंकन से बचा जाना चाहिए, के रूप में यह प्रयोग WS-I बेसिक प्रोफाइल विनिर्देश में हतोत्साहित किया जाता है है। अनिवार्य रूप से, इसका मतलब यह है साबुन 1.2 गलती subcode का कोई वास्तविक बराबर है कि वहाँ जब साबुन 1.1 का उपयोग कर।

तो, जब दोष पैदा करने के लिए, आप MessageVersion बंधन में परिभाषित के जानकार होना जरूरी है, और तदनुसार faultcodes जेनरेट करना होगा।

चूंकि "प्रेषक" और "रिसीवर" साबुन 1.1 के लिए ग़लत गलती कोड नहीं हैं, और गलती सबकोड के वास्तविक समकक्ष नहीं हैं, तो आपको Soap 1.1 के लिए कस्टम गलती कोड उत्पन्न करते समय CreateSenderFaultCode और CreateReceiverFaultCode विधियों का उपयोग नहीं करना चाहिए ।

इसके बजाय, आप, अपने खुद के faultcode परिभाषित करने के लिए अपने स्वयं के नाम स्थान और नाम का उपयोग की आवश्यकता होगी:

FaultCode customFaultCode = नए FaultCode (localName, faultNamespace);

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