簡體   English   中英

使用從外部解決方案托管在Windows服務中的WCF服務

[英]Consuming a WCF Service that is hosted in a Windows Service from outside solution

我使用以下演練設置了在Windows服務中托管的WCF庫:

http://msdn.microsoft.com/en-us/library/ff649818.aspx

消費者winforms位於同一解決方案中,該解決方案位於我的工作PC的C:驅動器本地。

演練工作即winforms按鈕給出了正確的答案。

如果我在C-Drive上創建一個新的解決方案,其中包含一個Windows窗體項目,我無法成功添加對此運行服務的service reference ,我收到以下消息:

在此輸入圖像描述

詳細信息說明如下:

無法識別URI前綴。 元數據包含無法解析的引用:'net.tcp:// localhost:8526 / Service1'。 無法連接到net.tcp:// localhost:8526 / Service1。 連接嘗試持續時間跨度為00:00:02.0020000。 TCP錯誤代碼10061:無法建立連接,因為目標計算機主動拒絕它127.0.0.1:8526。 無法建立連接,因為目標計算機主動拒絕它127.0.0.1:8526如果在當前解決方案中定義了服務,請嘗試構建解決方案並再次添加服務引用。

為什么我可以將此服務引用添加到與服務相同的解決方案中的項目,而不是來自不同解決方案中的項目?


編輯

我的同事在MSDN文章中發現了一個錯誤 - 我在這里詳細說明了他的發現

MSDN一步一步演練文章很遺憾地結束了有趣的地方,所以讓我們繼續這里。 因為有很多可能導致錯誤,我在下面描述了幾個選項(=可能導致問題的情景),這應該有助於排除故障:

第一個選項:嘗試指定

  net.tcp://localhost:8526/Service1/mex

將服務引用添加到新客戶端時 - 確保在執行此操作之前已安裝並運行該服務。

說明:后綴“mex”代表“元數據交換”,允許Visual Studio下載WCF合同的詳細信息。 此后綴也在步驟示例中使用,它是自動添加的(如果通過右鍵單擊“配置服務引用...” 重新打開添加的服務引用 ,您將在“地址”字段中看到它)。


第二個選項:我在測試演練時注意到的是,有時右鍵單擊服務引用並在“更新服務引用”選項中選擇。

系統托盤中一段時間后,您可以看到氣球消息“您的服務已托管”。 之后,您可以在同一解決方案中啟動客戶端。 在這種情況下,服務已臨時創建但未永久部署 - 這意味着,如果停止調試,則會將其刪除。 因此,您無法從遠程PC使用此服務,它只在Visual Studio的解決方案中可見。 Visual Studio內部調用該工具

WcfSvcHost.Exe /Service:<Service1Binary> /Configuration:<Service1Config> 

使用正確的參數支持它以正確注冊服務(您可以在Visual Studio的Common7\\IDE子目錄中找到此工具,並且還有WcfTestClient.Exe可用 - 一個充當客戶端的工具,對調試WCF非常有用)。

例如,如果您已停止調試,並從Visual Studio外部的Windows資源管理器中啟動client.exe,則它找不到該服務,您將收到您在問題中描述的錯誤消息。

Microsoft在此問題上有兩個有趣的鏈接: 元數據交換發布元數據的問題

請注意,這與第3個選項中所述的部署不同


第3個選項:您是否使用過InstallUtil來部署服務? 在這種情況下,您可能會意外刪除了[...]/bin/Debug子目錄,並且服務無法啟動,因為缺少.EXE文件。

注意:如果您使用的是ServiceInstaller項目,可以避免這種情況,該項目會在注冊服務之前復制二進制文件。 或者 - 如果您想簡單地使用InstallUtil - 您可以在注冊之前將服務二進制文件復制到目標目錄(包括.config文件和.dll)。


第四個選項:如果在遠程計算機上運行該服務,則需要指定主機正確主機名或IP地址而不是localhost ,並且需要確保個人防火牆 (Windows防火牆或第三方) 不阻止端口8526 (示例中使用的端口號)。 指定例外以允許此端口用於傳入和傳出通信。


第5個和最后一個選項(UPDATE):命名沖突 - Service1是服務,但也是Wcf庫中的類名。 要么從服務中的WCF庫中完全限定您正在使用的類名,即WcfServiceLibrary1.Service1要么重命名該類。 Whytheq已經發現自己與同事和張貼在這里


更多閱讀:看看我最近發現的這篇文章:“ WCF:一些提示 ”。 它解釋了WCF的故障排除。 我對控制台托管示例的唯一更改是 a 替換 using語句

ServiceHost host = new ServiceHost(typeof(Service));
try
{
    host.Open();

    Console.WriteLine("WCF Service is ready for requests." +  
    "Press any key to close the service.");
    Console.WriteLine();
    Console.Read();

    Console.WriteLine("Closing service...");
}
finally
{
    if (host!=null) {
            host.Close();
            host=null;
    }
}

如果您想了解更多有關原因的信息,請查看此文章:“ 代理打開和關閉 ”。

您可以按如下方式解決此問題:

  • 瀏覽服務的WSDL URL並將WSDL保存到本地文件。
  • 然后對文件進行以下更改:
  • 從用於wsdl:binding的名稱中刪除名稱空間前綴,即將name =“wb:wsclocks-inboundSoapBinding”更改為name =“wsclocks-inboundSoapBinding”
  • 更改wsdl:port屬性的綁定屬性以匹配,並從name屬性的值中刪除名稱空間前綴,因此它只是wsclocks-inbound。

然后運行svcutil / o:Client \\ WBServices / noConfig

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM