4

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

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

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

谢谢。

4

3 回答 3

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

于 2012-08-12T16:25:51.180 回答
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));
                }
            }
于 2014-08-05T15:44:05.093 回答
1

我不确定 .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.

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

于 2017-07-25T19:49:56.920 回答