2010-01-12 11 views
10

मेरे पास वीएस -2008 के साथ दो .NET 3.5 डब्ल्यूसीएफ सेवाएं हैं।डब्ल्यूसीएफ ग्राहकों में उत्पन्न 'निर्दिष्ट' गुणों को कैसे रोकें?

मेरे पास इन सेवाओं का उपभोग करने के लिए सिल्वरलाइट में दो डब्ल्यूसीएफ क्लाइंट हैं। ग्राहक 'सेवा जोड़ें संदर्भ' के साथ उत्पन्न होते हैं। मैं सिल्वरलाइट का उपयोग कर रहा हूं 4.

प्रॉक्सी में से प्रत्येक प्रॉपर्टी के लिए Specified गुणों के साथ उत्पन्न होता है।

// properties are generated for each of these fields 
    private long customerProfileIdField;   
    private bool customerProfileIdFieldSpecified;   
    private bool testEnvField;   
    private bool testEnvFieldSpecified; 

अब मेरी अन्य सेवा (अभी भी एक Silverlight ग्राहक के साथ) Specified गुण उत्पन्न नहीं करता है: यह मेरी सेवा विधि के लिए एक 'संदेश-इन' वर्ग है।

अब मुझे 'अच्छे एसओए के सिद्धांत' की परवाह नहीं है। मैं सिर्फ इन हानिकारक गुणों से छुटकारा पाना चाहता हूं क्योंकि मैं जो कर रहा हूं उसके संदर्भ में मैं बिल्कुल उनसे नफरत करता हूं।

दोनों सेवाओं के बीच कुछ अंतर होना चाहिए - लेकिन मैं अंतर जानने के लिए उन्हें पूरी तरह से अलग नहीं करना चाहता हूं।

similar question उत्तर देने से पहले 'you cant do it' - जो निश्चित रूप से सच नहीं है क्योंकि मेरे पास है - मुझे नहीं पता कि मैंने अलग-अलग क्या किया है।

संपादित करें: अब मैं ऐसी परिस्थिति में हूं जहां मैं अपनी 3.5 डब्लूसीएफ सेवा (सभी एक ही लोकहोस्ट मशीन पर) को अपने सिल्वरलाइट 4 प्रॉक्सी को पुन: उत्पन्न करता हूं, कभी-कभी मुझे 'निर्दिष्ट' गुण मिलते हैं और कभी-कभी मैं नहीं करता हूं। अब मैं नहीं सोचता (जैसा कि मैंने मूल रूप से संदेह किया था) कि यह पूरी तरह से कुछ अंतराल विन्यास या सेवा स्तर [विशेषता] के कारण है। संदेश में कुछ ट्रिगर होते हैं जो उत्पन्न होने के लिए निर्दिष्ट होते हैं (या नहीं)। इसमें कई कारक शामिल हो सकते हैं या यह कुछ आसान हो सकता है।

+0

मैं वास्तव में 3 सेवाओं है कि निर्दिष्ट गुण बनाने नहीं कर रहे हैं। केवल चौथा ही करता है! –

+0

