2010-11-24 8 views
14

मेरे पास एक डब्ल्यूसीएफ सेवा है जो एक वर्ग लौटाती है जो IExtensibleDataObject लागू करती है। मुझे इस कक्षा में एक नया क्षेत्र जोड़ने की जरूरत है। मैंने डेटाकंट्रैक्ट इंटरफेस को अपडेट किया और कक्षा में बदलाव किया। अब जब मैं अपने क्लाइंट अनुप्रयोग मैं निम्नलिखित त्रुटि मिलती है चलाने का प्रयास:डब्ल्यूसीएफ डेटा अनुबंध में फ़ील्ड जोड़ना ग्राहकों को तोड़ देता है?

Could not load file or assembly 'xxx.yyyy.zzzz, Version=1.3.9.26111, Culture=neutral, PublicKeyToken=b09e2f3e9b5894f0' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

WFC वर्ग के AssemblyVersion बदल दिया गया है - कि ब्रेक ग्राहक करता है?

संपादित करें:

उत्पादन में ग्राहकों को इस सेवा का उपयोग कर रहे हैं। मैं उन्हें अपने सेवा संदर्भ को अद्यतन नहीं करना चाहता हूं और यदि संभव हो तो इस सरल परिवर्तन के लिए अपने ग्राहकों को फिर से तैनात करना चाहता हूं।

उत्तर

25

यह कैसे आप अपने डेटा अनुबंध की स्थापना की है पर निर्भर करता है।

डब्ल्यूसीएफ में, सभी डिफ़ॉल्टों का उपयोग करके, आपकी सेवा डेटा ऑब्जेक्ट सेरियलाइज़र (डीसीएस) का उपयोग आपके ऑब्जेक्ट को एक्सएमएल में क्रमबद्ध करने के लिए करेगी। डीसीएस आपके क्षेत्रों को क्रमशः क्रमबद्ध करेगा - पहले सार्वजनिक, फिर निजी वाले। प्रत्येक दृश्यता समूह के भीतर, यह नाम से फ़ील्ड/गुणों को क्रमबद्ध रूप से आदेश देगा।

इस प्रकार, यदि आप एक नया सार्वजनिक संपत्ति MiddleName लागू करने और आप पहले से ही FirstName और LastName था, तो आप ठीक हो जाएगा: वर्ष एक्सएमएल

<YourObject> 
    .... 
    <FirstName>.....</FirstName> 
    <LastName>.....</LastName> 
</YourObject> 

हो गया होता और अपने नए एक बस एक नया जोड़ना होगा अंत में संपत्ति:

<YourObject> 
    .... 
    <FirstName>.....</FirstName> 
    <LastName>.....</LastName> 
    <MiddleName>....</MiddleName> 
</YourObject> 

ऐसे ही एक अद्यतन "अंत में कुछ जोड़ने" ठीक काम करना चाहिए, डीसीएस बस एक्सएमएल में अतिरिक्त टैग अनदेखी करेंगे।

हालांकि: यदि आप एक संपत्ति Gender कहा जाता है, कि<FirstName> और <LastName> के बीच अटक जाएगा और इस प्रकार अपने XML में डेटा के क्रम टूट जाएगा और इस प्रकार डेटा अनुबंध टूट जाएगा पेश किया था - कोई "पुराने" ग्राहक होगा अपनी नई सेवा कॉल करने में सक्षम हो।

आदेश में इस का नियंत्रण लेने के लिए, आप अपने डेटा अनुबंध में अपने डेटा के सदस्यों पर विशिष्ट Order= गुण रख सकते हैं:

[DataContract] 
public class SomeAddress 
{ 
    [DataMember(Order=0)] 
    public string FirstName; 

    [DataMember(Order=1)] 
    public string LastName; 
} 

तो आप आसानी से एक नया संपत्ति जोड़ सकते हैं - बस के अंत में जोड़ने सूचि!

[DataContract] 
public class SomeAddress 
{ 
    [DataMember(Order=0)] 
    public string FirstName; 

    [DataMember(Order=1)] 
    public string LastName; 

    [DataMember(Order=2)] 
    public string Gender; 
} 

तो अपने डेटा ठेके पर Order= विशेषता का उपयोग करके, आप अपने एक्सएमएल लेआउट का नियंत्रण ले जा सकते हैं, और आप मौजूदा डेटा ठेके नॉन-ब्रेकिंग अद्यतन की सरल एक्सटेंशन बना सकते हैं।

अधिक पृष्ठभूमि और गहन जानकारी के लिए, आपको एमएसडीएन पत्रिका की वेबसाइट पर Serialization in Windows Communication Foundation पढ़ना चाहिए - अत्यधिक अनुशंसित।

+0

मैं इसे आज़माउंगा लेकिन उम्मीद है कि "असेंबली लोड नहीं हो सका" संस्करण जो मुझे मिल रहा है? – HitLikeAHammer

+0

उसने ऐसा किया। मैंने किसी भी मौजूदा सदस्यों के आदेश को नहीं बदला लेकिन नए सदस्यों को आदेश = 2 जोड़ा। अगले संस्करण में सभी नए सदस्यों पर ऑर्डर = 3 होगा और इसी तरह। – HitLikeAHammer

1
आपकी सेवा संदर्भ संदर्भ मेनू से

चुनें ... "Update Service Reference"

+1

हां, यह काम करेगा हालांकि मेरे पास उत्पादन में अन्य ग्राहक हैं। मैं हर किसी को पुन: संकलित करने और पुनर्वितरण करने से बचना चाहता हूं - खासकर यदि उन्हें नए क्षेत्र की आवश्यकता नहीं है। – HitLikeAHammer

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