2010-08-30 250 views
0

我需要一些關於爲ASP .NET客戶端創建WCF客戶端代理包裝程序的最佳方法的建議。我想和ObjectDataSource控件一樣工作,沒有額外的編碼,而且當我需要手動調用WCF服務來獲取一些數據時也是如此。我基本上已經想出了兩種模型,但我想知道哪種效率更高。用於ASP .NET客戶端的WCF客戶端代理

這是第一個客戶包裝

public class Facade1 : IDisposable 
{ 
    private readonly IClient proxy = ClientProxyFactory.GetObject<IClient>(); 

    public List<string> GetData() 
    { 
     proxy.GetData() 
    } 

    public List<string> GetMoreData() 
    { 
     proxy.GetMoreData() 
    } 

    public void Dispose() 
    { 
     ClientProxyFactory.CloseChannel(this.proxy); 
    } 
} 

現在,這裏是另一個WCF包裝。

public class Facade2 
{ 
    public List<string> GetData() 
    { 
     IClient proxy = ClientProxyFactory.GetObject<IClient>(); 

     try 
     { 
      return client.GetData(); 
     } 
     finally 
     { 
      ClientProxyFactory.CloseChannel(proxy);    
     } 
    } 

    public List<string> GetMoreData() 
    { 
     IClient proxy = ClientProxyFactory.GetObject<IClient>(); 

     try 
     { 
      return client.GetMoreData(); 
     } 
     finally 
     { 
      ClientProxyFactory.CloseChannel(proxy);    
     } 
    } 
} 

在第一示例中,僅存在一個客戶端代理的實例,並且它可以各種方法之間的可重複使用,但類需要實現IDisposable以使所述代理可以由客戶端被正確地設置。在第二個示例中,每個方法都有一個客戶端代理,客戶端不必擔心處置代理。

重複使用不同方法之間的代理是一個好方法嗎?打開/關閉WCF代理時性能是否受到影響? (在這兩個例子中,假設的ChannelFactory被緩存和新的信道經由cached_factory.CreateChannel()方法創建的每個時間。)

例如,以第一個封裝我可以這樣做:

using (Facade1 facade = new Facade1()) 
{ 
    facade.GetData() 
    ... 
    ... 
    facade.GetMoreData() 
} 

在第二個例子中,我可以實例化我的Facade並調用所需的方法,而不用擔心處置代理。

由於提前,

埃裏克

回答

1

如果使用此包裝在除與共享代理模式是更好的ASP.NET應用程序多次調用WCF服務的一個HTTP請求處理。如果你想共享包裝(使其成爲全局),那麼應該使用第二個模型。

重新創建代理的性能取決於使用的綁定類型及其配置。例如,如果BasicHttpBinding代理的重新創建可以很快,因爲仍然可以存在來自先前代理的持久HTTP連接。但是,如果WSHttpBinding具有安全上下文,則代理的重新創建意味着建立安全會話的新安全握手。

+0

我打算爲第一個包裝或第二個包裝創建一個單獨的程序集,具體取決於我選擇哪一個。在第一個模型中共享包裝是否存在問題?現在爲了解決性能問題,現在這個服務被託管在Windows 2003服務器w/IIS6中,所以我只使用basicHttpBinding,但是將來我們可能會升級到Windows Server 2008並將其託管在IIS7中,我可以在其中使用netTcpBinding和WAS IIS7。我有點像第一個模型,其中代理是在方法之間共享的。唯一的缺點是客戶必須記得正確地處理包裝。 – Eric 2010-08-31 13:36:53