अपनी सेवा पर विशेषताओं के लिए '[XMLSerializerFormat]' जोड़ें: इस [उत्तर] की जांच करें (http://stackoverflow.com/questions/13396190/wcf-service-method-arguments-bool- निर्दिष्ट) –

उत्तर

11

अपने WCF सेवा जहां संपत्ति

[DataMember(IsRequired=true)] 
public bool testEnvField { get; set; } 

IsRequired=true घोषित किया जाता है testEnvFieldSpecified संपत्ति के लिए की जरूरत नकारना होगा में इस कोशिश

+0

यह वैश्विक स्तर पर करने के बारे में क्या है ? अब मेरी सेवा जो निर्दिष्ट गुण बना रही थी, ने उन्हें जादूगर रूप से बना दिया है। मैंने अभी एक बहुत ही समान संदेश के साथ एक दूसरा ऑपरेशन कंट्रैक्ट जोड़ा है - इसलिए मैं अभी भी यह जानकर अटक गया हूं कि इस वैश्विक व्यवहार को किस प्रकार ट्रिगर कर रहा है –

+0

एकमात्र कारण मैं देख सकता था कि क्यों 2 प्रॉक्सी निर्दिष्ट फ़ील्ड के साथ उत्पन्न होती हैं और नहीं, तब से .n3.5 क्लाइंट अनुप्रयोग "IsRequired" प्रॉपर्टी की आवश्यकता नहीं है, वे डिफ़ॉल्ट रूप से इसे सही मानते हैं, जहां .net2.0 ऐप्स को विशेषता की आवश्यकता होती है, वे wsdl को अलग-अलग पढ़ते हैं। क्या दोनों अनुप्रयोग SL4 हैं? – Neil

+0

@neil वही एकल एप्लिकेशन! अब मैं एक बिंदु पर आया हूं जहां मेरे 3.5 ऐप को दोबारा बनाने और मेरे एसएल 4 क्लाइंट के लिए प्रॉक्सी को पुन: उत्पन्न करने के बाद मुझे कभी-कभी 'निर्दिष्ट' मिल जाएगा और कभी-कभी नहीं होगा। यह वास्तव में निराशाजनक हो रही है! डेटामैडल में कुछ इस व्यवहार को –

0

ठीक मैं एक बात मिल गया है अब तक कि करने के लिए Specified गुण का कारण होगा उत्पन्न हो:

  • संदेश में XTypedElement की उपस्थिति।

इनका उपयोग Linq2XSD द्वारा किया जाता है। मैं एक लिंक 2XSD मॉडल से एक तत्व लौट रहा था।

यह शुरू हो रहा Specified गुण मेरे सभी वर्गों में सब कुछ उत्पन्न हो रहे हैं:

public XTypedElement Foo { get; set; } 

हालांकि यह नहीं था:

public XElement Foo { get; set; } 

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

+0

मैं अचानक हूँ एक वेब सेवा में एक समान समस्या प्राप्त करना जो लिखित रूप में काम करता था, हालांकि मैं XTypedElement या Linq2XSD का उपयोग नहीं कर रहा हूं, और मैं .NET 4.0 – speckledcarp

2

ये अतिरिक्त निर्दिष्ट गुण मूल्य प्रकारों के लिए जेनरेट किए जाते हैं जिन्हें अनुबंध या विशेषता मार्कअप में वैकल्पिक के रूप में निर्दिष्ट किया जा रहा है।

मूल्य प्रकारों के डिफ़ॉल्ट रूप से मूल्य होता है, इसलिए अतिरिक्त गुणों के लिए अतिरिक्त Specified झंडे जोड़े जा रहे हैं, क्लाइंट (और सर्वर) को स्पष्ट रूप से निर्दिष्ट या स्पष्ट रूप से निर्दिष्ट कुछ के बीच अंतर करने की अनुमति देने के लिए - जिसे अच्छी तरह से सेट किया जा सकता है डिफ़ॉल्ट मान। इसके बिना, पूर्णांक हमेशा 0 (और serialized जा रहा है) होने पर भी समाप्त होता है भले ही आप उन्हें अपने क्लाइंट कोड में सेट नहीं करते हैं (int में मैपिंग की वजह से)। तो जब आप करते हैं, तो आपको यह भी सुनिश्चित करना होगा कि आपने Specified ध्वज को सही पर सेट किया है, अन्यथा इन गुणों को क्रमबद्ध नहीं किया जाएगा।

तो मूल्य ध्वजियों के लिए उत्पन्न होने वाले इन झंडे को रोकने के लिए, आपको वैकल्पिक रूप से इन मान प्रकार गुणों को अनिवार्य बनाने के लिए अनुबंध को बदलना होगा।

आशा है कि यह समझ में आता है।

+1

का उपयोग कर रहा हूं ठीक है जो बनाता है त्रुटि को समझें मैं हमेशा उन्हें मूल्य प्रकारों के लिए भी उत्पन्न नहीं करता हूं। वर्तमान में मेरे सभी (यहां तक ​​कि गैर-नामुमकिन) बूलियन और 'इनट्स' इन गुणों को उत्पन्न नहीं कर रहे हैं, लेकिन कभी-कभी मैं अनुबंध में अनजाने में कुछ बदलता हूं जो उन्हें उत्पन्न करता है (और मैं निश्चित रूप से गलती से जोड़ नहीं रहा हूं [डेटामेम्बर (IsRequired = true) ])। मैं वास्तव में जानना चाहता हूं कि उन्हें स्थायी रूप से अक्षम कैसे करें ताकि वे 'सामान्य' वस्तुओं की तरह व्यवहार कर सकें। –

+0

गैर-शून्य वाले लोगों को ठीक होना चाहिए, यह केवल * वैकल्पिक * मान प्रकार है, जो यह होगा। –

+0

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

0

नोट: मुझे एहसास है कि यह एक पुराना सवाल है। मैं इसे यहां जोड़ रहा हूं क्योंकि यह प्रश्न Google पर एक शीर्ष परिणाम के रूप में आता है, और जो भी दिख रहा है, उसके लिए यह उपयोगी जानकारी है।

आपके ऑपरेशन अनुबंध घोषणा में इस लाइन जोड़ने का प्रयास करें:
[XmlSerializerFormat]

वह कुछ इस तरह दिखना चाहिए:

namespace WebServiceContract 
{ 
    [ServiceContract(Namespace = "http://namespace")] 
    [XmlSerializerFormat] //This line here will cause it to serialize the "optional" parameters correctly, and not generate the extra 
    interface InterfaceName 
    { 
     /*...Your web service stuff here...*/ 
    } 
} 
+1

ध्यान दें कि यह वेब सेवा के लिए उपयोग किए गए एक्सएमएल सीरियलाइजेशन इंजन को पूरी तरह बदल देता है। (DataContractSerializer से XmlSerializer में बदल रहा है)। विभिन्न इंजन धारावाहिक आउटपुट को नियंत्रित करने के लिए विशेषताओं के एक अलग सेट का उपयोग करता है, इसमें अलग-अलग संगतता सीमाएं होती हैं, और विभिन्न प्रदर्शन विशेषताएं होती हैं। यह मामूली परिवर्तन नहीं है। – Hydrargyrum

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