2011-06-30 7 views
9

मैं डब्ल्यूसीएफ सेवाओं का विकास कर रहा हूं जहां कुछ वर्गों में [MessageContract] विशेषता है, और कुछ नहीं।संदेश या एक प्रकार जिसमें MessageContractAttribute और विभिन्न प्रकार के अन्य पैरामीटर

जब मैं सेवाओं मैं नीचे इस त्रुटि संदेश मिलता है चलाने का प्रयास: क्योंकि यह एक पैरामीटर है

आपरेशन 'ProcessOperation' लोड नहीं किया जा सकता है या वापसी प्रकार System.ServiceModel.Channels.Message के प्रकार या एक प्रकार जिसमें MessageContractAttribute और विभिन्न प्रकार के अन्य पैरामीटर हैं। System.ServiceModel.Channels.Message या MessageContractAttribute के साथ प्रकार का उपयोग करते समय, विधि को किसी अन्य प्रकार के पैरामीटर का उपयोग नहीं करना चाहिए।

क्या इसका मतलब यह है कि सभी सेवाओं में [MessageContract] होना चाहिए, हालांकि वे संबंधित नहीं हैं?

उत्तर

11

नहीं, इसका मतलब है कि आपके पास विधि पर एकाधिक पैरामीटर हैं और उनमें से कुछ संदेश नहीं हैं। इंटरफेस को अपनी सेवा में पोस्ट करने का प्रयास करें।

यह blog post बताते हैं:

... समस्या यह है कि संदेश ठेके अन्य पैरामीटर प्रकार के रूप में एक ही समय में नहीं किया जा सकता है। इस मामले में, ऑपरेशन का वापसी मूल्य एक स्ट्रिंग है। वापसी मान केवल एक और आउटपुट पैरामीटर हैं, इसलिए यह ऑपरेशन एक आदिम पैरामीटर प्रकार के साथ एक संदेश अनुबंध संदेश मिश्रण कर रहा है। यह विफल रहता है क्योंकि संदेश अनुबंध आपको एसओएपी संदेश के लेआउट पर नियंत्रण देते हैं, जिससे सिस्टम को इन अतिरिक्त पैरामीटर में मिलाकर रोक दिया जाता है।

महत्वपूर्ण नोट:

वैसे, आप प्राप्त जब आप संदेश मिश्रण करने की कोशिश त्रुटि संदेश अनुबंध इस तरह दिखता है।

+2

http://blogs.msdn.com/b/drnick/archive/2006/11/27/mixing-message-contract-attributes.aspx –

0

हल हो गया!

मैं स्ट्रिंग वापस नहीं कर सकता, मैंने क्लाइंट को ग्रीटिंग ऑब्जेक्ट वापस कर दिया है।

using System; 
using System.ServiceModel; 
using System.Net.Security; 

namespace com.blogspot.jeanjmichel.model 
{ 
    [MessageContract] 
    public class Greeting 
    { 
     private String userGreeting; 

     private void SetGreeting() 
     { 
      DateTime now = DateTime.Now; 

      if (now.Hour >= 7 && now.Hour <= 11) 
      { 
       this.userGreeting = "Good morning"; 
      } 
      else if (now.Hour >= 12 && now.Hour <= 17) 
      { 
       if (now.Hour == 12 || now.Hour == 13) 
       { 
        this.userGreeting = "Good afternoon, it's lunch time!"; 
       } 
       else 
       { 
        this.userGreeting = "Good afternoon"; 
       } 
      } 
      else if (now.Hour >= 18 && now.Hour <= 20) 
      { 
       this.userGreeting = "Good evening"; 
      } 
      else 
      { 
       this.userGreeting = "Good night"; 
      } 
     } 

     [MessageBodyMember(Order = 1, ProtectionLevel = ProtectionLevel.EncryptAndSign)] 
     public String UserGreeting 
     { 
      get { return this.userGreeting; } 
     } 

     public Greeting() 
     { 
      this.SetGreeting(); 
     } 
    } 
} 

using System; 
using System.ServiceModel; 
using com.blogspot.jeanjmichel.model; 

namespace com.blogspot.jeanjmichel.services.contract 
{ 
    [ServiceContract(Namespace = "http://jeanjmichel.blogspot.com/services/v0.0.1")] 
    public interface IGetGreeting 
    { 
     [OperationContract] 
     Greeting GetGreeting(Credential credential); 
    } 
} 

using System; 
using System.ServiceModel; 
using com.blogspot.jeanjmichel.services.contract; 
using com.blogspot.jeanjmichel.model; 

namespace com.blogspot.jeanjmichel.services 
{ 
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, 
        Namespace = "http://jeanjmichel.blogspot.com/services/v0.0.1")] 
    public class GetGreetingService: IGetGreeting 
    { 
     public Greeting GetGreeting(Credential credential) 
     { 
      if (String.IsNullOrEmpty(credential.Token)) 
      { 
       throw new FaultException("Inform the security phrase, and try again."); 
      } 
      else 
      { 
       if (credential.Token.Equals("[email protected]")) 
       { 
        Greeting g = new Greeting(); 
        return g; 
       } 
       else 
       { 
        throw new FaultException("Wrong password."); 
       } 
      } 
     } 
    } 
} 
2

यह मूलतः इसका मतलब है कि एक विशेष ऑपरेशन के बाद संयोजनों में से किसी में संदेश अनुबंध के प्रकार और आदिम प्रकार के संयोजन का उपयोग किया जाता है:

MixType1: Contract type and primitive types as operation parameters 
MixType2: Contract type as a parameter and primitive type as return type 
MixType3: Primitive type as a parameter and Contract type as return type 

ऊपर सूचीबद्ध त्रुटि उत्पन्न होगा परिदृश्यों के किसी भी।

0

यदि आपके पास मिश्रित प्रकार के आदिम (जैसे स्ट्रिंग) और संदेश प्रकार के साथ अन्य प्रकार के रूप में समस्या है, यानी एक वर्ग वापसी और स्ट्रिंग पैरामीटर के साथ समस्या है, तो मैंने हल किया कि यह संदेशकंट्रैक्ट से डेटाकंट्रैक्ट पर स्विच कर रहा था।

इसका समाधान करने का दूसरा तरीका एक संपत्ति के रूप में अपने आदिम प्रकार को पकड़ने के लिए एक वर्ग बनाना होगा, ताकि आपकी वापसी और पैरामीटर दोनों संदेश नियंत्रण को कार्यान्वित कर सकें।

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