2009-09-11 46 views
1

我有一個小的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> 
+0

我遇到了同樣的問題。你從那以後能解決嗎? – Elan 2009-10-31 03:41:35

+0

一年前我偶然發現了這個問題。我沒有代碼了,但我找到了一種通過代碼以編程方式託管服務的方法,這使我可以在單元測試中運行時更改端口。我希望以任何方式幫助你。 – 2014-04-25 18:21:02

回答

3

爲了回答這個問題,以防其他人遇到問題。實際上原因是這個問題的兩個原因,如下所示:

1)在單元測試期間,如果遇到異常,通常會在ServiceHost關閉之前跳出正在測試的代碼。這將ServiceHost綁定到特定的端點。這導致所有後續測試都失敗了,並且執行了相同的一段代碼。正如我在用SubSpec和xUnit進行BDD時,單個測試用例(關於BDD術語)執行了單個每個測試的斷言,一個測試用例可能包含多達12個或更多的斷言。

2)當心MEX終點。 MEX端點每個服務只能存在一次。最初,我創建了一個http和net.tcp mex端點。然而,這導致了一個問題,因爲MEX端點第二個啓動的實例發生了異常。一般來說,如果你使用MEX端點,HTTP是最有用的協議,除非有一些物理基礎設施問題阻止你這樣做。

一般而言,在ServiceHost上調用Close()方法將完全解除綁定它,允許先前綁定到其端點的任何地址再次可用。有時候關閉可能需要一段時間,在極少數情況下,可能會拋出異常。如果您使用SubSpec進行BDD並遵循每個測試的單個斷言規則,則在一個測試中拋出的異常會阻止ServiceHosts關閉,這將導致所有後續測試失敗。

1

一個答案是每次旋轉一個時間一個GUID追加到URL的服務主機,並使用一個工廠的辦法,都會將ServiceHost實例加速並返回客戶端通道,以便客戶端知道要使用哪個URL。

■設計的InProcFactory示例使用這種方法,所以你可以使用它作爲-是:

http://www.idesign.net/idesign/DesktopDefault.aspx?tabindex=5&tabid=11

請注意,你必須與■設計的網站上註冊,以下載示例,他們會偶爾向你發送關於培訓等的聲明,但這不是太多。

+0

我們的URL不能自動生成,因爲它們是明確定義的。我們使用我們的URL作爲版本控制策略的一部分。我們的服務也被多個平臺使用,不僅僅是.NET,所以我們並不總是能夠控制客戶端。 :( – jrista 2009-09-11 21:59:55

相關問題