WCF客户端 - 客户端应何时关闭通道

时间:2010-11-19 14:35:56

标签: c#-4.0 wcf client-server channel

在典型的客户端服务应用程序中,服务是WCF,如何使用服务引用?

例如,您是单独为每个调用实例化服务,还是打开一个并在整个客户端应用程序的生命周期内保留它? (当我提到'instatiating service'时,我的意思是实例化由svcutil创建的服务对象)

现在我们在客户端上使用了一个服务实例,因为这似乎比为每次调用创建,打开和关闭服务都要快,但现在如果可以,我会徘徊?我们使用这种方法的主要问题是超时发生(或者我们必须打开会话10小时),连接中断等,我们总是必须通过通道做'IsAlive'以确保一切正常... < / p>

如果它具有任何相关性,则该应用程序是单线程的,并且身份验证是自定义构建的(通过将auth令牌插入标头)。绑定是basicHttp(或ws,对于这种情况并不重要)。

1 个答案:

答案 0 :(得分:1)

我个人更喜欢在方法调用返回之前保持通道打开,然后将其关闭以释放资源。这是所有人中最干净的方法。每次初始化代理实例只需几毫秒,并且从未影响我的性能目标。

有一些ServiceClient单例是一个有趣的想法,但正如你所说,它带来了很多副作用,所以我不确定这是一个聪明的方法,但由于你的应用程序是单线程的,那么它不应该这是一个大问题,你可能会有一些轻微的性能优势。

如果保存毫秒是任务关键型,那么您还可以拥有一个可以从中获取实例的ServiceClient池。

然而,第一种方法是最干净的。复杂性很糟糕。