2009-07-15 5 views
5

मेरे पास एक साधारण गूंज सेवा है जहां मैंने एक ऑपरेशन विधि और अनुरोध/प्रतिक्रिया के लिए प्रकार की एक जोड़ी परिभाषित की है:डब्ल्यूसीएफ एक अन्य एक्सएमएल तत्व में अनुरोध/प्रतिक्रिया प्रकार क्यों लपेटता है, और इसे कैसे रोकें?

[ServiceContract(Name = "EchoService", 
       Namespace = "http://example.com/services", 
       SessionMode = SessionMode.NotAllowed)] 
public interface IEchoService 
{ 
    [OperationContract(IsOneWay = false, 
         Action = "http://example.com/services/EchoService/Echo", 
         ReplyAction = "http://example.com/services/EchoService/EchoResponse")] 
    EchoResponse Echo(EchoRequest value); 
} 

डेटा प्रकार:

[Serializable] 
[DataContract(Namespace = "http://example.com/services/EchoService", 
       Name = "EchoRequest")] 
public class EchoRequest 
{ 
    public EchoRequest() { } 

    public EchoRequest(String value) 
    { 
     Value = value; 
    } 

    [DataMember] 
    public String Value { get; set; } 
} 

[Serializable] 
[DataContract(Namespace = "http://example.com/services/EchoService", 
       Name = "EchoResponse")] 
public class EchoResponse 
{ 
    public EchoResponse() { } 

    public EchoResponse(String value) 
    { 
     Value = value; 
    } 

    [DataMember] 
    public String Value { get; set; } 
} 

संदेश आमंत्रित करना। क्रिएटमेसेज() चालू इकोआरक्वेट उपज का एक उदाहरण:

 <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Header /> 
    <s:Body> 
     <EchoRequest xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://example.com/services/EchoService"> 
     <Value>hello, world!</Value> 
     </EchoRequest> 
    </s:Body> 
    </s:Envelope> 

... जो वही है जो मैं चाहता हूं। हालांकि, ऐसा प्रतीत होता है कि सेवा संदेश निकाय को किसी अन्य XML तत्व में आगे लपेटने की उम्मीद कर रही है, जैसे:

 <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Header /> 
    <s:Body> 
     <Echo xmlns="http://example.com/services"> 
     <EchoRequest xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://example.com/services/EchoService"> 
      <Value>hello, world!</Value> 
     </EchoRequest> 
     </Echo> 
    </s:Body> 
    </s:Envelope> 

अद्यतन: मार्क के उत्तर के लिए धन्यवाद, मैंने डेटाकंट्रैक्ट के बजाय MessageContract की खोज की है अनुरोध/प्रतिक्रिया प्रकार। यह मेरी इच्छा के करीब लगता है, लेकिन अब यह बहुत दूर जा रहा है, और बाहरी प्रकार तत्व, "इकोआरक्वेट" की अपेक्षा नहीं करता है।

यह किसी भी तरह से संदेश से भ्रमित है। क्रेट मैसेज सही एक्सएमएल का उत्पादन करने के लिए प्रतीत होता है, इसलिए यह स्पष्ट रूप से कुछ डिफ़ॉल्ट क्रमिकरण का उपयोग कर रहा है जिसे मैं स्वीकार करने के लिए सेवा को कॉन्फ़िगर करना चाहता हूं। क्या मैं सिर्फ गलतफहमी कर रहा हूं कि संदेश कैसे बनाएं। क्रेट मैसेज काम करता है?

उत्तर

2

आईआईआरसी, डिफ़ॉल्ट रूप से डब्ल्यूसीएफ 'लपेटा' संदेश शैली का उपयोग करता है। यदि आप नियंत्रित करने में सक्षम होना चाहते हैं कि संदेशों को क्रमबद्ध कैसे किया जाता है, तो आप MessageContractAttribute के साथ सजाने के द्वारा स्पष्ट संदेश परिभाषित कर सकते हैं। स्पष्ट संदेश अनुबंध के साथ, आप IsWrapped संपत्ति false पर सेट कर सकते हैं।

आपके मामले में मुझे लगता है कि EchoRequest और EchoResponse डेटाकंट्रैक्ट्स बिल्कुल नहीं होना चाहिए, बल्कि संदेश नियंत्रण नहीं होना चाहिए। वे मुझे संदेश कंट्रैक्ट्स की तरह बहुत दिखते हैं।

+0

धन्यवाद मार्क, आपका सुझाव मुझे एक रास्ता नीचे ले जाता है जिसने एसओएपी की डब्ल्यूसीएफ को मेरी बारीकी से समझने में मदद की। हालांकि, चीजें अभी भी सही काम नहीं कर रही हैं, और यदि आप अनुवर्ती खेल हैं तो मैंने सवाल संपादित किया है। – codekaizen

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