使用WCF服务时,每次使用它时是否更好地创建服务的新实例?或者创建一个并重新使用它会更好吗?为什么两种方法都更好?异步代理是否相同?
答案 0 :(得分:15)
或者创建一个并重新使用它会更好吗?
不要开始实现自己的池实现。这已经在框架中完成了。 WCF代理使用下面的缓存通道工厂。因此,创建新的代理并不是太昂贵(但请参阅Guy Starbuck关于会话和安全性的回复!)。
另请注意,代理在某个空闲时间后超时(默认为10分钟)。
如果您想要更明确的控制,您可以考虑直接使用ChannelFactories和渠道,而不是“易于使用,完全开箱即用”的ClientBase代理。
http://msdn.microsoft.com/en-us/library/ms734681.aspx
关于这个主题的“必读”是: http://blogs.msdn.com/wenlong/archive/2007/10/27/performance-improvement-of-wcf-client-proxy-creation-and-best-practices.aspx
答案 1 :(得分:5)
这意味着客户端必须通过每次调用进行身份验证,这是浪费的。
但是,如果您认为这是您想要做的,请确保将客户端配置为不建立安全上下文(因为您永远不会使用它),这将为您节省几次往返服务器: - )
答案 2 :(得分:5)
需要考虑的另一点是通道故障。根据设计,WCF不允许在未处理的异常发生后使用客户端代理。
IMyContract proxy = new MyContractClient( );
try
{
proxy.MyMethod( );
}
catch
{}
//Throws CommunicationObjectFaultedException
proxy.MyMethod( );
答案 3 :(得分:3)
这里有一个推论,即.NET Remoting中的服务器激活对象(被WCF取代的技术之一),它有两种模式,“单一呼叫”(无状态)和“单一”(有状态)。
您在WCF中采用的方法应该基于您的性能和扩展要求以及消费者的需求以及服务器端设计约束。
如果你必须维持对服务的调用之间的状态,那么你显然希望有一个有状态的实例,但是如果你不这样做,你应该实现它以便它是静态的,它应该更好地扩展(你可以更容易负载平衡等。)