![](/img/trans.png)
[英]Caching WCF ChannelFactory or client proxy in ASP.NET on Azure?
[英]WCF client proxy for ASP .NET client
我需要一些有关为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()
}
在第二个示例中,我可以实例化我的外观并调用所需的方法,而不必担心部署代理。
提前致谢,
埃里克
如果在ASP.NET应用程序的单个HTTP请求处理中将此包装用于WCF服务的多次调用,则比使用共享代理的模型更好。 如果要共享包装器(使其全局),则应使用第二个模型。
重新创建代理的性能取决于所用绑定的类型及其配置。 例如,在BasicHttpBinding的情况下,可以快速重新创建代理,因为仍然可以存在来自先前代理的持久HTTP连接。 但是,在具有安全上下文的WSHttpBinding的情况下,重新创建代理意味着为建立安全会话建立了新的安全握手。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.