2010-02-11 20 views
6

मैं वेब सेवाओं के लिए एक संदर्भ के साथ एक DLL (मैं ऐसा करने के लिए विकल्प नहीं है) बना रहा हूं में एक वेब सेवा संदर्भ जोड़ने के लिए कैसे, लेकिन मैं इस परियोजना का उपयोग करता है करने के लिए वेब सेवा संदर्भ जोड़ने के लिए काम करने के लिए डीएलएल।एक DLL

उदाहरण के लिए, मैं DLL API.DLL कहा जाता है कि एक वेब सेवा WebService.svc कहा जाता है कि मैं एक परियोजना WinForm कहा जाता है में उपयोग करना चाहते हैं कॉल कर सकते है। सबसे पहले, मुझे API.DLL में WebService.svc में "सेवा संदर्भ" जोड़ना होगा। फिर, मैं WinForm में एक संदर्भ API.DLL जोड़ता हूं लेकिन यह तब तक काम नहीं करता जब तक कि मैं WinForm में WebService.svc के लिए सेवा संदर्भ भी जोड़ता हूं।

अंतिम चरण से बचने के लिए मैं क्या कर सकता हूं?

+1

मदद करता है आपको WinForm में सेवा संदर्भ जोड़ने की आवश्यकता नहीं है ... आप क्या त्रुटि देख रहे हैं? –

+0

System.InvalidOperationException मेरा .NET फ्रेंच में है (... sigh ...) लेकिन ऐसा कुछ कहता है "सेवा संदर्भ नहीं मिला"। – dsimard

उत्तर

6

आपका पहला कदम यह साबित करना है कि यह संभव है और फिर अपनी परियोजना को अनुकूलित करें।

आप रननेबल समाधान here डाउनलोड कर सकते हैं।

मैं बस चरणों के माध्यम से चला गया और अपने इच्छित परिणामों का उत्पादन करने के लिए अपने कार्यों की गणना की।

 
    Create a web app project (an thus a solution) named 'ReferencedWebService' 
    Add a web service, just leave the default name and implementation 
    Add a class library named 'ReferencedWebserviceAPI' 
     Add Service Reference 
      >Advanced 
       >Add Web Reference>Web services in this solution 
        >WebService1 
         >Add reference leaving name as 'localhost' 
    Add a console application project named 'ReferencedWebserviceClient'  
    To ReferencedWebserviceClient: 
     Add Reference 
      >Projects 
       >ReferencedWebserviceAPI 
     Add Reference 
      >.Net 
       >System.Web.Services 

    In Program.cs replace Main: 

    static void Main(string[] args) 
    { 
     var svc = new ReferencedWebserviceAPI.localhost.WebService1(); 
     var result = svc.HelloWorld(); 
     Console.WriteLine(result); 
     Console.ReadLine(); 
    } 


    Set ReferencedWebserviceClient as startup project and run. 

    Ok, this is simplest scenario. One issue you will have to deal with is that the default Service URL is hardcoded in the .dll, 
    and it is set to a ported address on your dev machine. 

    You will want to add a configuration parameter to your client project. The simplest and most portable way is to use an appSetting. 

    To ReferencedWebserviceClient: 
     Add Item 
      >Application Configuration File 

    Replace contents of App.Config with this, of course replace the value with the appropriate value on your machine. 

    
    
     
     
     
    


     Add Reference 
      >.Net 
       >System.Configuration 

    Now replace Main with this: 

    static void Main(string[] args) 
    { 
     var svc = new ReferencedWebserviceAPI.localhost.WebService1 
         { 
          Url = ConfigurationManager.AppSettings["serviceUrl"] 
         }; 
     var result = svc.HelloWorld(); 
     Console.WriteLine(result); 
     Console.ReadLine(); 
    } 

यह एक पुनर्वितरण .dll में सेवाएं एम्बेड करने के लिए आधारभूत है।

इस मॉडल को अपने वर्तमान प्रोजेक्ट पर लागू करने का प्रयास करें और देखें कि यह आपके लिए कैसे काम करता है।

यदि आपको अभी भी समस्याएं हैं, तो आपको निश्चित रूप से एक संदर्भ समस्या है और इसे उस परिप्रेक्ष्य से देखना शुरू कर देना चाहिए।

आशा है कि यह

1

ऐसा इसलिए है क्योंकि आपको सेवा संदर्भ की आवश्यकता है ताकि WinForm ऐप आपकी सेवा द्वारा लौटाए गए प्रकारों का संदर्भ दे सके?

