2011-03-11 38 views
11

我跟着this MSDN article徹底創建託管在NT服務中的WCF服務。「服務X沒有應用程序端點」,除非我在代碼中添加端點 - 爲什麼?

當我點擊服務控制檯「開始」,然後我看到在事件查看器中以下內容:

服務無法啓動。 System.InvalidOperationException:服務'MyServiceNamespace.RequestProcessorImpl'沒有應用程序(非基礎設施)端點。這可能是因爲沒有爲您的應用程序找到配置文件,或者因爲在配置文件中找不到匹配服務名稱的服務元素,或者因爲服務元素中沒有定義端點。

我試圖檢查所有可能的原因,我可以找到。下面是app.config文件中的服務描述:

<service name="MyServiceNamespace.RequestProcessorWindowsService" 
      behaviorConfiguration="RequestProcessorServiceBehavior"> 
    <host> 
     <baseAddresses> 
     <add baseAddress="http://localhost:8095/RequestProcessorService"/> 
     </baseAddresses> 
    </host> 
    <endpoint address= "" 
       binding="wsHttpBinding" 
       contract="MyServiceNamespace.IRequestProcessor" /> 
    <endpoint address="mex" 
       binding="mexHttpBinding" 
       contract="IMetadataExchange" /> 
    </service> 

所有實體named with their namespaces,所以這不是問題。 App.Config文件放置在bin \ Debug中 - 確切地說,NT服務從哪裏開始。

但是,當我改變我的ServiceBase後裔OnStart()從原來的實現:

public class RequestProcessorWindowsService : ServiceBase { 
    public ServiceHost serviceHost = null; 
    //other methods skipped 
    protected override void OnStart(string[] args) 
    { 
     if(serviceHost != null) { 
     serviceHost.Close(); 
     } 
     serviceHost = new ServiceHost(typeof(RequestProcesssorImpl)); 
     serviceHost.Open(); 
    } 
} 

下列之一,所以它調用AddServiceEndpoint()服務啓動好(但我不能添加引用它,所以我想遇到其他問題):

public class RequestProcessorWindowsService : ServiceBase { 
    public ServiceHost serviceHost = null; 
    //other methods skipped 
    protected override void OnStart(string[] args) 
    { 
     if(serviceHost != null) { 
     serviceHost.Close(); 
     } 
     Uri baseAddress = new Uri("http://localhost:8095/RequestProcessorService"); 
     serviceHost = new ServiceHost(typeof(RequestProcesssorImpl), baseAddress); 
     serviceHost.AddServiceEndpoint(typeof(IRequestProcessor), new BasicHttpBinding(), baseAddress); 
     serviceHost.Open(); 
    } 
} 

爲什麼通過App.Config中配置的時候不是我的服務啓動?

+0

您可以發佈相同的OnStart()與錯誤投擲? – 2011-03-11 09:34:38

+0

@Vincent Vancalbergh:完成。 – sharptooth 2011-03-11 09:56:29

回答

15

配置文件中的服務名稱與服務實現類不匹配。

配置文件應包含:

<service name="MyServiceNamespace.RequestProcesssorImpl" 
+0

好吧,我試過了,它完全解決了我的問題,我甚至可以從另一個項目添加對我的WCF服務的引用。非常感謝你。 – sharptooth 2011-03-11 10:20:01

+0

始終把實施服務合同的班級。這是唯一從WCF主機角度來看的問題。 – 2011-03-11 10:27:07

+0

+1指出這個:) – 2011-11-15 19:45:12

相關問題