2012-10-18 14 views
5

वापस नहीं करेगा I सी # में डब्ल्यूसीएफ का निर्माण कर रहा हूं, और एक ग्राहक इसे एक ही समय में उपभोग करने के लिए तैयार कर रहा है। किसी कारण से मुझे एक int वापस करने के लिए एक विधि प्राप्त करने में परेशानी हो रही है।डब्ल्यूसीएफ एक int

[ServiceContract] 
public interface IMData 
{ 
    [OperationContract] 
    int ReturnAnInt(); 

    [OperationContract] 
    String HelloWorld(); 
} 

वह स्थान है जहां मैं इसे लागू किया है:: यहाँ मेरे अनुबंध है

public class MData : IMData 
{ 
    public String HelloWorld() 
    { 
    return "Hello World"; 
    } 

    public int ReturnAnInt() 
    { 
    return 5; 
    } 
} 

मैं दृश्य स्टूडियो का उपयोग कर रहा है, और ग्राहक के लिए, मैं एक वेब संदर्भ के रूप में इस WCF आयात किया। अब किसी कारण से जब मैं एमडीएटी का एक उदाहरण घोषित करता हूं और हैलोवर्ल्ड को कॉल करने का प्रयास करता हूं, तो कोई समस्या नहीं है, लेकिन मुझे ReturnAnInt पर कॉल करते समय संकलन त्रुटि मिलती है।

MData m = new MData(); 
String helloWorld = m.HelloWorld(); 
int result = m.ReturnAnInt(); 

त्रुटि मैं ReturnAnInt साथ मिलता है: "नहीं अधिभार विधि 'ReturnAnInt' के लिए ले जाता है 0 तर्क" तो फिर मैं माउस क्या दृश्य स्टूडियो उम्मीद कर रही है को देखने के लिए, और यह कहा गया है कि विधि दिखना चाहिए जैसे:

void MData.ReturnAnInt(out int ReturnAnIntResult, out bool ReturnAnIntResultSpecified) 

मैं अब घंटे के लिए इस पर एक दीवार के खिलाफ मेरे सिर पीटने किया गया है और गूगल पर कुछ भी नहीं मिल सकता है, और यह अपने सहकर्मियों के साथ-साथ को विस्मित कर दिया है। यह दो आउट पैरामीटर क्यों जोड़ता है जो परिभाषा में नहीं हैं, और रिटर्न प्रकार बदलते हैं? किसी भी तरह की सहायता का स्वागत किया जाएगा। अगर मैं किसी भी जानकारी को छोड़ देता हूं तो मैं क्षमा चाहता हूं।

उत्तर

4

क्या आप इसे वेब संदर्भ (पुराने तकनीक) के बजाय सेवा संदर्भ (नई तकनीक) के रूप में आयात कर सकते हैं? मैं सेवा संदर्भों के माध्यम से डब्ल्यूसीएफ सेवाओं के साथ काम करता हूं और इस तरह की कोई समस्या नहीं देखी है - मैंने केवल Specified संपत्ति (और int के साथ एक संपत्ति के रूप में, दो out पैराम्स के रूप में नहीं देखा है) जब सेवा परिभाषा int होने की अनुमति नहीं देती है निर्दिष्ट (डब्ल्यूसीएफ-जेनरेट की गई सेवा परिभाषाएं, मेरे अनुभव में, अपेक्षित के रूप में काम करती हैं)।

आप एक बेहतर समाधान नहीं मिल रहा है, तो यहां partial classes का उपयोग कर एक समाधान है:

public partial class MData 
{ 
    public int ReturnAnInt() 
    { 
     int result; 
     bool specified; 
     this.ReturnAnInt(out result, out specified); 
     if (!specified) throw new InvalidOperationException(); 
     return result; 
    } 
} 

