2010-11-06 14 views
7

पर ऑब्जेक्ट्स लौट रहा है मैं डब्ल्यूसीएफ के साथ खेलने की कोशिश कर रहा हूं और मुझे लगता है कि मैंने एक ब्लॉक मारा है। मेरी समस्या यह है कि मैं "क्लाइंट" से Add(double,double) और getPerson() पर कॉल करने में सक्षम हूं। हालांकि, मैं Person ऑब्जेक्ट के किसी भी तरीके को कॉल करने में सक्षम नहीं हूं। मैंने कक्षाओं को नंगे तरीकों से छीन लिया है। यहाँ मेरी कोड के टुकड़े कर रहे हैं, मुझे पता है मैं गलत क्या कर रहा हूँ तो कृपया ..डब्ल्यूसीएफ क्लाइंट

Server Code

namespace Test.WebSvc{ 
    [ServiceContract(Namespace = "http://Microsoft.ServiceModel.Sample")] 
    public interface ICalculator 
    { 
    [OperationContract] 
    double Add(double n1, double n2); 
    [OperationContract] 
    Person getPerson(); 
    } 


public class CalculatorService : ICalculator 
{ 
    public double Add(double n1, double n2) { return n1+n2 ; } 
    public Person getPerson(){ 
    Person tempPerson = new Person(); 
    return tempPerson; 
    } 
} 

[DataContract] 
public class Person{ 
[OperationContractAttribute] 
public string toString(){ 
return "This is a Person Object"; 
} 

Client Code

ServiceRef1.CalculatorClient client = ServiceRef1.CalculatorClient();//works 
Console.WriteLine(client.Add(1.0,2.0)); //this too works 
ServiceRef1.Person p = client.getPerson(); // this is OK., but is not doing what I wanted it to do 
Console.WriteLine(p.toString()); // I do not get "This is Person Object" 

मैं कुछ अनुमान लगा रहा हूँ मेरे व्यक्ति वर्ग 'घोषणा के साथ गलत क्या है .. लेकिन मुझे पता चले कि मुझे क्या करना चाहिए या मुझे क्या याद आ रहा है ..

धन्यवाद!

उत्तर

8

आप अपने Person प्रकार के साथ दो अवधारणाओं को मिश्रित कर रहे हैं - आप जो कर रहे हैं वह काम नहीं करेगा।

आपने Person प्रकार पर DataContract विशेषता डाली है। यह सही है, क्योंकि आपके पास ऐसी सेवा है जो Person लौट रही है। Person ऑब्जेक्ट को क्रमबद्ध किया जाएगा और इस मामले में आपके सेवा क्लाइंट (CalculatorClient) पर वापस आ जाएगा।

आप Person इस तरह परिभाषित करना चाहिए:

[DataContract] 
public class Person 
{ 
    [DataMember] 
    public string Description { get; set; } 
} 

और अपने कैलकुलेटर सेवा में:

public Person getPerson() 
{ 
    Person tempPerson = new Person(); 
    tempPerson.Description = "This is a Person Object"; 
    return tempPerson; 
} 

इसका कारण यह है अपने Person वस्तु की नौकरी डेटा रखने के लिए, और ग्राहक के लिए सर्वर से ले जाने के लिए है । यह विधियों/संचालन को परिभाषित करने का काम नहीं है, जो आपके सेवा वर्गों (उदाहरण के लिए CalculatorService) में किया जाना चाहिए। OperationContract विशेषता जोड़ने से डेटा ट्रांसफर ऑब्जेक्ट को किसी सेवा में जादुई रूप से चालू नहीं किया जाता है।

+0

मुझे यह जानने के लिए एक मिनट लगा कि DataContract ServiceModel नेमस्पेस का हिस्सा नहीं है। यह सिस्टम में है। रनटाइम। क्रमबद्धता और आपको अपनी परियोजना में संदर्भ जोड़ने की भी आवश्यकता होगी – Knightsy

10

हां, आपने बाधा डाली है - डब्ल्यूसीएफ एक संदेश-आधारित प्रणाली है जो केवल धारावाहिक डेटा, या तो XML या JSON के रूप में टेक्स्ट या बाइनरी प्रारूप में आदान-प्रदान करता है। यह नहीं हालांकि "पूर्ण" .NET ऑब्जेक्ट्स को अपनी पूर्ण क्षमताओं के साथ पास करता है जैसे विधियों और यह सब (यह कैसे होना चाहिए ?? यह इंटरऑपरेबल होने के लिए डिज़ाइन किया गया है, और मुझे नहीं पता कि रूबी या PHP क्लाइंट कैसे हो सकता है एक .NET ऑब्जेक्ट पर एक विधि कॉल करें)।

डब्ल्यूसीएफ को वस्तुओं को दूरस्थ रूप से एक्सेस करने के लिए डिज़ाइन नहीं किया गया है - यह केवल क्लाइंट और सर्वर के बीच संदेश भेजता है। इसलिए, आप जो कुछ भी एक्सएमएल स्कीमा (परमाणु प्रकार, विरासत और संरचना जैसे कुछ भी) में व्यक्त कर सकते हैं, दोनों धाराओं के बीच क्रमबद्ध और भेजा जा सकता है।

कोई भी चीज जो XML स्कीमा में मॉडलिंग नहीं किया जा सकता - तरह जेनरिक, इंटरफेस, तरीकों/कोड - क्लाइंट और सर्वर के बीच पारित नहीं किया जा सकता है।

यदि आप संचार के दोनों सिरों को नियंत्रित करते हैं और दोनों ही .NET आधारित हैं, तो इसके आसपास होने के तरीके और चाल हैं। असल में, आपको अपना सेवा अनुबंध और अपने सभी डेटा अनुबंध (सभी अपनी कक्षाएं) को एक अलग असेंबली में रखना होगा, जिसे आप तब दोनों सर्वर (सेवा अनुबंध लागू करना) और अनुबंध से कॉल करने वाले क्लाइंट से संदर्भित करना होगा।आप संदर्भित असेंबली में पहले से मौजूद प्रकारों का पुन: उपयोग करने के लिए डब्ल्यूसीएफ को बता सकते हैं, और इस मामले में, ग्राहक फिर से तैयार की गई 0-कक्षा (इसकी सभी .NET भलाई के साथ) को फिर से उपयोग करने के बजाय आपकी साझा साझा असेंबली से फिर से उपयोग करेगा। क्लाइंट-साइड डेटा प्रॉक्सी बनाना। इस चाल के साथ, आप डब्ल्यूसीएफ तार में धारावाहिक संदेश भेज सकते हैं, फिर भी ग्राहक पक्ष पर, आप अपने सभी तरीकों और सभी के साथ एक पूर्ण .NET ऑब्जेक्ट को फिर से बना रहे हैं।

फिर से: जब तक आप संचार के दोनों सिरों को नियंत्रित करते हैं, तब तक यह बहुत अच्छा काम करता है, और दोनों सिरों .NET का उपयोग कर रहे हैं। इस दृष्टिकोण के साथ खिड़की से बाहर कोई इंटरऑपरेबिलिटी है।

+0

+1 धारावाहिक डेटा का स्पष्टीकरण –

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