2009-02-18 10 views
6

मैं जानना चाहता हूं कि डब्ल्यूसीएफ में ज्ञात प्रकारों को कॉन्फ़िगर कैसे करें। उदाहरण के लिए, मेरे पास व्यक्ति वर्ग और कर्मचारी कक्षा है। कर्मचारी कक्षा व्यक्ति कक्षा का एक उपन्यास है। दोनों वर्ग [DataContract] विशेषता के साथ चिह्नित हैं।डब्ल्यूसीएफ: ज्ञात प्रकारों को कॉन्फ़िगर करना

मैं व्यक्ति वर्ग के ज्ञात प्रकार को हार्डकोड नहीं करना चाहता, जैसे कि व्यक्ति वर्ग में [ServiceKnownType(typeof(Employee))] डालने की तरह, ताकि डब्ल्यूसीएफ को पता चले कि कर्मचारी व्यक्ति का उप-वर्ग है।

अब, मैं मेजबान के App.config निम्न XML विन्यास को जोड़ा गया:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.runtime.serialization> 
    <dataContractSerializer> 
     <declaredTypes> 
     <add type="Person, WCFWithNoLibrary, Version=1.0.0.0,Culture=neutral,PublicKeyToken=null"> 
      <knownType type="Employee, WCFWithNoLibrary, Version=1.0.0.0,Culture=neutral, PublicKeyToken=null" /> 
     </add> 
     </declaredTypes> 
    </dataContractSerializer> 
    </system.runtime.serialization> 
    <system.serviceModel> 
    ....... 
    </system.serviceModel> 
</configuration> 

मैं संकलित यह, मेजबान चलाने के लिए, ग्राहक पर एक सेवा संदर्भ जोड़ा गया है और कुछ कोड जोड़ा गया है और ग्राहक को चलाते हैं। लेकिन कोई त्रुटि हुई: जबकि संदेश deserialize की कोशिश कर रहा

फ़ॉर्मेटर एक अपवाद दिए: deserialize पैरामीटर http://www.herbertsabanal.net:person का प्रयास करते समय एक त्रुटि हुई थी। InnerException संदेश 'लाइन 1 की स्थिति में यह त्रुटि थी 247. तत्व 'http://www.herbertsabanal.net:person' 'http://www.herbertsabanal.net/Data:Employee' डेटा अनुबंध के डेटा है। Deserializer के पास कोई भी प्रकार का ज्ञान नहीं है जो इस अनुबंध को पर मानचित्र करता है। प्रकार में जाना जाता है प्रकार के सूची में 'कर्मचारी' के लिए इसी जोड़ें - उदाहरण के लिए, KnownTypeAttribute विशेषता का उपयोग करके या जाना जाता प्रकार DataContractSerializer के लिए पारित की सूची में जोड़कर '।। अधिक जानकारी के लिए कृपया इनर एक्सेप्शन देखें।

[DataContract(Namespace="http://www.herbertsabanal.net/Data", Name="Person")] 
    class Person 
    { 
     string _name; 
     int _age; 

     [DataMember(Name="Name", Order=0)] 
     public string Name 
     { 
      get { return _name; } 
      set { _name = value; } 
     } 

     [DataMember(Name="Age", Order=1)] 
     public int Age 
     { 
      get { return _age; } 
      set { _age = value; } 
     } 
    } 


[DataContract(Namespace="http://www.herbertsabanal.net/Data", Name="Employee")] 
    class Employee : Person 
    { 
     string _id; 

     [DataMember] 
     public string ID 
     { 
      get { return _id; } 
      set { _id = value; } 
     } 
    } 

Btw, मैं अपने सेवा के लिए वर्ग पुस्तकालयों (WCF वर्ग पुस्तकालयों या गैर WCF वर्ग पुस्तकालयों) का उपयोग नहीं किया:

नीचे डेटा अनुबंध कर रहे हैं। मैं बस मेजबान परियोजना में इसे कोडित किया।

मुझे लगता है कि कॉन्फ़िगरेशन फ़ाइल में कोई समस्या होनी चाहिए (कृपया ऊपर कॉन्फ़िगर फ़ाइल देखें)। या मुझे कुछ याद आना चाहिए। किसी भी मदद की बहुत सराहना की जाएगी।

