2012-03-07 16 views
7

मैं अपने डब्ल्यूसीएफ सेवा पर एक इंटरफ़ेस के रूप में अपने रिटर्न प्रकार के साथ एक फ़ंक्शन रखना चाहता हूं, लेकिन जब मैं इसे क्लाइंट से कॉल करता हूं तो मुझे System.Object प्राप्त होता है, न कि इंटरफ़ेस लागू करने वाली कक्षा सेवा भेजी गई।वेब सेवा में एक इंटरफ़ेस का खुलासा कैसे करें

[ServiceContract] 
public interface IService 
{ 
    [OperationContract] 
    string SayHello(); 

    [OperationContract] 
    IMyObject GetMyObject(); 
} 

public interface IMyObject 
{ 
    int Add(int i, int j); 
} 

[DataContract] 
public class MyObject : IMyObject 
{ 
    public int Add(int i, int j) 
    { 
     return i + j; 
    } 
} 

इस सेवा मैं के कार्यान्वयन में:

यहां कुछ नमूना कोड है

public class LinqService : IService 
{ 
    public string SayHello() 
    { 
     return "Hello"; 
    } 

    public IMyObject GetMyObject() 
    { 
     return new MyObject(); 
    } 
} 

SayHello() अच्छी तरह से काम करता है, लेकिन GetMyObject() एक System.Object देता है। इस कोड को कैसे बदल सकता है ताकि GetMyObject() कोई ऑब्जेक्ट लौटाता है जो IMyObject लागू करता है?

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

पालन कोड परिवर्तित:

using System.Runtime.Serialization; 
using System.ServiceModel; 

[ServiceContract] 
public interface IService 
{ 
    [OperationContract] 
    string SayHello(); 

    [OperationContract] 
    IMyObject GetMyObject(); 
} 

[ServiceKnownType(typeof(MyObject))] 
public interface IMyObject 
{ 
    [OperationContract] 
    int Add(int i, int j); 
} 

[DataContract] 
public class MyObject:IMyObject 
{ 
    public int Add(int i, int j) 
    { 
     return i + j; 
    } 
} 

लेकिन कोई सफलता!

+0

मैं अपने WCF विधि से एक अंतरफलक लौटने का उद्देश्य पूछना कर सकते हैं? – CSharpenter

+0

वही है कि आप एक विधि से एक nterface वापस कर सकते हैं: wcf के उपयोगकर्ता से कार्यान्वयन छुपा। मेरे डब्ल्यूसीएफ उपयोगकर्ता को किसी भी वर्ग के बारे में क्यों पता होना चाहिए जिसे मैंने इंटरफ़ेस के लिए लागू किया था? उपयोगकर्ता को यह जानने की जरूरत है कि किसी ऑब्जेक्ट की कौन सी संपत्तियां या विधियां आ रही हैं। मेरे उदाहरण में, मैं कुछ पैरामीटर के आधार पर IMyObject के विभिन्न प्रत्यारोपण को वापस कर सकता हूं। – mans

+0

आम तौर पर, यह एक अच्छा इरादा है, बल्कि व्यर्थ है। कॉलर को वैसे भी "कार्यान्वयन" नहीं दिखाई देगा।'DataContract' के अंदर 'ऑपरेशन कंट्रैक्ट' रखने के लिए भी समर्थित नहीं है। दोनों वास्तव में अलग अवधारणाएं हैं। अधिक जानकारी के लिए आपको एमएसडीएन पर [डिजाइनिंग सेवा अनुबंध] (http://msdn.microsoft.com/en-us/library/ms733070.aspx) की समीक्षा करनी चाहिए। –

उत्तर

9

सभी WCF अनुबंध तर्क और प्रकार serializable होना जरूरी वापसी; इंटरफेस नहीं हैं। This questionKnownType विशेषता के चारों ओर घूमने वाले उत्तर के साथ एक ही समस्या की पड़ताल करता है; यदि आप IMyObject के विभिन्न कार्यान्वयन को वापस करने जा रहे हैं, तो मैं इसकी अनुशंसा करता हूं, अन्यथा आपको रिटर्न प्रकार को MyObject में बदलना होगा।

+0

कृपया मूल प्रश्न में मेरा संपादन देखें। – mans

+1

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

+0

'ज्ञात टाइप' और 'ServiceKnownType' विशेषताएँ जोड़ने का प्रयास करें, और उन्हें 'IMYObject' की बजाय' IService' में जोड़ें। –

1

क्रमबद्धता पर अतिरिक्त नोट्स निम्नलिखित नियम भी डेटा अनुबंध Serializer द्वारा समर्थित प्रकारों पर लागू:

जेनेरिक प्रकार पूरी तरह से डेटा अनुबंध serializer द्वारा समर्थित हैं।

Nullable प्रकार पूरी तरह से डेटा अनुबंध serializer द्वारा समर्थित हैं।

इंटरफ़ेस प्रकार, या तो वस्तु के रूप में इलाज कर रहे हैं या, संग्रह प्रकार के रूप में संग्रह इंटरफेस के मामले में।

मुझे लगता है कि आप ग्राहक सक्रिय वस्तु के बारे में बात कर रहे हैं:

.....

पूर्ण MSDN Additional Notes on Serialization


संपादित करें देखें। अधिक है कि के बारे में निम्नलिखित पोस्ट Returning an interface from a WCF service तुम देखो तुम ही WCF लेकिन कोई कार्यान्वयन में क्रमांकन के माध्यम से डेटा भेज सकते हैं देखते हैं यह जानने के लिए। आपकी समस्या के आसपास दूसरी तरफ इंस्टेंसिंग का उपयोग कर रहा है।

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