【发布时间】:2009-07-17 13:38:04
【问题描述】:
我正在尝试实现以下目标 - 一个客户端代理实例(保持打开状态)由多个线程使用可靠会话访问。到目前为止,我所管理的是 A) 与客户端代理的可靠会话,该会话是每次调用创建和处理的,或者 B) 我的目标是,但没有可靠的会话。
但是,当我在绑定上启用可靠会话时,会出现以下行为:
客户端
在应用程序启动后,一切似乎都正常工作,直到大约 18 条消息进入 WCF 会话。我首先引发了proxy.InnerChannel.Faulted 事件,然后在我调用代理上的方法时捕获了一个异常。例外是System.TimeoutException,带有消息:
"请求通道在等待回复后超时 00:00:59.9062512。增加传递给调用的超时值 请求或增加 Binding 上的 SendTimeout 值。时间 分配给该操作的可能是较长时间的一部分 超时。”
内部异常有类似的信息:
"请求操作没有在分配的超时时间内完成 00:01:00。分配给此操作的时间可能是一部分 更长的超时时间。”
内部堆栈跟踪顶部的方法是:
System.ServiceModel.Channels.ReliableRequestSessionChannel.SyncRequest.WaitForReply(TimeSpan timeout)
然后我调用proxy.Close,然后调用proxy.Abort(捕获并忽略异常)。如果我使用默认设置(即只有<reliableSession/>),则调用代理。关闭会导致另一个 System.Timeout 异常(尽管这次分配的超时时间是 00:00:00),但是如果我按照上面指定的方式覆盖默认值,则不会引发异常。
服务端
利用 WCF 跟踪我得到一个 System.ServiceModel.CommunicationException,带有消息:
"序列已被远程端点终止。会话 已停止等待特定回复。正因为如此 可靠会话无法继续。可靠会话出现故障。”
堆栈跟踪结束于:
System.ServiceModel.AsyncResult.End[TAsyncResult](IAsyncResult result)
当远程连接到服务器时,我会收到相同的消息,当代码执行在导致错误的服务调用中跳过我的服务的返回语句时会发生这种情况。
令我感到困惑的是,该服务是稳定的,并且可以使用我的帖子开头所述的选项 A) 或 B) 运行,并且在不同数量的消息(大约 18 条)之后发生。前一个事实表明代码没有任何问题(实际上我已经检查过没有抛出异常),而后者只是让我感到困惑,这也是我修改可靠会话绑定设置的原因。
我非常坚持这一点。谁能提出为什么可靠会话会以这种方式出现故障?
【问题讨论】:
-
第一条消息和引发超时异常的消息之间需要多长时间?
-
您是否尝试查看您的客户端的 wcf 跟踪?问题可能是“收回”你的结果。
-
您使用的是哪种绑定?
-
您的资源是否在调用服务调用的线程之间阻塞。
-
您还在寻找解决方案吗?