2010-02-12 19 views
7

में एक सरल डब्ल्यूसीएफ सेवा को होस्ट करना मैं एक साधारण कंसोल एप्लीकेशन बनाने की कोशिश कर रहा हूं जिसमें मैं एक साधारण डब्ल्यूसीएफ सेवा होस्ट करना चाहता हूं।कंसोल

यहाँ मेरी

namespace HostConsoleApplication 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      using (System.ServiceModel.ServiceHost host = new System.ServiceModel.ServiceHost(typeof(FirstWcfService.Service))) 
      { 
       host.Open(); 
       Console.WriteLine("Sai"); 
       Console.ReadLine(); 
      } 
     } 
    } 
} 

के लिए कोड तो मैं एक app.config जो इस तरह दिखता है जोड़ लिया है है:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel> 
     <services> 
      <service name="FirstWcfService.Service" behaviorConfiguration="ServiceBehavior"> 
       <endpoint address="FirstWcfService" binding="netTcpBinding" contract="FirstWcfService.IService"/> 
       <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" /> 
       <host> 
        <baseAddresses> 
         <add baseAddress="net.tcp://localhost:9101/"/> 
        </baseAddresses> 
       </host> 
      </service> 
     </services> 
     <behaviors> 
      <serviceBehaviors> 
       <behavior name="ServiceBehavior" > 
        <serviceMetadata httpGetEnabled="false" /> 
       </behavior> 
      </serviceBehaviors> 
     </behaviors> 
    </system.serviceModel> 
</configuration> 

जब मैं मेजबान कंसोल अनुप्रयोग चलाने मैं इस अपवाद:

