2011-05-24 12 views
18

मैं एक डब्ल्यूसीएफ सेवा बना रहा हूं, और मुझे कुछ सीरियलाइजेशन मुद्दों के साथ बहुत परेशानी हो रही है। शायद वहाँ यह करने के लिए सिर्फ 1 रास्ता नहीं है, लेकिन मैं इसे पुष्टि करने के लिए यहाँ मेरी नमूना कोड चाहते हैं:डब्ल्यूसीएफ, इंटरफ़ेस रिटर्न प्रकार और ज्ञात प्रकार

संविदा

public interface IAtm 
    { 
     [DataMember] 
     double Latitude { get; set; } 

     [DataMember] 
     double Longitude { get; set; } 
    } 

[ServiceContract] 
    public interface IAtmFinderService 
    { 

     [OperationContract] 
     ICollection<IAtm> GetAtms(); 

    } 

सेवा कार्यान्वयन:

[KnownType(typeof(Atm))] 
[KnownType(typeof(List<Atm>))] 
[ServiceKnownType(typeof(Atm))] 
[ServiceKnownType(typeof(List<Atm>))] 
public class AtmFinderService : IAtmFinderService 
{ 
    public ICollection<IAtm> GetAtms() 
    { 
     return new List<IAtm>() 
      { 
       new Atm() { Latitude = 1, Longitude = 1 }, 
       new Atm() { Latitude = 2, Longitude = 2 } 
      }; 
    } 
} 

मैं के सभी जोड़ा KnownType और ServiceKnownType विशेषताएँ क्योंकि मैंने सोचा था कि वहां कुछ याद आ रही है .. तो अब, मैं कुछ परीक्षण कर रहा हूं। मैंने VS को स्वचालित रूप से प्रॉक्सी बनाने के लिए "सेवा जोड़ें संदर्भ" विधि का उपयोग करके एक कंसोल ऐप बनाने का प्रयास किया।

InnerException संदेश था 'प्रकार ' 'के साथ डेटा अनुबंध नाम ' WCFTest.Atm: इस तरह, मैं

object[] GetAtms(); 

जब यह कॉल करने के लिए कोशिश कर रहा है की तरह एक समारोह मिलता है, मैं इस त्रुटि मिलती है एटीएम: http: //schemas.datacontract.org/2004/07/WCFTest ' की उम्मीद नहीं है। एक DataContractResolver उपयोग पर विचार करें या किसी प्रकार नहीं जाना जाता प्रकारों की सूची को स्थिर जाना जाता जोड़ने -। उदाहरण के लिए, KnownTypeAttribute विशेषता या द्वारा उपयोग कर उन्हें जाना जाता है प्रकार DataContractSerializer के लिए पारित की सूची में जोड़ने से '।

बहुत अच्छा ... तो फिर, मुझे लगता है कि वीएस का स्वत: कोड कोड बकवास है।

[OperationContract] 
     ICollection<Atm> GetAtms(); 

तो अब, मैं एक ठोस प्रकार लौट रहा हूँ: मैं अपने सेवा (और सभी संबंधित वर्गों और कार्यान्वयन) में निम्न परिवर्तन किया था। सेवा संदर्भ को अद्यतन करने के बाद, यह अपने सदस्यों और सामान के साथ एटीएम कक्षा की एक प्रति बनाता है। सेवा कॉल करने के बाद, कॉल सफल होता है। मैंने सोचा कि यह स्वत: उत्पन्न कोड से संबंधित कुछ बुरा व्यवहार था, इसलिए मैंने एक बहुत ही सरल मेजबान/क्लाइंट ऐप बनाने की कोशिश की। मैंने कुछ बंदरगाह पर एक कंसोल होस्ट सुनना शुरू किया, फिर क्लाइंट को क्लाइंटबेस क्लास का उपयोग करने के लिए क्लाइंटबेस क्लास का उपयोग किया। वही व्यवहार ... यदि सेवा को एक इंटरफ़ेस प्रकार लौटाया गया है, तो यह विफल हो जाता है। अगर मैं इसे ठोस प्रकार वापस करने के लिए बदलता हूं, तो यह काम करता है। मुझे लगता है कि मुझे KnownType विशेषताओं के साथ कुछ समस्या है, मुझे कुछ ऐसा याद आना चाहिए जो serializer संसाधित नहीं कर सकता है। लेकिन मुझे नहीं पता कि क्या।

उत्तर

36

ठीक है, मैं, यह समस्या , के रूप में मैं इसे देखना ठीक करने में कामयाब रहे इस

जब से मैं एक अंतरफलक और नहीं एक ठोस वर्ग लौटने रहा हूँ, WCF क्या दूसरे पर उम्मीद करने के पता नहीं है था समाप्त। तो, यह कुछ भी हो सकता है। जब वह एक सूची प्राप्त करता है, वह उलझन में है।
ऐसा करने का सही तरीका था जहां आवश्यकतानुसार ज्ञात प्रकार के गुण जोड़ना था।
किसको उन प्रकारों को जानने की आवश्यकता है? सेवा कार्यान्वयन, उन्हें सही ढंग से क्रमबद्ध करने और deserialize करने के लिए। हालांकि, ग्राहक सेवा के इंटरफेस के साथ बातचीत करता है, न कि कार्यान्वयन के साथ। यही कारण है कि सेवा कार्यान्वयन मेंKnownType विशेषता को जोड़ने से
समस्या नहीं है, यह समस्या यह है कि, इंटरफेस KnownType विशेषताओं को अनुमति नहीं देता है, लेकिन वे ServiceKnownType विशेषताओं को अनुमति देते हैं।समस्या के समाधान सेवा इंटरफ़ेस अनुबंध में होने की उम्मीद प्रकार जोड़ने के लिए था, और देखा, सब कुछ ठीक काम करता है और इंटरफेस का उपयोग कर ठीक कर लिए

[ServiceContract] 
    [ServiceKnownType(typeof(Atm))] 
    [ServiceKnownType(typeof(List<Atm>))] 
    public interface IAtmFinderService 
    { 

     [OperationContract] 
     ICollection<IAtm> GetAtms(); 

    } 
+0

+1 धन्यवाद, मैं एक ही समस्या थी, लेकिन केवल जोड़ने की जरूरत मेरे कस्टम पेजेडलिस्ट इम्प्लेमेनेशन के लिए कार्यान्वयन की सूची। मेरा "टी" एक डोमेन ऑब्जेक्ट था और पहले से ही मेरे लिए सही ढंग से क्रमबद्ध किया गया था। – Jay

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