【问题标题】:WCF and inactivity timeout: is it possible to disable the inactivity timeout?WCF 和不活动超时:是否可以禁用不活动超时?
【发布时间】:2012-08-09 01:00:13
【问题描述】:

我有一项服务将永远运行,无论是否有客户端访问该服务,但在很长一段时间没有客户端活动后,才能与客户端连接。

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

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

谢谢。

【问题讨论】:

    标签: wcf timeout


    【解决方案1】:

    我解决了这个问题:

    1. 从客户端 ping 到服务器以保持连接每 30 秒处于活动状态的方法。\
    2. 在服务器绑定上,ReceiveTimeout 用 1 分钟。
    3. 为每个回调创建一个ICommunicationObject,使用 Closed 事件移除非活动客户端。
        //Adding a client callback
        OperationContext context = OperationContext.Current;
        ICallback callback = context.GetCallbackChannel<ICallback>();
        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("User {0} was inactive 
        and was removed", item.Key.Id));
                    }
                }
    

    【讨论】:

      【解决方案2】:

      我不确定其他版本的 .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,现在禁用了不活动计时器。

      【讨论】:

        【解决方案3】:

        您可以设置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",这仍然是相当长的时间,差不多一个月。如果您在此期间向您的服务发送一个简单的保持活动消息(基本上只是在您的服务上调用一些操作),那么您的连接将被保持。

        【讨论】:

        • 我不能使用无限值​​,它是无效的。
        • 在 app.config 中没有 'inactivityTimeout' 作为绑定属性
        • @KomalJariwala 请参考此WCF-Reliable-Sessions-Bindings-service-and-client。你需要在绑定中使用reliableSession子标签
        猜你喜欢
        • 2012-08-10
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        • 2012-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多