2012-04-23 12 views
63

मान लें कि यह एक ServiceContractडब्ल्यूसीएफ में विधि अधिभार की अनुमति क्यों नहीं है?

[ServiceContract] 
public interface MyService 
{ 
    [OperationContract] 
    int Sum(int x, int y); 

    [OperationContract] 
    int Sum(double x, double y); 

} 

विधि ओवरलोडिंग सी # में अनुमति दी है, लेकिन WCF आप operation contracts ओवरलोड होस्टिंग प्रोग्राम एक InvalidOperationException जबकि

+10

मुझे यकीन नहीं है कि यह _correct_ उत्तर है इसलिए मैं एक टिप्पणी के रूप में पोस्ट करूंगा। मेरा मानना ​​है कि ऐसा इसलिए है क्योंकि डब्ल्यूसीएफ को जितना संभव हो उतने प्रोटोकॉल के साथ काम करने के लिए डिज़ाइन किया गया है, यानी गैर-माइक्रोसॉफ्ट प्रौद्योगिकियां भी। ओवरलोडिंग .NET और कुछ अन्य भाषाओं के लिए एक विशेषता है, लेकिन सभी नहीं। सेवाओं की उपलब्धता को अधिकतम करने के लिए, ओवरलोडिंग की अनुमति नहीं है। (मुझे लगता है) – Smudge202

+0

मुझे एक अच्छा जवाब लगता है। –

+0

@Sleiman अच्छी टिप्पणी पतला –

उत्तर

90

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

http://jeffbarnes.net/blog/post/2006/09/21/Overloading-Methods-in-WCF.aspx

समस्या के समाधान के लिए, आप स्पष्ट रूप से OperationContract की Name संपत्ति निर्दिष्ट कर सकते हैं।

[ServiceContract] 
public interface MyService 
{ 
    [OperationContract(Name="SumUsingInt")] 
    int Sum(int x, int y); 

    [OperationContract(Name="SumUsingDouble")] 
    int Sum(double x, double y); 
} 
26

जब HTTP/सोप से अधिक लागू, अपने अनुबंध में एक ही विधि का नाम होने का मतलब होगा यह तय करने के जो विशेष विधि ग्राहक के बारे में आह्वान करने के लिए है कोई रास्ता नहीं है कि क्योंकि।

याद रखें कि http पर वेब विधियों का आविष्कार करते समय, तर्क वैकल्पिक होते हैं और अनुपलब्ध होने पर डिफ़ॉल्ट मानों के साथ प्रारंभ किए जाते हैं। इसका मतलब यह है कि दोनों विधियों का आविष्कार HTTP/SOAP पर बिल्कुल वैसे ही दिख सकता है।