मैं एक डब्ल्यूसीएफ सेवा बना रहा हूं, और मुझे कुछ सीरियलाइजेशन मुद्दों के साथ बहुत परेशानी हो रही है। शायद वहाँ यह करने के लिए सिर्फ 1 रास्ता नहीं है, लेकिन मैं इसे पुष्टि करने के लिए यहाँ मेरी नमूना कोड चाहते हैं:डब्ल्यूसीएफ, इंटरफ़ेस रिटर्न प्रकार और ज्ञात प्रकार
संविदा
public interface IAtm
{
[DataMember]
double Latitude { get; set; }
[DataMember]
double Longitude { get; set; }
}
[ServiceContract]
public interface IAtmFinderService
{
[OperationContract]
ICollection<IAtm> GetAtms();
}
सेवा कार्यान्वयन:
[KnownType(typeof(Atm))]
[KnownType(typeof(List<Atm>))]
[ServiceKnownType(typeof(Atm))]
[ServiceKnownType(typeof(List<Atm>))]
public class AtmFinderService : IAtmFinderService
{
public ICollection<IAtm> GetAtms()
{
return new List<IAtm>()
{
new Atm() { Latitude = 1, Longitude = 1 },
new Atm() { Latitude = 2, Longitude = 2 }
};
}
}
मैं के सभी जोड़ा KnownType और ServiceKnownType विशेषताएँ क्योंकि मैंने सोचा था कि वहां कुछ याद आ रही है .. तो अब, मैं कुछ परीक्षण कर रहा हूं। मैंने VS को स्वचालित रूप से प्रॉक्सी बनाने के लिए "सेवा जोड़ें संदर्भ" विधि का उपयोग करके एक कंसोल ऐप बनाने का प्रयास किया।
InnerException संदेश था 'प्रकार ' 'के साथ डेटा अनुबंध नाम ' WCFTest.Atm: इस तरह, मैं
object[] GetAtms();
जब यह कॉल करने के लिए कोशिश कर रहा है की तरह एक समारोह मिलता है, मैं इस त्रुटि मिलती है एटीएम: http: //schemas.datacontract.org/2004/07/WCFTest ' की उम्मीद नहीं है। एक DataContractResolver उपयोग पर विचार करें या किसी प्रकार नहीं जाना जाता प्रकारों की सूची को स्थिर जाना जाता जोड़ने -। उदाहरण के लिए, KnownTypeAttribute विशेषता या द्वारा उपयोग कर उन्हें जाना जाता है प्रकार DataContractSerializer के लिए पारित की सूची में जोड़ने से '।
बहुत अच्छा ... तो फिर, मुझे लगता है कि वीएस का स्वत: कोड कोड बकवास है।
[OperationContract]
ICollection<Atm> GetAtms();
तो अब, मैं एक ठोस प्रकार लौट रहा हूँ: मैं अपने सेवा (और सभी संबंधित वर्गों और कार्यान्वयन) में निम्न परिवर्तन किया था। सेवा संदर्भ को अद्यतन करने के बाद, यह अपने सदस्यों और सामान के साथ एटीएम कक्षा की एक प्रति बनाता है। सेवा कॉल करने के बाद, कॉल सफल होता है। मैंने सोचा कि यह स्वत: उत्पन्न कोड से संबंधित कुछ बुरा व्यवहार था, इसलिए मैंने एक बहुत ही सरल मेजबान/क्लाइंट ऐप बनाने की कोशिश की। मैंने कुछ बंदरगाह पर एक कंसोल होस्ट सुनना शुरू किया, फिर क्लाइंट को क्लाइंटबेस क्लास का उपयोग करने के लिए क्लाइंटबेस क्लास का उपयोग किया। वही व्यवहार ... यदि सेवा को एक इंटरफ़ेस प्रकार लौटाया गया है, तो यह विफल हो जाता है। अगर मैं इसे ठोस प्रकार वापस करने के लिए बदलता हूं, तो यह काम करता है। मुझे लगता है कि मुझे KnownType विशेषताओं के साथ कुछ समस्या है, मुझे कुछ ऐसा याद आना चाहिए जो serializer संसाधित नहीं कर सकता है। लेकिन मुझे नहीं पता कि क्या।
+1 धन्यवाद, मैं एक ही समस्या थी, लेकिन केवल जोड़ने की जरूरत मेरे कस्टम पेजेडलिस्ट इम्प्लेमेनेशन के लिए कार्यान्वयन की सूची। मेरा "टी" एक डोमेन ऑब्जेक्ट था और पहले से ही मेरे लिए सही ढंग से क्रमबद्ध किया गया था। –
Jay