2013-06-11 7 views
14

के लिए इंटरफ़ेस को लागू करते समय वैकल्पिक पैरामीटर का उपयोग नहीं कर सकता है मेरे इंटरफ़ेस में मैंने इसे घोषित कर दिया है।डब्ल्यूसीएफ

[OperationContract] 
[WebGet] 
String GetStuff(String beep, String boop = "too lazy to type"); 

मैंने इसे निम्नानुसार कार्यान्वित किया।

String GetStuff(String beep, String boop = "too lazy to type") { ... } 

यह मेरी डब्ल्यूसीएफ सेवा के रूप में संकलित और अपलोड करता है। हालांकि, जब मैंने इसे वेब संदर्भ के रूप में उपयोग किया और नीचे दिए गए कोड को निष्पादित करने का प्रयास किया, तो मुझे संकलक मिल रहा है और एकल पैरामीटर के हस्ताक्षर के साथ कोई विधि नहीं है। अंतिम पंक्ति समस्या है।

कैसे मैं तो भी टाइप करने के लिएडिफ़ॉल्ट द्वारा आलसी हो सकता है?

ServiceClient client = new ServiceClient(); 
client.GetStuff("blobb", "not lazy"); 
client.GetStuff("blobb"); 
+0

क्यों न सिर्फ विधि ओवरलोड, और एक विधि "boop" आपूर्ति के साथ अन्य फोन बनाते हैं? – Kippie

+3

ओवरलोडिंग या तो डब्ल्यूसीएफ के साथ काम नहीं करता है। –

+0

@HenkHolterman यहां कई अच्छे जवाब हैं। क्या आप अच्छे होंगे और जवाब के रूप में अपना सरल स्पष्टीकरण दें ताकि मैं इसे हरा देख सकूं। "डीफ तर्क समर्थित नहीं है" मेरे मुद्दे का सबसे अच्छा जवाब है। :) –

उत्तर

24

बस: डिफ़ॉल्ट तर्क समर्थित नहीं हैं।

डिज़ाइन और कारण के अनुसार। हम डब्ल्यूसीएफ अनुबंध लिखने के लिए सी # का उपयोग करते हैं लेकिन यह एक उल्लेखनीय चाल है। एसओएपी, आरईएसटी या जेएसओएन में प्रत्येक सी # भाषा सुविधा लागू नहीं की जा सकती है।

14

आप फ़ंक्शन को अधिभारित करने का प्रयास कर सकते हैं।

[OperationContract] 
MyResponse GetData(); 

[OperationContract(Name = "GetDataByFilter")] 
MyResponse GetData(string filter); 

फिर एक और विकल्प एक से अधिक पैरामीटर के बजाय एक DataContract उपयोग करने के लिए है, और उचित DataMember रों पर गलत पर IsRequired निर्धारित करते हैं, this question में विस्तार से बताया है।

1

आपको सेवा संदर्भ जोड़ते समय उत्पन्न कोड को देखना चाहिए।

के रूप में कोड WISDL, जहां हस्ताक्षर है (छद्म) से उत्पन्न होता है:

GetStuff(String , String) 

यह वैकल्पिक पैरामीटर के बारे में जानते हुए भी नहीं तदनुसार कोड जनरेट करता है,। इसलिए, यदि आप आलसी होना चाहते हैं, तो आपको उत्पन्न प्रॉक्सी क्लास को बदलना चाहिए या, जैसा कि @ स्टीफन बोर्ग ने सुझाव दिया है, फ़ंक्शन को अधिभारित करें।

3

मुझे कंपाइलर को एक पैरामीटर के हस्ताक्षर के साथ किसी भी विधि के बारे में चिल्लाना और रोना नहीं मिलता है।

शुरुआत में प्रारंभ करें। यह कि आपका कंपाइलर "whines" है क्योंकि सेवा डिफ़ॉल्ट मानकों के साथ वैकल्पिक मानकों को पहचान नहीं पाती है, इसलिए यह केवल सभी पैरामीटर की आवश्यकता वाले विधि का पर्दाफाश करेगा। इस मेटाडेटा के आधार पर आप क्लाइंट प्रॉक्सी ("सेवा संदर्भ") उत्पन्न करते हैं, जिसमें आपके द्वारा अपेक्षित विधि भी शामिल नहीं होती है; यह केवल उस सेवा को देखता है जो सेवा प्रकट करता है: (String beep, String boop) हस्ताक्षर वाला एक। इसलिए, अंत में, जब आप कक्षा पर एक गैर-मौजूदा विधि को कॉल करने का प्रयास करते हैं तो आपको संकलन त्रुटि प्राप्त होती है।

अब जब आप सेवा पर इस विधि को कॉल करते हैं, तो आपके क्लाइंट को दोनों मान प्रदान करना होगा। यदि आप null की आपूर्ति करते हैं, तो सेवा null देखेंगी, क्योंकि डिफ़ॉल्ट पैरामीटर के मान कॉलर में संकलित किए जाने हैं। डब्ल्यूसीएफ इसका समर्थन नहीं करता है, इसलिए आपको केवल ओवरलोड लोड करना होगा क्योंकि @StephenBorg ने सुझाव दिया था।

3

आप इस तरह यह कर सकते हैं:

[DataContract] 
public class GetStuffParams 
{ 
    [DataMember] 
    string beep {get; set; } 

    [DataMember] 
    string boop {get; set;} 


    public GetStuffParams() { boop = "too lazy to type"; } 
} 


[OperationContract] 
[WebGet] 
String GetStuff(GetStuffParams stuffParams);