अगर ऐसी बात है, तो आप सेवा के लिए एक आवरण में अपने एपीआई dll बदल सकता है, और सभी तरीकों एपीआई में सेवा पर उपलब्ध लपेट, और (यह मानते हुए कि वे clases आप कर रहे हैं वस्तुओं के लिए भी ऐसा ही बनाया था)। जाहिर है, आपको एपीआई में ऑब्जेक्ट्स में सेवा लौटने वाली सभी ऑब्जेक्ट्स को कनवर्ट करना होगा। लेकिन एक बार ऐसा करने के बाद, आपको WinForm में सेवा का संदर्भ देने की आवश्यकता नहीं है। (मज़ेदार रूप से पर्याप्त, मैं कुछ ऐसा ही करने के बीच में हूं!)।

+0

वास्तव में, मेरी API.dll उस त्रुटि से बचने के लिए सीधे webservice से किसी भी प्रकार को वापस नहीं करता है। ऐसा लगता है कि डीएलएल मेजबान प्रोजेक्ट से सेवा संदर्भों का उपयोग करता है, न कि स्वयं से। – dsimard

+0

ठीक है, मैं उलझन में हूँ! यदि आप एक नई परियोजना बनाते हैं और अपने API.dll का संदर्भ देते हैं तो क्या होता है? क्या आपको वही त्रुटि मिलती है? –

+0

हां, मुझे यह त्रुटि है यदि मैं वेब सेवा के संदर्भ भी नहीं जोड़ता हूं। मुझे लगता है कि यह सभी ऑटो-जेनरेटेड कक्षाओं के कारण डीएलएल का पालन नहीं करता है। – dsimard

5

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

एक प्रकार वेब संदर्भ द्वारा उजागर का उपयोग कर के संबंध में, मैं अगर यह एक मुद्दा आप अनुभव कर रहे हो सकता है यकीन नहीं है। मुझे डीएलएल में इस तरह की चीज का सामना करना पड़ा है। उदाहरण के लिए, SharpMap.dll एक SharpMapData वर्ग वाणी, और WrapperOfSharpMap.dll एक विधि ProcessData(SharpMapData blah)

कहा जाता है अगर मैं एक WinForm आवेदन लिखने और WrapperOfSharpMap.dll के लिए एक संदर्भ जोड़ने की है, मैं भी SharpMap.dll के लिए एक संदर्भ जोड़ने के लिए क्योंकि ProcessData पर कॉल करने के लिए मुझे फ़ंक्शन को पास करने के लिए SharpMapData उदाहरण बनाना होगा। दूसरे शब्दों में, मैं SharpMap.dll में घोषित एक प्रकार का उपयोग कर रहा हूं, इसलिए इसके संदर्भ की आवश्यकता है।

इस समस्या को हल करने के लिए, WrapperOfSharpMap.dll के निर्माता तो जैसे एक WrapperSharpMapData वर्ग बनाना चाहिए:

class WrapperSharpMapData 
{ 
    private SharpMapData hiddenSharpMapData; 

    //create proprerties to access data elements using standard CLR types or other wrapper types 
} 
+0

मुझे लगता है कि समस्या वास्तव में है क्योंकि मुझे WinForm में वेब सेवा का संदर्भ देना है, लेकिन मुझे वह कदम नहीं चाहिए। मैं डेवलपर को डीएलएल का संदर्भ देना चाहता हूं और वेब सेवा को स्वचालित रूप से संदर्भित किया जाएगा। मैं उसे कैसे कर सकता हूँ? – dsimard

+0

@ डैन, नहीं, आप नहीं करते हैं। कुछ और गलत है। –

+0

@dan वेब सेवा के संदर्भ को जोड़ने के बिना WinForm को वेब सेवा से कनेक्ट करने के लिए कॉन्फ़िगरेशन जानकारी कैसे प्राप्त होगी? जब आप कोई वेब संदर्भ जोड़ते हैं तो अपनी कॉन्फ़िगरेशन फ़ाइल के साथ क्या होता है देखें। डीएलएल से कॉन्फ़िगर सेटिंग्स किसी भी तरह से EXE को प्रभावित नहीं करती है। – AaronLS

1

आप आप अपनी सेवा के लिए ग्राहक के पक्ष प्रॉक्सी कोड उत्पन्न करने के लिए अनुमति देता है जो svcutil.exe ध्यान देने का प्रयास कर सकता है, कमांड लाइन के माध्यम से। आपको उस कोड फ़ाइल को लेने में सक्षम होना चाहिए जो इसे उत्पन्न करता है और इसे अपने डीएलएल प्रोजेक्ट में जोड़ता है। यह आपको विजुअल स्टूडियो को पूरी तरह से बाईपास करने देता है।