2011-05-20 145 views
13

我有一個託管在Windows服務中的WCF服務。 Windows服務有OnStart方法是這樣的:在Windows服務中託管WCF服務的問題

protected override void OnStart(string[] args) 
{ 
    serviceHost = new ServiceHost(typeof (RouterService)); 
    serviceHost.Open(); 
} 

這是相當小了,因爲我試圖找到問題。由於我沒有在這裏進行任何錯誤處理,所以此時的任何異常都應該阻止服務正常啓動。它會開始,然後立即再次自動停止。

的WCF服務我的配置文件看起來是這樣的:

<?xml version="1.0"?> 
<configuration> 
    <startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> 
    </startup> 
    <system.serviceModel> 
    <services> 
     <service name="WcfService.RouterService" 
       behaviorConfiguration="serviceBehavior" > 
     <endpoint address="RouterService" contract="WcfService.IRouterService" binding="wsHttpBinding" bindingConfiguration="NoSecurity" /> 
     <endpoint address="mex" contract="IMetadataExchange" binding="mexHttpBinding" /> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://localhost:8000"/> 
      </baseAddresses> 
     </host> 
     </service> 
    </services> 
    <bindings> 
     <wsHttpBinding> 
     <binding name="NoSecurity"> 
      <security mode="None" /> 
     </binding> 
     </wsHttpBinding> 
    </bindings> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="serviceBehavior" > 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 
</configuration> 

此外,我已經添加了網絡服務用戶(誰的服務正在運行,以能夠在指定的端口監聽HTTP :現在

netsh http add urlacl url=http://+:8000/ user="NETWORK SERVICE" 

,在客戶端,我選擇Add Service Reference我能找到服務器,VS還可以管理創建配置,使代理文件,然後在客戶端裏面,我做代理的實例,並打開它,一切仍然正常,但在c代理第一種方法,我得到以下例外:

位於http://localhost:8000/RouterService的HTTP服務太忙了。

我知道,我的客戶是試圖連接到該服務的唯一的事情,所以爲什麼我得到這個錯誤信息呢?我該如何解決這個問題?它在嘗試調用方法時沒有超時,它幾乎立即拋出異常。

編輯

好了,現在我發現我的TESTSERVER(非Windows客戶端,而是一個控制檯應用程序)也給出了同樣的錯誤。今天早些時候它沒有,WCF服務或測試服務器都沒有改變。

然後我試着將端口更改爲8080而不是8000,並且工作正常。然後我試圖爲Windows服務相同,而且還曾

所以出事了HTTP上由於某種原因端口8000(運行新的端口上netsh http命令後)。當然我也試過重新啓動系統。

這讓我感到困惑,所以如果任何人有任何想法在這裏發生了什麼,我將不勝感激。

+0

你的服務返回什麼類型?我在服務中看到這個問題,返回無法序列化的類型。這也可能是服務主機的應用程序池無法啓動或類似的問題。 – Henric 2011-05-20 11:24:27

+1

我同意@daft,由於序列化問題,該服務可能無法返回數據類型。應用程序池(如果適用)不應該擔心,因爲它是服務於wsdl/config的同一個池(至少在IIS中),它允許您生成代理類(您已成功完成該代理類)。 – Smudge202 2011-05-20 11:37:23

+0

+1來澄清應用程序池問題。感謝塗抹。 – Henric 2011-05-20 11:40:33

回答

13

好吧,經過很長時間的試圖弄清楚這裏發生了什麼,我找到了解決方案。

我創建了Windows服務,並試圖啓動它,我不能因爲我不得不註冊NETWORK SERVICE用戶首先在http post 8000上監聽。所以我跑這個命令:

的netsh的http添加urlacl URL = HTTP:// +:8000/RouterService用戶= 「網絡服務」

它給了一個成功的結果,但後來我試着開始該服務,並得到相同的錯誤信息。然後我跑不RouterService指定相同的命令:

的netsh的http添加urlacl URL = HTTP:// +:8000 /用戶= 「網絡服務」

它給了一個成功的結果,現在我的窗戶服務啓動沒有任何問題,但我得到了上述問題中提到的問題。

看來第一次調用netsh會導致所有這些問題。我試圖用這個命令再次將其取出:

netsh的HTTP刪除urlacl URL = HTTP:// +:8000/RouterService

然後一切都工作正常。

調試這一點,因爲異常無關,與實際問題的母狗,所以我希望這個問題可以節省別人一兩個小時:)

4

繼@島之風 - 克諾布洛赫-Bråthen如此闡述的答案考慮要使用衆所周知的SID字符串而不是「用戶」命令行鍵,這會給你跨文化的可移植性(我在法語本地化的Win7機器上遇到過問題)。欲瞭解更多信息,請參閱SID strings。對於你的情況,這將是:

的netsh的http添加urlacl URL = HTTP:// +:8000/SDDL = 「○:NS」

a link to SDDL on MSDN

相關問題