2010-04-12 50 views
4

對於一些測試代碼,我希望能夠在幾行內容中託管一個WCF服務。我想我會寫一個簡單的託管類:這是託管WCF服務的正確方法嗎?

public class WcfHost<Implementation, Contract> : IDisposable 
    where Implementation : class 
    where Contract : class 
{ 
    public readonly string Address = "net.tcp://localhost:8000/"; 
    private ServiceHost _Host; 

    public WcfHost() 
    { 
     _Host = new ServiceHost (typeof (Implementation)); 

     var binding = new NetTcpBinding(); 
     var address = new Uri (Address); 

     _Host.AddServiceEndpoint (
      typeof (Contract), 
      binding, 
      address); 
     _Host.Open(); 
    } 

    public void Dispose() 
    { 
     ((IDisposable) _Host).Dispose(); 
    } 
} 

這可以這樣使用:

using (var host = new WcfHost<ImplementationClass, ContractClass>()) { 

有什麼不對這種方法?代碼中是否存在缺陷(特別是關於處置)?

回答

5

如果主機處於「故障」狀態,主機的Dispose方法可能會引發異常。如果發生這種情況,當原始異常丟失時,您不會看到實際發生了什麼問題。對於測試代碼來說,這可能不是一個問題,但如果你試圖弄清楚爲什麼某些東西不起作用,它仍然可能是你的方式。

我沒有測試,但下面應該在你的Dispose方法是確定:

if (_Host.State == CommunicationState.Faulted) 
{ 
    _Host.Abort(); 
} 
else 
{ 
    _Host.Close(); 
} 
+0

是的,我聽說過這個問題。所以我認爲這適用於這種情況。 – mafu 2010-04-12 14:29:38

+0

是的,我必須找出困難的方式,這個問題不僅適用於客戶端,但也適用於主機... – 2010-04-12 14:41:34

0

如果您對固定綁定和服務器地址的限制確定,這對我來說似乎很好。

只要您希望主機可用,您必須確保using內的代碼持續存在。

0

如果我想實現自我主機,我把它放在一個Windows服務,使用事件的OnStart和調用OnStop 。此外,請針對最佳做法進行以下更改:

  • 將端點配置放在App.Config文件中 - 更好地在生產環境中進行管理。
  • 將主機服務與實施和合同二進制文件分開。

您還可以看看MSDN: http://msdn.microsoft.com/en-us/library/ms730158%28v=VS.90%29.aspx 有一個很好的如何「主機在Windows服務服務」

+0

我相信將_testing_的主機放入Windows服務至少是矯枉過正或不切實際的。 – mafu 2010-04-12 14:32:13

+0

我不這麼認爲。如果您在MSDN中搜索,實施Self Host的最佳實踐是使用Windows Services進行安裝。無論如何,使用之前測試過的託管類型來部署它更好。 – Erup 2010-04-12 14:36:58

+0

@Erup:MSDN上的inproc託管的最佳實踐是生產中的wcf服務。對於測試來說,在測試解決方案中託管它更有意義。 – 2012-03-15 18:48:28