2012-04-12 14 views
5

मैं एक ServiceContract जो गतिशील प्रकार वापस आती है और ऐसा दिखाई देता है। लेकिन चूंकि मैंने सेवा पर अपने DataContract का उपयोग नहीं किया है, इसलिए क्लाइंट इसके बारे में कुछ नहीं जानता है और इसे एक्सेस नहीं कर सकता है।Datacontract और गतिशील वापसी प्रकार WCF

[DataContract] 
public enum OpenIdStatus 
{ 
     [EnumMember] 
     Authenticated, 
     [EnumMember] 
     Authenticating, 
     [EnumMember] 
     Cancelled, 
     [EnumMember] 
     Failed, 
     [EnumMember] 
     RedirectToLogon 
} 

मैं अगर मैं श्रेणीबद्ध प्रकार मैं KnownType इस्तेमाल किया जा सकता था इस जीत के लिए किया था पता है, लेकिन इस स्थिति के लिए विचार से बाहर हूँ:

मेरे DataContract नीचे की तरह कुछ है। कोई विचार?

उत्तर

16

एक गतिशील DataContract एक विरोधाभास है। डेटाकंट्रैक्ट एक पूर्वनिर्धारित और पारस्परिक रूप से सहमत डेटा संरचना है, और dynamic एक ऐसी वस्तु है जिसकी संरचना पूर्वनिर्धारित नहीं है और इस प्रकार सहमति नहीं दी जा सकती है, क्योंकि यह कुछ भी हो सकता है।

ऐसा प्रतीत नहीं होता है कि आपको वास्तव में एक गतिशील डेटा प्रकार, बल्कि एक अलग डेटा प्रकार वापस करने की आवश्यकता है। अंतर यह है कि एक अलग डेटा प्रकार निश्चित डेटा प्रकारों के सेट में से एक है, जबकि एक गतिशील डेटा प्रकार वह है जिसमें पूर्व निर्धारित संरचना नहीं है। चूंकि आपका रिटर्न वैल्यू कई आकारों में से एक है, इसलिए "आकारहीन" (या "फ्रीफॉर्म") गतिशील प्रकार का उपयोग करने की आवश्यकता नहीं है, जो डब्ल्यूसीएफ द्वारा समर्थित नहीं है।

इसके बजाय, आप [OperationContract] विधि एक [DataContract] साथ एक प्रकार है कि एक आवरण ऑब्जेक्ट प्रकार object की एक एकल डेटा सदस्य वाले रूप में कार्य करेगा वापसी हो सकता था, और संभव प्रकार हो सकता है कि निर्दिष्ट करने के लिए आवरण वस्तु पर [KnownType] का उपयोग रैपर के अंदर वापस आ गया। चूंकि सबकुछ object से प्राप्त होता है, इसलिए पहले से ही एक पदानुक्रम है।

[DataContract] 
[KnownType(typeof(OpenIdStatus))] 
[KnownType(typeof(string))] 
public class ReturnValue 
{ 
    [DataMember] 
    public object Value { get; set; } 
} 
+0

सुरुचिपूर्ण विचार के लिए धन्यवाद :-) – CjCoax

3

मुझे लगता है कि डब्ल्यूसीएफ में आपके गतिशील प्रकार को क्रमबद्ध/deserializing मुद्दों के लिए जा रहा है। मैं अनुशंसा करता हूं कि आप परिभाषित इंटरफेस के आधार पर विधि वापसी के लिए एक अनुबंध स्थापित करें। वैकल्पिक रूप से, आप स्वयं को क्रमबद्ध करने की जिम्मेदारी ले सकते हैं और अपनी सेवा को एक स्ट्रिंग वापस कर सकते हैं। ग्राहक को यह जानना होगा कि स्ट्रिंग को डी-सीरियलाइज़ करने के लिए किस प्रकार का तरीका है। यहाँ इस पर एक समान सवाल ही नहीं है: -

How to return dynamic List from WCF HTTP Service

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