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

WCF和非活动超时:是否可以禁用非活动超时?,wcf,timeout,Wcf,Timeout,我有一个将永远运行的服务,不管是否有客户端访问此服务,但在长时间没有客户端活动后,能够连接到客户端 这是因为,例如,在假期之后,我希望能够连接到服务,而无需手动重新启动服务 目前,如果我的服务在10分钟内没有收到任何连接,它将断开连接,但我不想指定任何时间,我想要无限时间 谢谢。您可以设置inactivityTimeout=“infinite”,或者设置一个非常高的值,尽管不建议这样做,但您的服务不应该是这样的:一旦客户端连接到它,他们就可以“永远”使用它 更新 我的错误是,inactivity

我有一个将永远运行的服务,不管是否有客户端访问此服务,但在长时间没有客户端活动后,能够连接到客户端

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

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


谢谢。

您可以设置
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”
,这仍然是一段相当长的时间,几乎是一个月。如果在此期间向服务发送一条简单的保持活动消息(基本上只是调用服务上的某些操作),您的连接将得到维护。

我用以下方法解决此问题:

  • 方法从客户端ping到服务器,以每30秒保持连接活动\
  • 在服务器绑定上,
    ReceiveTimeout
    加1分钟
  • 对于每个回调,创建一个
    ICommunicationObject
    ,使用Closed事件删除非活动客户端
  • //添加客户端回调
    OperationContext上下文=OperationContext.Current;
    ICallback callback=context.GetCallbackChannel();
    ICommunicationObject obj=(ICommunicationObject)回调;
    obj.Closed+=新事件处理程序(obj_Closed);
    //非活动客户端的事件
    无效对象已关闭(对象发送方,事件参数e)
    {
    if(_callbacks.ContainsValue(((ITecnobelRemoteServiceCallback)发送方)))
    {
    var item=_callbacks.First(kvp=>kvp.Value==(ITecnobelRemoteServiceCallback)发送方);
    _callbacks.Remove(item.Key);
    treeviewClient.Nodes.RemoveByKey(item.Key.Id);
    treeviewClient.Refresh();
    _登记者--;
    listBoxStatus.Items.Add(String.Format(“用户{0}处于非活动状态
    并被删除“,item.Key.Id”);
    }
    }
    
    我不确定.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
    ,现在禁用了非活动计时器。

    我不能使用无限值,它无效。应用程序中没有“inactivityTimeout”作为绑定属性。config@KomalJariwala请参考这个。您需要在绑定中使用reliableSession子标记
    System.ArgumentOutOfRangeException: Timeout must be greater than or equal to TimeSpan.Zero. To disable timeout, specify TimeSpan.MaxValue.