अद्यतनhttp://www.codeproject.com/Articles/323097/WCF-ASMX-Interoperability-Removing-the-Annoying-xx (जब भी आप किसी struct लौट ही नहीं, int रों किया जाना इस लगेंगे) एक (कुछ हद तक klunky) समाधान है, और हमें सूचित करता है कि मूल कारण यह है कि डब्ल्यूसीएफ गरीब (तर्कसंगत गलत) डब्लूएसडीएल उत्पन्न करता है - उनके पास उन तत्वों पर minOccurs="0" है जो वास्तव में इसकी आवश्यकता नहीं है। वेब संदर्भ इस तरह से पढ़ता है, और इससे निपटने के लिए क्लंकी कोड उत्पन्न करता है, जो आपसे निपटने का प्रयास कर रहे हैं। अपने लेख के आधार पर, आप एक int के बजाय इस प्रकार लौट सकते हैं:

[MessageContract(IsWrapped = false)] 
public class MyInt 
{ 
    [MessageBodyMember] 
    public int Result { get; set; } 

    public static implicit operator MyInt(int i) 
    { 
     return new MyInt { Result = i }; 
    } 

    public static implicit operator int(MyInt m) 
    { 
     return m.Result; 
    } 
} 

विधि की वापसी प्रकार को संशोधित करने के साथ-साथ:

[ServiceContract] 
public interface IMData 
{ 
    [OperationContract] 
    MyInt ReturnAnInt(); 

    [OperationContract] 
    String HelloWorld(); 
} 
public class Service1 : IMData 
{ 
    public MyInt ReturnAnInt() 
    { 
     return 4; 
    } 

    public string HelloWorld() 
    { 
     return "Hello World"; 
    } 
} 
+0

WCF वास्तव में एक 'out' मापदंडों समर्थन करता है? – abatishchev

+0

हां, लेकिन वास्तव में यह सवाल नहीं है कि सवाल क्या है। प्रश्न में वर्णित समस्या यह है कि डब्ल्यूसीएफ सी # कोड 'आउट' पैरामीटर या वैकल्पिक 'int' निर्दिष्ट नहीं करता है, लेकिन वेब संदर्भ कोड जेनरेटर इसे बनाता है। यह काम। हालांकि, आप एक डब्ल्यूसीएफ सेवा जैसे 'int ReturnAnInt (बाहर int intInt) परिभाषित कर सकते हैं;' वह काम करता है, और दोनों को सेवा संदर्भ के रूप में और वेब संदर्भ के रूप में उपयोग किया जा सकता है। उत्पन्न डब्लूएसडीएल केवल कई तत्वों के साथ एक प्रतिक्रिया वस्तु है, इसलिए इसे अन्य क्लाइंट भाषाओं में भी कुछ उपयोग करने योग्य बनाना चाहिए। –

+0

आपके उत्तरों के लिए सभी को धन्यवाद, वे बहुत उपयोगी थे! मैंने इसे एक सेवा संदर्भ के रूप में आयात किया और मेरी समस्या हल हो गई :) –

2

आप (एक सेवा संदर्भ के रूप में आयात नाम की जगह के साथ MData) इसके बजाय वेब संदर्भ।

और नीचे दिए गए कोड का उपयोग करें,

MDataClient m = new MDataClient(); 
String helloWorld = m.HelloWorld(); 
int result = m.ReturnAnInt(); 

अपने कोड में कुछ भी गलत नहीं है। यदि आप सेवा संदर्भ जोड़ते हैं और उपरोक्त स्निपेट का उपयोग करते हैं तो यह ठीक काम करना चाहिए।

0

मुझे एक ही समस्या थी, मुझे काम करने के लिए मेरी वेब सेवा का out int पैरामीटर नहीं मिला। मुझे अभी भी यह सुनिश्चित नहीं है कि यह वास्तव में क्या था, लेकिन मैंने stringout पैरामीटर के रूप में काम कर रहा था।

[OperationContract] 
LoginStatus GetLogin(string username, string password, out string s_uId); 
वेब सेवा तरफ

:

s_uId = uId.ToString(); 
क्लाइंट की तरफ

:

int uId; 
string s_uId; 
result = client.GetLogin(username, password, out s_uId); 
Int32.TryParse(s_uId, out uId);