WCF 服务代理生命周期的最佳实践?

Posted

技术标签:

【中文标题】WCF 服务代理生命周期的最佳实践?【英文标题】:Best Practice for WCF Service Proxy lifetime? 【发布时间】:2010-09-24 18:57:25 【问题描述】:

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

【问题讨论】:

【参考方案1】:

还是创建一个并重新使用它更好?

不要开始实施您自己的池实施。这已经在框架中完成了。 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

【讨论】:

【参考方案2】:

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

这意味着客户端必须在每次调用时都验证自己的身份,这是一种浪费。

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

【讨论】:

【参考方案3】:

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

IMyContract proxy = new MyContractClient( );
try

   proxy.MyMethod( );

catch


//Throws CommunicationObjectFaultedException
proxy.MyMethod( );

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

我相信布赖恩问的是客户端代理的重用。这与服务器端实例的生命周期无关 我投反对票的原因与安德烈相同。我看不出服务器端的 InstanceManagement 与客户端代理的生命周期有什么关系。也许你能解释一下? 您说的都对,看来我最初将此问题解释为与服务器生命周期有关,而不是与客户端代理有关。我将继续在此处留下我的答案作为讨论的一部分,因为它在其他人的答案中被引用。

以上是关于WCF 服务代理生命周期的最佳实践?的主要内容,如果未能解决你的问题,请参考以下文章

哪个生命周期钩子是调度 API 获取请求的最佳实践?

大型 WCF 服务的最佳实践?

调用 WCF 服务的最佳实践 [重复]

使用 WCF 对服务进行版本控制的最佳实践?

WCF ChannelFactory 和连接超时的最佳实践

设计 SOA WCF Web 服务时的最佳实践是啥?