2010-12-03 12 views
9

में एक से अधिक पैरामीटर का उपयोग किया जाता है मेरे पास एक WebServiceHost है जिसका उपयोग कंसोल ऐप में कुछ वेब सेवाओं को होस्ट करने के लिए किया जा रहा है। मैं अपने ग्राहक अनुप्रयोग में इसे करने के लिए एक सेवा के संदर्भ जोड़ा गया है और इसलिए तरह प्रॉक्सी बनाने के लिए:डब्ल्यूसीएफ सेवा प्रॉक्सी अपवाद फेंकता है जब [ऑपरेशन कंट्रैक्ट] विधि

var binding = new WebHttpBinding(); 
var endPoint = new EndpointAddress(string.Format(Settings.serviceBase, Settings.wcfPort)); 

ChannelFactory<IzWaveSVC> factory = new ChannelFactory<IzWaveSVC>(new WebHttpBinding(), endPoint); 

factory.Endpoint.Behaviors.Add(new WebHttpBehavior()); 
// **Exception occurs here** 
var proxy = (IzWaveSVC)factory.CreateChannel(); 

यह काम करता है, लेकिन एक बार मैं एक नई पद्धति है कि एक से अधिक पैरामीटर की आवश्यकता कहा, मैं जब प्रॉक्सी इस अपवाद हो रही शुरू कर दिया

[OperationContract] 
[WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped)]   
bool setDeviceState(byte nodeId, bool powered, byte level); 

:

Operation 'setDeviceState' of contract 'IzWaveSVC' specifies multiple request 
body parameters to be serialized without any wrapper elements. At most one 
body parameter can be serialized without wrapper elements. Either remove the 
extra body parameters or set the BodyStyle property on the WebGetAttribute/
WebInvokeAttribute to Wrapped. 

एक WebInvokeAttribute कोई प्रभाव जोड़ना और है लिपटे को Bodystyle की स्थापना: बनाया गया था (यह पहले किसी भी संचार भी जगह ले ली थी) यह ध्यान दिया जाना चाहिए कि मेरे पास अन्य विधियां हैं जो काम करती हैं, लेकिन उनके पास केवल एक पैरामीटर है, इसलिए उनके पास उपरोक्त समस्या नहीं है।

endPoint = new EndpointAddress(string.Format(Settings.serviceBase, port)); 
binding = new WebHttpBinding(); 

host = new WebServiceHost(singletonObject, new Uri(string.Format(Settings.serviceBase, port))); 

host.AddServiceEndpoint(typeof(IzWaveSVC), binding, ""); 
ServiceMetadataBehavior mexBehavior = new ServiceMetadataBehavior();     
mexBehavior.HttpGetEnabled = true; 
host.Description.Behaviors.Add(mexBehavior);     
host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(), endPoint.Uri.AbsoluteUri + "mex");  
host.Open();    

किसी भी मदद की सराहना की है:

बस FYI करें, यहाँ मैं कैसे सेटअप मेजबान है।

धन्यवाद!

+0

हाय, शायद मेरी आंखें ठीक से काम नहीं कर रही हैं। लेकिन मैं नहीं देखता कि आप विधि को कैसे बुला रहे हैं। क्या आप इस कोड को पोस्ट कर सकते हैं कि आप विधि को कैसे कॉल कर रहे हैं? –

+0

@Alex - जब आप विधि को कॉल करते हैं, तो क्या आप क्लाइंट से setDeviceState को कॉल करते समय कह रहे हैं? यदि आपका यही मतलब है, तो मुझे इसे कॉल करने का मौका भी नहीं मिलता है। कॉल होने से पहले सेवा के लिए प्रॉक्सी सेट करते समय विफलता होती है। – bugfixr

+0

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

उत्तर

15

ऐसा लगता है कि आपने वीएस में सेवा संदर्भ संवाद जोड़ें का उपयोग कर प्रॉक्सी कोड बनाया है। वीएस एएसआर संवाद डब्ल्यूसीएफ आरईएसटी पूरी तरह से समर्थन नहीं करता है, इसलिए प्रॉक्सी कोड [WebInvoke] विशेषता अनुपलब्ध है। क्या आप ग्राहक प्रॉक्सी में परिचालनों पर [WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped)] विशेषता जोड़ने का प्रयास कर सकते हैं?

+0

मैंने अपने एएसआर-जेनरेट कोड में संदर्भ.cs फ़ाइल में जोड़ा और यह वास्तव में काम करता था। संदर्भ.cs फ़ाइल को संशोधित करने के बजाय कॉल चरण के दौरान एक ही चीज़ को पूरा करने का कोई तरीका है? मुझे हर बार जब मैं अपनी सेवा रीफ्रेश करता हूं तो उस फ़ाइल को अपडेट करना याद रखना नफरत है .... – bugfixr

+2

क्लाइंट प्रॉक्सी में संचालन पर विशेषता के द्वारा आपका क्या मतलब है? , मैंने उन्हें डब्लूसीएफ लाइब्रेरी में जोड़ा, और मेरे प्रश्न – AMH

+0

@bugfixr को संदर्भ फ़ाइल में जोड़ने के दौरान भी काम नहीं करता है, यह वही त्रुटि थूकता रहता है, जैसे कि – jonayreyes

5

दो समाधान मैंने पाया:

आप <webHttp/>

को दूर कर सकते हैं से

<behaviors> 
    <endpointBehaviors> 
    <behavior> 
     <!--<webHttp/>--> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 

यदि आप नहीं कर सकते, मैं ऑपरेशन से ऊपर विशेषता

[WebInvoke(BodyStyle = WebMessageBodyStyle.WrappedRequest)] 

जोड़ने के लिए किया था संपर्क विधि

+0

कुछ भी नहीं बदला गया था, लेकिन यह कभी भी मेरे यक्वेस्टियन http को नहीं देखता : //stackoverflow.com/questions/11466537/wcf-strange-behaviour – AMH

1

विजुअल स्टूडियो के भीतर अपनी सेवा के होस्टिंग वातावरण को बदलने का प्रयास करें।
इसे Use local IIS से 'विजुअल स्टूडियो डेवलपमेंट सर्वर का उपयोग करें' में बदलें।

स्पष्ट रूप से होस्टिंग वातावरण के आधार पर एक अलग व्यवहार है।

0

मेरे पास इस मुद्दे के लिए एक और परिदृश्य है, भले ही मैंने ऑपरेशन संपर्क विधि पर [WebInvoke (BodyStyleBodyStyle.WrappedRequest)] जोड़ा, फिर भी यह काम नहीं करता है, मुझे पता चला कि यह पोस्ट मेरी समस्या का समाधान कर रहा है। http://www.codemeit.com/wcf/wcf-restful-pox-json-and-soap-coexist.html

क्या हम क्या करने के लिए बस सेवा संदर्भ जोड़ने के बाद फ़ाइल "reference.cs" उत्पन्न का पता लगाने की जरूरत है। खोजशब्द कीवर्ड: क्लाइंट प्रोजेक्ट के भीतर "सार्वजनिक इंटरफ़ेस ITestService", आपको सेवा अनुबंध मिलेगा, ऑपरेशन कंट्रैक्ट के शीर्ष पर [System.ServiceModel.Web.WebGet] जोड़ें।

इसलिए मैंने क्लाइंट साइड के प्रॉक्सी क्लास पर ओप्रेशन कंट्रैक्ट के शीर्ष पर [System.ServiceModel.Web.WebGet] जोड़ा था, यह काम करता है।

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