我需要一些关于为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