System.InvalidOperationException था = "नहीं मिल सका एक ख बिना क्रिया संदेश ASE पता जो मेटाडाटा एक्सचेंज एचटीपी बाइंडिंग बाध्यकारी के साथ एंडपॉइंट के लिए योजना http से मेल खाता है। पंजीकृत आधार पते योजनाओं [net.tcp] कर रहे हैं "
स्रोत =" System.ServiceModel "
StackTrace:। ​​System.ServiceModel.ServiceHostBase.MakeAbsoluteUri पर (उरी relativeOrAbsoluteUri, बंधन, UriSchemeKeyedCollection baseAddresses बाइंडिंग) System.ServiceModel.Description.ConfigLoader.LoadServiceDescription (ServiceHostBase मेजबान, ServiceDescription विवरण, serviceElement serviceElement, Action`1 addBaseAddress) System.ServiceModel.ServiceHostBase.LoadConfigurationSectionInternal पर (ConfigLoaderपर 63,210 configLoader, ServiceDescription विवरण, ServiceElement serviceSection) System.ServiceModel.ServiceHostBase.LoadConfigurationSectionInternal पर (ConfigLoader configLoader, System.ServiceModel.ServiceHostBase पर ServiceDescription विवरण, स्ट्रिंग configurationName) System.ServiceModel.ServiceHostBase.ApplyConfiguration() पर .InitializeDescription System.ServiceModel.ServiceHost..ctor पर System.ServiceModel.ServiceHost.InitializeDescription पर (UriSchemeKeyedCollection baseAddresses) (प्रकार ServiceType, UriSchemeKeyedCollection baseAddresses) (प्रकार ServiceType, उरी [] baseAddresses) HostConsoleApplication.Program.Main (स्ट्रिंग पर [] args) सी में: \ दस्तावेज़ और सेटिंग्स \ navin.pathuru \ मेरे Documents \ दृश्य स्टूडियो 2008 \ परियोजनाओं \ Solution2 \ HostConsoleApplication \ Program.cs : लाइन System.AppDomain._nExecuteAssembly पर (विधानसभा विधानसभा, स्ट्रिंग [] args) System.AppDomain.ExecuteAssembly पर (स्ट्रिंग assemblyFile, साक्ष्य assemblySecurity, स्ट्रिंग [] args) Microsoft.VisualStudio.HostingProcess पर। HostProc.RunUsersAssembly() सिस्टम पर। थ्रेडिंग। थ्रेडहेल्पर। थ्रेडस्टार्ट_Context (ऑब्जेक्ट राज्य) System.Threading.ExecutionContext.Run पर (ExecutionContext executionContext, ContextCallback कॉलबैक, राज्य वस्तु) System.Threading.ThreadHelper.ThreadStart पर () InnerException:

बस अगर यह कैसे तय करने के लिए सोच रहा। धन्यवाद एन

+0

आप कोड और एक्सएमएल के अपने लाइनों पर प्रकाश डाला और संपादक से "कोड" बटन (101 010) उपयोग करने की आवश्यकता अच्छे परिणाम प्राप्त करने के लिए टूलबार - अच्छी तरह से स्वरूपित और वाक्यविन्यास हाइलाइट किया गया! –

उत्तर

15

ठीक है, मुझे लगता है कि समस्या यह है:

  • आप net.tcp
  • के लिए एक आधार का पता है आप एक MEX http endpoint परिभाषित (लेकिन कोई http आधार पता) है

मूल रूप से आप http अधिक MEX उपयोग करना चाहते हैं, तो आप MEX समाप्ति बिंदु, या एक http आधार पते के लिए एक पूरा पता आपूर्ति करने के लिए या तो यदि आप केवल एक relativ निर्दिष्ट की जरूरत है (ई पता)।

समाधान 1: भी एक HTTP आधार पते को परिभाषित,:

<services> 
    <service name="FirstWcfService.Service" 
       behaviorConfiguration="ServiceBehavior"> 
     <endpoint 
      address="FirstWcfService" 
      binding="netTcpBinding" 
      contract="FirstWcfService.IService"/> 
     <endpoint 
      address="http://localhost:9102/FirstWcfService/mex" 
      binding="mexHttpBinding" 
      contract="IMetadataExchange" /> 
     ...... 
    </service> 
</services> 

समाधान 2:

<services> 
    <service name="FirstWcfService.Service" 
       behaviorConfiguration="ServiceBehavior"> 
     <endpoint 
      address="FirstWcfService" 
      binding="netTcpBinding" 
      contract="FirstWcfService.IService"/> 
     <endpoint 
      address="mex" 
      binding="mexHttpBinding" 
      contract="IMetadataExchange" /> 
     <host> 
      <baseAddresses> 
       <add baseAddress="net.tcp://localhost:9101/"/> 
       <add baseAddress="http://localhost:9102/"/> 
      </baseAddresses> 
     </host> 
    </service> 
</services> 

समाधान 3: MEX endpoint के लिए एक पूर्ण पता निर्दिष्ट इसके बजाय mexTcp बाइंडिंग का उपयोग करें

<services> 
    <service name="FirstWcfService.Service" 
       behaviorConfiguration="ServiceBehavior"> 
     <endpoint 
      address="FirstWcfService" 
      binding="netTcpBinding" 
      contract="FirstWcfService.IService"/> 
     <endpoint 
      address="mex" 
      binding="mexTcpBinding" 
      contract="IMetadataExchange" /> 
     ...... 
    </service> 
</services> 

इनमें से किसी भी तीन विकल्पों को हल करना चाहिए।

सावधानी का एक शब्द है: मैं इसे काफी आपकी सेवा व्यवहार विन्यास "ServiceBehavior" कॉल करने के लिए जोखिम भरा लगता है ......

<serviceBehaviors> 
    <behavior name="ServiceBehavior" > 

मेरे सिफारिश: अपने पहले और डिफ़ॉल्ट configuation सादे "डिफ़ॉल्ट" फोन (या "DefaultBehavior")

<serviceBehaviors> 
    <behavior name="Default" > 

और केवल दूसरे के नाम देने से शुरू यदि आप कई विन्यास है।

कॉलिंग इस ServiceBehavior बस पर बाद में कुछ समय मुसीबत के लिए पूछ रहा प्रतीत हो रहा है .....

+0

उत्कृष्ट, धन्यवाद मार्क। मैंने इस समाधान के लिए एक ग्राहक के रूप में एक और कंसोल ऐप जोड़ा है। क्या आप मुझे बता सकते हैं कि ConsoleHost में इस सेवा का उपभोग कैसे करें। धन्यवाद एन –

+0

cmd.exe से सेवा के साथ अपना पहला कंसोल लॉन्च करें; फिर विजुअल स्टूडियो पर जाएं, और अपने क्लाइंट कंसोल ऐप में, समाधान एक्सप्लोरर संदर्भ मेनू से "सेवा संदर्भ जोड़ें" चुनें, और उस URL को टाइप करें (या पेस्ट करें) जहां आपकी सेवा चलती है - जिसे उस सेवा को खोजना चाहिए और उसे बनाना चाहिए इसका उपयोग करने के लिए आवश्यक क्लाइंट-साइड बिट्स। –