2009-09-04 73 views
1

我想確保在使用服務後關閉WCF服務客戶端狀態。關閉服務客戶端狀態的模式

我執行下面的代碼,以確保:

public static class ServiceClientFactory 
{ 
    public static ServiceClientHost<T> CreateInstance<T>() where T : class, ICommunicationObject, new() 
    { 
     return new ServiceClientHost<T>(); 
    } 
} 

public class ServiceClientHost<T> : IDisposable where T : class, ICommunicationObject, new() 
{ 
    private bool disposed; 

    public ServiceClientHost() 
    { 
     Client = new T(); 
    } 

    ~ServiceClientHost() 
    { 
     Dispose(false); 
    } 

    public T Client { get; private set; } 

    public void Dispose() 
    { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 

    protected virtual void Dispose(bool disposeManagedResources) 
    { 
     if(!disposed) 
     { 
      if(disposeManagedResources) 
      { 
       Client.Close(); 
       Client = null; 
      } 
      disposed = true; 
     } 
    } 
} 

用法:

using (var host = ServiceClientFactory.CreateInstance<MySericeClient>()) 
{ 
    host.Client.DoSomething(); 
} 

我想知道是否有更好的/優雅的解決方案比我的?

感謝您的任何提示!

回答

2

使用using塊通常是一次性對象的好主意 - 但不是在WCF代理的情況下。問題在於,關閉代理時(在使用塊的末尾),很可能會出現異常 - 然後未處理(可能)並且代理沒有真正關閉。

推薦最好的做法是:

try 
{ 
    var host = ServiceClientFactory.CreateInstance<MySericeClient>(); 

    ...... (use it)....... 

    host.Close(); 
} 
catch(FaultException) 
{ 
    host.Abort(); 
} 
catch(CommunicationException) 
{ 
    host.Abort(); 
} 

麻煩的是 - 如果有的話通信過程中確實錯了,您的頻道將在「故障」狀態,並呼籲「.Close()」該頻道上會導致異常。

因此,捕獲故障異常(來自服務器的信號出錯)和CommunicationException(Fault和其他WCF客戶端異常的基類),並且在這種情況下,使用proxy.Abort()強制中止/代理人關閉(沒有優雅地等待操作完成,而只是投擲大錘)。

Marc

+0

對於最後的陳述你會有什麼建議? – 2012-06-16 12:30:28

相關問題