2010-01-29 7 views
6

मैं एक एएसपी.Net WCF सेवा को कॉल करने के लिए सिल्वरलाइट क्लाइंट का उपयोग करने का प्रयास कर रहा हूं जो Dictionary<string, object> लौटाएगा। यह ठीक काम करता है जब शब्दकोश में मूल्य int, string या Guid जैसे सरल प्रकार थे।डब्ल्यूसीएफ सेवा शब्दकोश की एक सरणी लौटा रही है <string, object>

हालांकि, अब मेरे पास एक परिदृश्य है जहां मुझे Dictionary<string, object> की सरणी होने के लिए मूल्यों में से एक की आवश्यकता है! यह सब ठीक से संकलित करता है और सेवा का हस्ताक्षर नहीं बदला है, लेकिन सेवा कॉल अब विफल हो जाती है।

कोई विचार इसे ठीक करने के लिए कैसे करें? मैं KnownType और ServiceKnownType विशेषताओं के साथ अपनी सेवा कक्षा और विधियों को एनोटेट करने का प्रयास कर रहा हूं लेकिन यह काम नहीं करता है।

[ServiceContract(Namespace = "")] 
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
public class Service1 
{ 
    [OperationContract] 
    [ServiceKnownType(typeof(Dictionary<string, object>))] 
    public Dictionary<string, object> GetObject() 
    { 
     return new Dictionary<string, object>() 
      { 
       { "pty1", 1 }, 
       { "pty2", Guid.NewGuid() }, 
       { "pty3", "blah" }, 
       { "pty4", new Dictionary<string, object>[] 
           { 
            new Dictionary<string, object>() 
             { 
              { "pty1", 4 }, 
              { "pty2", Guid.NewGuid() }, 
              { "pty3", "blah" }, 
             } 
            , 
            new Dictionary<string, object>() 
             { 
              { "pty1", 4 }, 
              { "pty2", Guid.NewGuid() }, 
              { "pty3", "blahblah" }, 
             } 
           } 
      } 
     }; 
    } 
} 

अपने जवाब के लिए धन्यवाद:

यहाँ कोड का एक टुकड़ा है। मैंने डब्ल्यूसीएफ ट्रेसिंग चालू कर दी है और, जैसा कि संदिग्ध है, क्रमबद्धता के दौरान एक समस्या है। समस्या Dictionary<string, object> का क्रमिकरण नहीं है, लेकिन Dictionary<string, object> के Array में से एक है।

यहां डब्ल्यूसीएफ सेवा द्वारा अपवाद अपवाद।

पैरामीटर को क्रमबद्ध करने का प्रयास करते समय एक त्रुटि हुई: GetObjectResult। इनरएक्सप्शन संदेश 'टाइप' सिस्टम था। चयन। जेनरिक.Dictionary`2 [[सिस्टम.स्ट्रिंग, mscorlib, संस्करण = 2.0.0.0, संस्कृति = तटस्थ, PublicKeyToken = b77a5c561934e089], [System.Object, mscorlib, संस्करण = 2.0। 0.0, संस्कृति = तटस्थ, PublicKeyToken = b77a5c561934e089]] [] 'डेटा अनुबंध नाम के साथ' ArrayOfArrayOfKeyValueOfstringany टाइप: http://schemas.microsoft.com/2003/10/Serialization/Arrays 'की उम्मीद नहीं है। ज्ञात प्रकारों की सूची में स्थिर रूप से ज्ञात किसी भी प्रकार को जोड़ें - उदाहरण के लिए, KnownTypeAttribute विशेषता का उपयोग करके या उन्हें डेटाकंट्रैक्टसेरियलज़र को पास किए गए ज्ञात प्रकारों की सूची में जोड़कर। अधिक जानकारी के लिए कृपया इनरएक्सप्शन देखें।

मैंने एक नए डेटा सदस्य के साथ एक नया DataContract कक्षा परिभाषित करने का भी प्रयास किया है, लेकिन यह एक ही त्रुटि का कारण बनता है।

इसके लिए कोड है, इसके बाद डब्ल्यूसीएफ लॉगिंग द्वारा अपवाद के बाद अपवाद।

[DataContract] 
[KnownType(typeof(ObjectHolder))] 
public class ObjectHolder 
{ 
    [DataMember] 
    public object Object { get; private set; } 

    public ObjectHolder(object obj) 
    { 
     this.Object = obj; 
    } 
} 

पैरामीटर क्रमानुसार करने का प्रयास करते समय एक त्रुटि थी: GetObjectResult। इनरएक्सप्शन संदेश 'टाइप' सिस्टम था। चयन। जेनरिक.Dictionary`2 [[सिस्टम.स्ट्रिंग, एमएससीआरएलआईबी, संस्करण = 2.0.0.0, संस्कृति = तटस्थ, पब्लिककेट टोकन = बी 77 ए 5 सी 561934e089], [सिल्वरलाइट एप्लिकेशंस 7.Web.ObjectHolder, SilverlightApplication7.Web, संस्करण = 1.0.0.0, संस्कृति = तटस्थ, PublicKeyToken = null]] [] 'डेटा अनुबंध नाम के साथ' ArrayOfArrayOfKeyValueOfstringObjectHolderWAwxSTlb: http://schemas.microsoft.com/2003/10/Serialization/Arrays 'की उम्मीद नहीं है। ज्ञात प्रकारों की सूची में स्थिर रूप से ज्ञात किसी भी प्रकार को जोड़ें - उदाहरण के लिए, KnownTypeAttribute विशेषता का उपयोग करके या उन्हें डेटाकंट्रैक्टसेरियलज़र को पास किए गए ज्ञात प्रकारों की सूची में जोड़कर। अधिक जानकारी के लिए कृपया इनरएक्सप्शन देखें।

