WCF和非活动超时:是否可以禁用非活动超时?
我有一个将永远运行的服务,不管是否有客户端访问此服务,但在长时间没有客户端活动后,能够连接到客户端 这是因为,例如,在假期之后,我希望能够连接到服务,而无需手动重新启动服务 目前,如果我的服务在10分钟内没有收到任何连接,它将断开连接,但我不想指定任何时间,我想要无限时间WCF和非活动超时:是否可以禁用非活动超时?,wcf,timeout,Wcf,Timeout,我有一个将永远运行的服务,不管是否有客户端访问此服务,但在长时间没有客户端活动后,能够连接到客户端 这是因为,例如,在假期之后,我希望能够连接到服务,而无需手动重新启动服务 目前,如果我的服务在10分钟内没有收到任何连接,它将断开连接,但我不想指定任何时间,我想要无限时间 谢谢。您可以设置inactivityTimeout=“infinite”,或者设置一个非常高的值,尽管不建议这样做,但您的服务不应该是这样的:一旦客户端连接到它,他们就可以“永远”使用它 更新 我的错误是,inactivity
谢谢。您可以设置
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”
,这仍然是一段相当长的时间,几乎是一个月。如果在此期间向服务发送一条简单的保持活动消息(基本上只是调用服务上的某些操作),您的连接将得到维护。我用以下方法解决此问题:
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.