2010-04-05 10 views
7

मेरे पास एक .NET वेब सेवा है (एएसएमएक्स का उपयोग करके ... अभी तक डब्लूसीएफ में अपग्रेड नहीं किया गया है) जो निम्न का खुलासा करता है:मैं .NET ASMX वेब सेवा में एक इंटरफ़ेस का खुलासा क्यों नहीं कर सकता?

public class WidgetVersion1 : IWidget {} 
public class WidgetVersion2 : IWidget {} 

जब मैं वेब सेवा से जुड़ने का प्रयास करता हूं, तो मुझे निम्न क्रमबद्धता त्रुटि मिलती है:

टाइप IWidget के सदस्य WidgetVersion1 को क्रमबद्ध नहीं कर सकता क्योंकि यह एक इंटरफ़ेस है।

मैंने IWidget इंटरफ़ेस (XmlIgnore, SoapIgnore, NonSerialized) में विभिन्न विशेषताओं को जोड़ने का प्रयास किया है, लेकिन वे एक इंटरफ़ेस पर मान्य नहीं हैं।

क्या कोई जानता है कि मैं इंटरफ़ेस का पर्दाफाश करने में असमर्थ क्यों हूं? मुझे लगता है कि डब्ल्यूएसडीएल इंटरफेस का समर्थन नहीं करता है, लेकिन इंटरफ़ेस को क्रमबद्ध नहीं करके .NET को इसके आसपास मिल सकता है? क्या विजेटविर्सन 1 और विजेटवर्सन 2 कक्षा परिभाषाओं से IWidget इंटरफ़ेस को हटाने के अलावा इसके आसपास कोई तरीका है?

उत्तर

10

WCF एक इंटरफेस को क्रमानुसार नहीं कर सकते हैं या तो; वास्तव में, एसओएपी पर इंटरफेस को क्रमबद्ध करना असंभव है।

कारण (सरलीकृत) यह है कि, deserializing, .NET को कुछ वास्तविक ठोस वर्ग बनाने में सक्षम होना चाहिए। एक इंटरफेस एक अमूर्त अवधारणा है; एक वास्तविक उदाहरण मौजूद होने के लिए हमेशा इसके पीछे एक "वास्तविक" वर्ग कार्यान्वयन होना चाहिए।

जब से तुम एक अंतरफलक के एक भौतिक उदाहरण का निर्माण नहीं कर सकते हैं, यह भी नहीं धारावाहिक हो सकता है।

यदि आप XmlIgnoreAttribute का उपयोग करने का प्रयास कर रहे हैं, तो समझें कि इसे प्रकार पर लागू करने से कुछ भी पूरा नहीं होगा। इसे सदस्य पर इसके बजाय लागू करने की आवश्यकता है। दूसरे शब्दों में:

public class SerializableClass 
{ 
    [XmlElement] 
    public int ID { get; set; } 

    [XmlElement] 
    public string Name { get; set; } 

    [XmlIgnore] 
    public IMyInterface Intf { get; set; } 
} 

... ठीक क्रमानुसार होगा, क्योंकि serializer Intf संपत्ति क्रमानुसार करने की कोशिश नहीं करेंगे। आप टाइप परिभाषा (यह संकलित नहीं करेंगे) में [XmlIgnore] विशेषता नहीं जोड़ सकते हैं।

+0

के आसपास जाने के लिए अच्छा विचार स्पष्ट स्पष्टीकरण के लिए धन्यवाद; यह सही समझ में आता है। – mcliedtk

+0

मैं सोच रहा था कि क्या यह मामला था और फिर सवाल फिर से पढ़ा गया था और हालांकि वह एक कक्षा का उपयोग करने की कोशिश कर रहा था जिसमें इंटरफ़ेस था। – Joshua

2

एक समारोह AsIWigit() है कि एक निजी पुल वर्ग इंटरफ़ेस कहा लागू करता है कि रिटर्न सुनिश्चित करें।

यह एक तरीके के रूप में की जरूरत है उचित इंटरफ़ेस के लिए इन कक्षाओं में परिवर्तित करने के लिए प्रदान करेगा और ASMX सेवाओं के साथ काम करेंगे।

+0

+1 – mcliedtk