2012-04-17 235 views
3

我試圖在Windows 2008 R2服務器上託管WCF服務作爲Windows服務。我遵循了msdn提供的指導(found here)。只要所有東西都是Visual Studio中同一解決方案的一部分,一切都可以正常工作。但是,我試圖在不同的解決方案中創建客戶端(在同一臺機器上),並且找不到該服務。我收到下面顯示的「添加服務引用錯誤」。Windows服務託管的TCP WCF服務

enter image description here

我的目標是能夠遠程訪問WCF服務,但我似乎無法連本地訪問它,除非客戶在同一客戶端中創建。是否有任何指導,教程或有幫助的提示,任何人都可以讓我得到這個工作?

更新: 看來,即使Windows服務正在運行,WCF服務似乎沒有監聽任何端口。這表明它沒有運行。這也解釋了爲什麼每個人的第一個想法我沒有運行服務。我認爲,自Windows服務運行並且相同的解決方案客戶端工作以來,WCF服務也運行良好。事實證明,當我運行相同的解決方案客戶端時,Visual Studio正在啓動一個WCF服務。

那麼,爲什麼不啓動WCF服務的Windows服務?有任何想法嗎?

+0

嘗試添加服務引用時是否運行該服務? – 2012-04-17 15:13:28

+0

是的,如上所述,我已經完成了本教程中解釋的所有工作,其中包括啓動服務。 – 2012-04-17 16:07:08

+0

沒錯,但是當你嘗試從你的新客戶端添加服務引用時,你是否有實際運行的服務? – 2012-04-17 16:09:52

回答

6

事實證明,有與MSDN提供的教程的一個問題(在上面的問題提供)。他們將Windows服務和WCF服務Service1命名爲兩者的默認名稱。

Windows服務假設啓動WCF服務,但是,它實際上是試圖再次啓動自己,因爲這兩個服務具有相同的名稱。

myServiceHost = new ServiceHost(typeof(Service1)); 

若要解決此問題,您可以重命名其中一個服務或完全限定在Windows服務中引用WCF服務時。

myServiceHost = new ServiceHost(typeof(WcfServiceLibrary1.Service1)); 

有趣的是,仍然提供的代碼看起來像它的作品,因爲Visual Studio是足夠聰明,發現了WCF服務沒有運行,並且啓動一個實例在背後。

這是一個簡單的bug修復,但由於Visual Studio隱藏了我的問題,我不認爲沒有Espen Burud的幫助我會找到它。

+0

好找!非常微妙。 – 2012-04-18 16:44:24

3

有兩種方式添加服務引用,以瞭解服務:

Discover按鈕:搜索在當前解決方案的項目。
Go按鈕:連接到地址框中的服務並檢索元數據。

在點擊Go之前,您需要確實已經有服務在運行。

編輯

我只是從你的截圖,你試圖連接到一個URL的net.tcp注意到。我認爲在MEX上使用http更常見。你的app.config看起來是這樣的:

<services> 
    <service behaviorConfiguration="WcfServiceLibrary1.Service1Behavior" 
    name="WcfServiceLibrary1.Service1"> 
    <endpoint address="" binding="netTcpBinding" bindingConfiguration="" 
     contract="WcfServiceLibrary1.IService1"> 
     <identity> 
     <dns value="localhost" /> 
     </identity> 
    </endpoint> 
    <endpoint address="mex" binding="mexTcpBinding" bindingConfiguration="" 
     contract="IMetadataExchange" /> 
    <host> 
     <baseAddresses> 
     <add baseAddress="net.tcp://localhost:8523/Service1" /> 
     <add baseAddress="http://localhost:8524/Service1" /> 
     </baseAddresses> 
    </host> 
    </service> 
</services> 

注意的HTTP基地址不同的端口號。然後,您可以在「添加服務參考」工具中使用「http:// localhost:8524/Service1」。您還應該能夠使用您的網絡瀏覽器連接到它。

允許通過HTTP GET(例如從瀏覽器)元數據交換,還需要通過行爲來啓用它:

<behaviors> 
    <serviceBehaviors> 
    <behavior> 
     <serviceMetadata httpGetEnabled="True"/> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 

我不知道,如果添加服務引用工具在乎這些。即使您不想允許http獲取訪問(httpGetEnabled =「False」),您仍然需要包含此行爲以啓用MEX(除非您以編程方式添加它)。

+0

是的,我明白這一點,但它並不能真正幫助我解決問題。 – 2012-04-17 16:09:55

+0

剛剛注意到了一些東西 - 請參閱我的編輯。 – 2012-04-17 16:39:28

+0

我在上面引用的教程中有您利用tcp的元數據交換,而無需添加http基地址。我想我可以嘗試添加一個http基地址來查看它是否有效,但我真的不想通過http訪問該服務。 – 2012-04-17 17:42:41

2

我已經測試過MSDN文章,它的工作原理沒有修改。如果服務器上啓用了防火牆,我認爲您需要爲您的服務添加一些規則。

要驗證服務正在偵聽正確的TCP端口,可以使用命令:netstat -a。如果該服務被正確的端口上偵聽,該命令將返回:

Proto Local Address   Foreign Address  State 
TCP 0.0.0.0:8523   machinename:0   LISTENING 
+0

我沒有修改也能正常工作。但是,它在相同的解決方案中創建客戶端。如果我嘗試在服務的相同解決方案之外創建客戶端,即使它在同一臺計算機上並且服務運行良好,它也無法連接到該服務。 – 2012-04-17 20:41:38

+0

它適用於我,也是當我在單獨的解決方案中創建客戶端時。 – 2012-04-17 20:49:45

+1

因此,我嘗試了你建議的'netstat'命令,並注意到即使windows服務正在運行,wcf服務似乎沒有運行。你有沒有同樣的問題?可能是我的問題? – 2012-04-18 12:44:16

0

我設法弄清楚了這個問題。我的服務並不知道端點,因爲我沒有將WCF項目中的app.config中的服務配置複製到實際的Windows服務的app.config中。一旦我做到了,它的功能正確。

儘管在WCF app.config中的評論中提到了這一點,但在原始的MSDN文章中我沒有明確說明。

相關問題