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

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

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

最好的祝愿

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

最佳答案

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

实际情况是,您正在使用sessionful(例如NetTcpBinding或WSHttpBinding)绑定(bind),服务会为其保留客户端连接资源。如果客户端在服务的receiveTimeout中指定的时间(默认为10分钟)内未与服务进行对话,则服务器将确定客户端不回来,并丢弃客户端的服务器端资源。

现在,当客户返回并说“嘿,再次给我”时,服务器会说“我不知道您在说什么”,并打断电话,从而杀死了客户代理

因此,由于已经在服务器端做出决定,因此除非客户端尝试与服务进行对话,否则客户端将无法知道。

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

  • 增加服务器上的receiveTimeout(但这只是使其
    需要更长的时间才能看到问题)
  • 使用非 session 绑定(bind)(例如BasicHttpBinding)
  • 有一个“ping”操作,每隔几个客户端就会调用一次
    分钟,让服务知道它仍然存在
  • 09-11 18:56
    查看更多