我需要一些建议,了解为ASP .NET客户端创建WCF客户端代理包装器的最佳方法。我希望与ObjectDataSource控件同样好用,没有额外的编码,当我需要手动调用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()
}
在第二个例子中,我可以实例化我的外观并调用所需的方法而不必担心处理代理。
提前致谢,
埃里克
答案 0 :(得分:1)
如果在ASP.NET应用程序中使用此包装器对单个HTTP请求处理中的WCF服务进行多次调用,那么使用共享代理的模型会更好。如果你想共享包装器(使其全局化),那么应该使用第二个模型。
重新创建代理的性能取决于使用的绑定的类型及其配置。例如,在BasicHttpBinding的情况下,可以快速重新创建代理,因为仍然存在来自先前代理的持久HTTP连接。但是对于带有安全上下文的WSHttpBinding,代理的重新创建意味着用于建立安全会话的新安全握手。