我有一個小的WCF託管引擎,我正在編寫這個引擎,它將根據.config文件動態創建ServiceHosts。總體思路是允許我們在運行時刪除現有服務以及添加新服務,而不必將所有服務都脫機。ServiceHost在單元測試時的地址衝突
我遇到了一個問題單元測試,表明這可能不像聽起來那麼容易。似乎對於任何給定端點,只有一個ServiceHost可能存在(即使一個服務可能存在多個不同的服務端點)。這通常不是問題,但是當需要重新配置服務時,降低原始ServiceHost實際上並不會終止該端點地址的註冊。力圖打造另一ServiceHost的,相同的服務(這意味着使用相同的端點)失敗,出現以下異常:
System.InvalidOperationException: The ChannelDispatcher at 'net.pipe://localhost/' with contract(s) '"ITestService"' is unable to open its IChannelListener. --->
System.InvalidOperationException: A registration already exists for URI 'net.pipe://localhost/'.
我的單元測試過程中實際遇到的錯誤。測試將運行一個單元,它儘可能地完全關閉ServiceHosts和託管引擎。然後創建另一個託管引擎實例,該實例會嘗試再次爲不同的測試重新創建相同的ServiceHosts。第二個測試遇到上述錯誤。我猜測,雖然ServiceHost.Close()被調用,但實際上並沒有破壞服務主機...所以它仍然在內存中。我不知道GC是否正在清理舊服務主機......問題在最初發生後仍然沒有消失(盡我所能確定...至今我已經等了大約30分鐘了。 )
爲system.serviceModel我的配置文件如下:
<system.serviceModel>
<services>
<service name="Campus.Core.ServiceModel.TestServiceStub">
<endpoint
address="net.pipe://localhost"
binding="netNamedPipeBinding"
contract="Campus.Core.ServiceModel.ITestService"
/>
</service>
</services>
</system.serviceModel>
我遇到了同樣的問題。你從那以後能解決嗎? – Elan 2009-10-31 03:41:35
一年前我偶然發現了這個問題。我沒有代碼了,但我找到了一種通過代碼以編程方式託管服務的方法,這使我可以在單元測試中運行時更改端口。我希望以任何方式幫助你。 – 2014-04-25 18:21:02