如何检查WCF客户端通道(服务)是否终止?

时间:2011-07-07 14:18:07

标签: c++ wcf wcf-client

我在Windows服务上托管了简单的WCF服务。

当wcf服务的客户端空闲10分钟或更长时间WCF服务在客户端终止[不在服务器端时,服务器服务仍然存在]并且我遇到了错误的超时错误。

我不想增加超时时间。我只是想知道是否有一种方法可以知道服务是否在客户端终止?[API是否提供此信息?]然后如果会话终止,我将创建新的。

祝福

Ps:在客户端,我检查了WCFClientChannel->Sate == CommunicationState::Faulted,但这不起作用

1 个答案:

答案 0 :(得分:1)

不幸的是,知道代理不再可用的唯一方法是尝试使用它。

实际发生的是您使用的绑定是sessionful(例如NetTcpBinding或WSHttpBinding),服务为该客户端连接维护资源。如果客户端在服务的receiveTimeout中指定的时间内没有与服务通信(默认为10分钟),则服务器会确定客户端没有返回并丢弃客户端的服务器端资源。

现在,当客户回来并说“嘿,我再次”时,服务器说“我不知道你在说什么”,并且错误地通话,从而杀死了客户代理

因此,由于服务器端已做出决定,客户端无法知道,除非它尝试与服务进行通信

您可以执行以下操作之一:

  1. 增加服务器上的receiveTimeout(但这只是它 需要更长时间才能看到问题)
  2. 使用非会话的绑定(比如说BasicHttpBinding)
  3. 进行“ping”操作,客户端每隔几次调用一次 分钟让服务知道它仍在那里