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