WCF和不活动超时:是否可以禁用不活动超时?

时间:2012-08-12 15:41:47

标签: wcf timeout

我有一个可以永久运行的服务,无论是否有客户端访问此服务,但经过很长一段时间没有客户活动,都可以与客户端连接。

这是因为,例如,在假期后,我希望能够连接服务而无需手动重启服务。

目前,如果10分钟内没有收到任何连接,我的服务就会断开连接,但我不想指定任何时间,我想要无限时间。

感谢。

3 个答案:

答案 0 :(得分:6)

您可以设置inactivityTimeout="infinite"或非常高的值,但不推荐使用,您的服务不应该是这样的,一旦客户端连接到它,他们就可以“永远”消费它。

<强>更新

我的错误,似乎inactivityTimeout无法像receiveTimeout等其他超时一样设置为无限。

但你为什么不设置receiveTimeout="infinite"inactivityTimeout仅在您启用reliableSession时使用,如果您不需要可靠的会话,则只需将绑定上的receiveTimeout设置为无限,在这种情况下为receiveTimeout在某种程度上你的不活动超时。如果必须使用可靠会话,则WCF将使用这两个值来确定服务何时超时,并且需要满足两者以保持连接活动。似乎inactivityTimeout的最大值是'24 .20:31:23.6470000',基本上是24天和20.5小时,因此在最坏的情况下,只需将inactivityTimeout="24.20:31:23"设置为相当长的时间,差不多一个月了。如果您在该时间段内向您的服务发送一条简单的保持活动消息(基本上只是对您的服务调用某些操作),则会保持您的连接。

答案 1 :(得分:1)

我解决了这个问题:

  1. 从客户端ping服务器以使连接每30秒保持活动状态的方法。\
  2. 在服务器绑定上,ReceiveTimeout 1分钟。
  3. 为每个回调创建一个ICommunicationObject,使用Closed事件删除非活动客户端。
  4. //Adding a client callback
    OperationContext context = OperationContext.Current;
    ICallback callback = context.GetCallbackChannel();
    ICommunicationObject obj = (ICommunicationObject)callback;
    obj.Closed += new EventHandler(obj_Closed);
    
    //Event for inactive clients
    void obj_Closed(object sender, EventArgs e)
            {
                if (_callbacks.ContainsValue(((ITecnobelRemoteServiceCallback)sender)))
                {
                    var item = _callbacks.First(kvp => kvp.Value == (ITecnobelRemoteServiceCallback)sender));
                    _callbacks.Remove(item.Key);
                    treeViewClients.Nodes.RemoveByKey(item.Key.Id);
                    treeViewClients.Refresh();
                    _registeredUsers--;
                    listBoxStatus.Items.Add(String.Format("Usuário {0} estava inativo e foi removido", item.Key.Id));
                }
            }

答案 2 :(得分:0)

我不确定其他版本的.NET,但在4.5上我也试图绕过WCF服务的非活动期。

一时兴起,我设置了binding.ReceiveTimeout = System.Threading.Timeout.InfiniteTimeSpan,这是一个负时间跨度。这导致了一个异常,抛出了以下有趣的消息:

System.ArgumentOutOfRangeException: Timeout must be greater than or equal to TimeSpan.Zero. To disable timeout, specify TimeSpan.MaxValue.

所以我回到了我的代码,将ReceiveTimeout设置为TimeSpan.MaxValue,现在禁用了不活动计时器。