14

使用 WCF 服务时,每次使用它时创建一个新的服务实例会更好吗?还是创建一个并重新使用它更好?为什么两种方法都更好?异步代理也一样吗?

4

4 回答 4

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

于 2009-11-29T16:07:20.300 回答
5

除了 Guy Starbuck 提到的事情之外,一个关键因素是您正在使用的安全模型(结合会话要求) - 如果您不重用代理,则不能重用安全会话.

这意味着客户端必须对每个调用进行身份验证,这是浪费的。

但是,如果您决定这是您希望做的事情,请确保将客户端配置为不建立安全上下文(因为您永远不会使用它),这将为您节省几次到服务器的往返:-)

于 2009-02-27T10:28:57.897 回答
5

要考虑的另一点是通道故障。按照设计,WCF 不允许在发生未处理的异常后使用客户端代理。

IMyContract proxy = new MyContractClient( );
try
{
   proxy.MyMethod( );
}
catch
{}

//Throws CommunicationObjectFaultedException
proxy.MyMethod( );
于 2009-11-28T16:37:22.813 回答
3

.NET Remoting(WCF 取代的技术之一)中的服务器激活对象有一个推论,它有两种模式,“Single Call”(无状态)和“Singleton”(有状态)。

您在 WCF 中采用的方法应基于您的性能和扩展需求以及您的消费者的需求,以及服务器端设计约束。

如果您必须在对服务的调用之间维护状态,那么您显然希望拥有一个有状态的实例,但如果您不这样做,您可能应该实现它以便它是静态的,它应该可以更好地扩展(您可以更轻松地加载余额等)。

于 2008-12-01T17:18:47.833 回答