2010-02-12 66 views
7

我正在嘗試創建一個簡單的ConsoleApplication,其中我想託管一個簡單的wcf服務。在控制檯上託管一個簡單的Wcf服務

這裏以後,我加入一個app.config它看起來像這樣爲我

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(); 
      } 
     } 
    } 
} 

代碼:

<?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是 未處理消息=「找不到 b該地址匹配方案http 用於具有綁定的端點 MetadataExchangeHttpBinding。 註冊的基址方案是 [的net.tcp]「
源= 「System.ServiceModel」
堆棧跟蹤: 在System.ServiceModel.ServiceHostBase.MakeAbsoluteUri(URI relativeOrAbsoluteUri,綁定 結合,UriSchemeKeyedCollection baseAddresses) 在System.ServiceModel.Description.ConfigLoader.LoadServiceDescription(ServiceHostBase 主機,ServiceDescription描述, serviceElement serviceElement, Action`1 addBaseAddress) 在System.ServiceModel.ServiceHostBase.LoadConfigurationSectionInternal(ConfigLoader configLoader,ServiceDescription 描述,ServiceElement serviceSection) 在System.ServiceModel.ServiceHostBase.LoadConfigurationSectionInternal(ConfigLoader configLoader,在System.ServiceModel.ServiceHostBase.ApplyConfiguration() ServiceDescription 描述,字符串configurationName) 在System.ServiceModel.ServiceHostBase .InitializeDescription(UriSchemeKeyedCollection baseAddresses) 在System.ServiceModel.ServiceHost.InitializeDescription(類型 的serviceType,UriSchemeKeyedCollection baseAddresses) 在System.ServiceModel.ServiceHost..ctor(類型 的serviceType, URI [] baseAddresses) 在HostConsoleApplication.Program.Main(字符串[] 參數)在C:\ Documents和 設置\ navin.pathuru \我 文檔\的Visual Studio 2008 \項目\溶液2 \ HostConsoleApplication \ Program.cs的:在System.AppDomain._nExecuteAssembly線(大會 組件,字串[] args) 在System.AppDomain.ExecuteAssembly(字符串 assemblyFile,證據 assemblySecurity,字串[] args) 在Microsoft.VisualStudio.HostingProcess。 HostProc.RunUsersAssembly() at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 在System.Threading.ExecutionContext.Run(ExecutionContext中 的ExecutionContext,ContextCallback 回調,對象狀態) 在System.Threading.ThreadHelper.ThreadStart() 的InnerException:

只是想知道如果如何解決這個問題。 感謝 ň

+0

您需要突出你的代碼和XML行,並從編輯器中使用「代碼」按鈕(101 010)工具欄以獲得良好的結果 - 格式良好並突出語法! – 2010-02-12 12:10:00

回答

15

嗯,我認爲這個問題是這樣的:

  • 你有一個基址的net.tcp
  • 你有一個MEX HTTP端點定義(但沒有HTTP基址)

基本上,如果你想使用MEX通過HTTP,你需要爲MEX端點,或HTTP基址提供無論是完整的地址(如果你只指定一個relativ e地址)。

解決方案1:指定完整地址MEX端點:

<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:定義一個HTTP基地址,也:

<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:使用mexTcpBinding代替

<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

非常好,謝謝Mark。 我已經添加了另一個控制檯應用程序作爲此解決方案的客戶端。 你能告訴我如何使用ConsoleHost中的這個服務嗎? 謝謝 N – 2010-02-12 14:08:39

+0

使用cmd.exe中的服務啓動您的第一個控制檯;然後轉到Visual Studio,然後在客戶端控制檯應用程序中,從解決方案資源管理器上下文菜單中選擇「添加服務引用」,然後鍵入(或粘貼)服務運行的URL - 然後發現該服務並創建必要的客戶端位供您使用。 – 2010-02-12 16:04:30