+0

मुझे संदेह है कि कॉन्फ़िगरेशन केवल तभी काम करता है जब किसी तृतीय-पक्ष लाइब्रेरी का उपयोग करते हुए, इसे सेवा में संदर्भित किया जाता है। मैं इसे आज़माउंगा और अगर मुझे कुछ जवाब मिल जाए तो मैं इस प्रश्न पर वापस आऊंगा। – jerbersoft

उत्तर

8

मुझे लगता है कि मुझे अब जवाब मिल गया है।

विन्यास फाइल मैं ऊपर पोस्ट इस तरह दिखता है:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.runtime.serialization> 
    <dataContractSerializer> 
     <declaredTypes> 
     <add type="Person, WCFWithNoLibrary, Version=1.0.0.0,Culture=neutral,PublicKeyToken=null"> 
      <knownType type="Employee, WCFWithNoLibrary, Version=1.0.0.0,Culture=neutral, PublicKeyToken=null" /> 
     </add> 
     </declaredTypes> 
    </dataContractSerializer> 
    </system.runtime.serialization> 
    <system.serviceModel> 
    ....... 
    </system.serviceModel> 
</configuration> 

क्या मैं सिर्फ जोड़ा था, व्यक्ति वर्ग के नाम स्थान और कर्मचारी वर्ग। और लंबे संस्करण और संस्कृति मूल्यों की कोई ज़रूरत नहीं है .... सही कॉन्फ़िगरेशन होना चाहिए:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.runtime.serialization> 
    <dataContractSerializer> 
     <declaredTypes> 
     <add type="WCFWithNoLibrary.Person, WCFWithNoLibrary"> 
      <knownType type="WCFWithNoLibrary.Employee, WCFWithNoLibrary" /> 
     </add> 
     </declaredTypes> 
    </dataContractSerializer> 
    </system.runtime.serialization> 
    <system.serviceModel> 
    ....... 
    </system.serviceModel> 
</configuration> 

अब यह छोटा है और अधिक समझ में आता है। लेकिन अगर तीसरे पक्ष के पुस्तकालयों का उपयोग किया जाता है, तो संस्करण, संस्कृति, प्रकाशनिकी की आवश्यकता होगी।

+2

उपरोक्त। क्या आपको क्लाइंट साइड .config पर कुछ भी करना है? – granadaCoder

+1

आपको क्लाइंट पर कॉन्फ़िगरेशन को डुप्लिकेट करने की आवश्यकता होगी ताकि यह नया प्रकार प्राप्त कर सके। –

5

मैं इस एक लंबे समय पहले उत्तर दिया गया है, लेकिन, एक और (शायद अधिक भविष्य प्रोग्रामर के लिए स्पष्ट) समाधान:

[KnownType(typeof(SubClass))] 
public class BaseClass 

स्कॉट

+4

उपप्रकार एक अलग प्रोजेक्ट में है तो यह हमेशा संभव नहीं होता है –

0

मैं एक अन्य मामले में भी इस लंबा त्रुटि संदेश मिला। मैंने KnownTypeAttribute का उपयोग किया था और उत्पादन में सफलतापूर्वक तैनात किया था जो उत्पादन के लिए WCF.RIA का उपयोग करता है। दूसरी रिलीज में मैंने एक नया उप प्रकार जोड़ा, और आवश्यक KnownTypeAttribute जोड़ा (संकलक ने इस विशेषता के बिना इसे स्वीकार नहीं किया - महान)। कंपाइलर ने क्या स्वीकार किया और मेरी मशीन पर क्या चल रहा था, हालांकि उत्पादन में नहीं चला। केवल उत्पादन में मुझे ऊपर उल्लिखित त्रुटि मिली। मौजूदा उपप्रकारों के सभी उपयोगों की तुलना करना और नया पता चला कि मैं भूल गया था कि WCF.RIA को विधि के नाम पर उपयोग करने के लिए उप प्रकार का नाम आवश्यक है, जैसे GetMySubTypes। इसलिए यदि आपको गुण जोड़ने के बाद यह त्रुटि मिलती है, तो देखें कि यह WCF.RIA के सम्मेलनों के कारण है या नहीं।

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