फिर मैं ObjectHolder, ObjectHolder[] और यहां तक ​​कि ObjectHolder[][] के लिए ServiceKnownType साथ खेला है के बाद से अपवाद का उल्लेख एक "ArrayOfArrayOfKeyValueOfstringObjectHolder"।

अभी तक कोई समाधान नहीं है।

+0

आपको क्या त्रुटि मिलती है? –

+0

मेरा अनुमान होगा कि डब्ल्यूसीएफ को सीरियलाइजिंग ऑब्जेक्ट में परेशानी हो सकती है। यदि आप संभव हैं तो आप अपने शब्दकोशों को <स्ट्रिंग, स्ट्रिंग> बनाने का प्रयास कर सकते हैं। – sipwiz

+0

मैं सिपविज़ से सहमत हूं, आपको डिक्शनरी को क्रमबद्ध करने में परेशानी होगी। आपको शब्दकोश में एक ऑब्जेक्ट होना चाहिए जो धारावाहिक है (जिसका अर्थ है कि आपको अपनी शब्दकोश <स्ट्रिंग, ऑब्जेक्ट> डिक्शनरी <स्ट्रिंग, विशिष्ट ऑब्जेक्ट> – srodriguez

उत्तर

0

कक्षा को परिभाषित करने का प्रयास करें जिसमें एक ही संपत्ति है। वह गुण स्ट्रिंग, ऑब्जेक्ट का एक शब्दकोश है।

डेटाकंट्रैक्ट/डेटामेम्बर के साथ कक्षा को चिह्नित करें। फिर उस वर्ग का उपयोग करके अपने इंटरफ़ेस को परिभाषित करें।

8

सबसे पहले आपको एप कॉफ़िग फ़ाइल में configure WCF tracing होना चाहिए जो आपको यह समझने में मदद कर सकता है कि सेवा संचार के हुड के नीचे क्या खुशी है। इस मामले में आप संचार प्रक्रिया के दौरान होने वाली सभी त्रुटियों को आसानी से प्राप्त कर सकते हैं।

अब, अपनी समस्या को हल करने का प्रयास करें। मुझे लगभग विश्वास है कि ज्ञात प्रकारों में समस्या है। सेवा-उन्मुख दुनिया में आपको सेवा अनुबंध में भाग लेने वाले सभी ठोस प्रकारों को मैन्युअल रूप से परिभाषित करना चाहिए, क्योंकि DataContractSerializer क्रमबद्ध वस्तुओं में ऐसी जानकारी प्रदान नहीं करता है।

इस मामले में यह मतलब है, कि आप निम्न करना चाहिए:

[ServiceKnownType(typeof(string))] 
[ServiceKnownType(typeof(Guid))] 
[ServiceKnownType(typeof(int))] // but I think DataContractSerializer can deal himself with primitives 
[ServiceKnownType(typeof(YourClass))] //UserDefined types you should add manually 
public Dictionary<string, object> GetObject() 

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

new Dictionary<string, object>() 
{ 
{ "pty1", 4 }, 
{ "pty2", Guid.NewGuid() }, 
{ "pty3", new SomeClass() }, //OOPS!!! 
} 

इस मामले में, जब आपकी सेवा इस शब्दकोश आप क्रम की विफलता का सामना वापस जाने के लिए क्योंकि DataContractSerializer इस अनुबंध में SomeClass उम्मीद नहीं है की कोशिश करता है। आप कारखाने विधि और KnownTypeAttribute (इस दृष्टिकोण अधिक वर्बोज़, लेकिन कम जोड़ना चाहिए, इस मामले में

[DataContract] 
[KnownType(typeof(Guid))] 
[KnownType(typeof(SomeClass1))] 
[KnownType(typeof(SomeClass2))] 
public class MyType 
{ 
    private MyType(object obj) { 
    Object = obj; 
    } 

    public static MyType FromSomeClass1(SomeClass1 c1) { 
    return new MyType(c1); 
    } 

    public static MyType FromSomeClass2(SomeClass2 c2) { 
    return new MyType(c2); 
    } 

    public static MyType FromGuid(Guid guid) { 
    return new MyType(guid); 
    } 

    [DataMember] 
    public object Object { get; private set; } 
} 

आप कुछ नए प्रकार जोड़ना चाहते हैं: इस समस्या को हल करने के लिए

एक तरह से अलग प्रकार बनाने के लिए है प्रवण त्रुटि)।

हालांकि, यदि आपका ग्राहक और सेवा डब्ल्यूसीएफ पर लिखी गई है, तो आप मुख्य सेवा-उन्मुख सिद्धांतों का त्याग कर सकते हैं और के बजाय NetDataContractSerializer का उपयोग कर सकते हैं। NetDataContractSerializer को DataContractSerializer के पूरक के लिए डिज़ाइन किया गया है। आप NetDataContractSerializer का उपयोग करके एक प्रकार को क्रमबद्ध कर सकते हैं और DataContractSerializer के साथ deserialize कर सकते हैं। लेकिन NetDataContractSerializer में धारावाहिक XML में सीएलआर प्रकार की जानकारी शामिल है, जबकि DataContractSerializer नहीं है। इसलिए, NetDataContractSerializer किसी भी ज्ञात प्रकार के सामान के बिना किसी भी सीएलआर प्रकार के साथ क्रमिकरण और deserialization में उपयोग किया जा सकता है।

+0

यह सबसे अच्छा जवाब है, आप यह इंगित करके इसे सुधार सकते हैं कि यह शब्दकोश नहीं है जो अज्ञात प्रकार है, लेकिन शब्दकोश के भीतर मौजूद ऑब्जेक्ट प्रकार हैं। यही कारण है कि [ServiceKnownType (टाइपऑफ (शब्दकोश <स्ट्रिंग, ऑब्जेक्ट>))] [ServiceKnownType (typeof (type_which_the_object_might_be)] जोड़ते समय, मदद नहीं करता है। –

0

हालांकि, अब मेरे पास एक परिदृश्य है जहां मुझे मूल्यों में से एक को शब्दकोश की सरणी होने की आवश्यकता है!

समस्या WCF कैसे serializer को पता नहीं है कि/वस्तुओं है कि DataMember विशेषता के साथ चिह्नित नहीं किया गया है और/या ServiceKnownType रों को नहीं जोड़ा गया है की एक सरणी deserialize है।

उदाहरण के लिए, अगर कोई सेवा विधि है, कि एक पैरामीटर

public interface IService 
    function DoSomething(Parameter as Object) as integer 
end interface 

के रूप में एक मनमाना वस्तु लेता है और आप पास करना चाहते हैं, कहते हैं कि पूर्णांकों Integer() की एक सरणी, आप स्पष्ट रूप से पूर्णांकों का इस सरणी को जोड़ना होगा ज्ञात प्रकार की सेवा के लिए टाइप करें।

<ServiceKnownType(GetType(Integer()))> 
public interface IService 
    function DoSomething(Parameter as Object) as integer 
end interface 

फिर सेवा विधि

dim Service as IService 
dim Argument as Integer() 
Service.DoSomething(Argument) 

कोई भी विचार कैसे इसे ठीक करने के लिए बुलाया जा सकता है?

<ServiceKnownType(GetType(Dictionary(Of String, Object)()))> विशेषता जोड़ने का प्रयास करें।

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