我有一个win表单客户端,可以访问长时间运行的wcf服务。该服务公开了订阅和取消订阅方法。当客户端调用subscribe方法时,服务为它生成新的guid并获取当前的回调上下文,将此guid和回调上下文保存在客户端Dictionary中并返回Guid。在用户请求时,使用此guid的客户端调用服务来启动长操作。一旦服务完成操作,它就会给客户端回调。然后,客户端从服务中检索已处理的数据。
我在回调时遇到的错误是
无法完成操作'OnServiceCallback',因为会话通道超时等待接收消息。要增加超时,请在配置文件中的绑定上设置receiveTimeout属性,或者直接在Binding上设置ReceiveTimeout属性。
我无法理解的部分是这种情况非常不一致。大多数情况下,它发生在客户端和服务运行一段时间之后。
我是wcf服务的初学者,欢迎任何解决此错误的建议。
答案 0 :(得分:0)
Binding具有名为receiveTimeout的属性。默认情况下,此属性设置为10分钟。它定义服务实例在终止之前等待下一个请求的时间。因此,如果客户端和服务之间在10分钟内没有活动,则服务实例将关闭,客户端将无法再使用它。在双工服务中,它可能更复杂,因为双方都有服务。您可能需要在两端配置receiveTimeout。
答案 1 :(得分:0)
通过做一些好的旧试验和错误,我能够找到错误的答案。回调失败,因为我尝试使用的OperationContext.Current
对象为null。这是因为我试图在与服务线程不同的线程上访问OperationContext.Current
对象。所以要解决这个问题,我现在正在访问服务线程中的OperationContext.Current
对象,然后将callbackContext
作为参数传递给实际需要使用它的外部处理逻辑。