我正在尝试实现以下 - 使用可靠会话由多个线程访问的一个客户端代理实例(保持打开)。到目前为止我所管理的是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)
当远程连接到服务器时,我得到相同的消息,当代码执行步骤超过服务调用中我的服务的return语句时会发生错误。
对我来说令人费解的是,该服务是稳定的,并且在我的帖子开头描述的选项A)或B)中运行,并且在不同数量的消息(大约18)之后发生。前面的事实表明代码没有任何问题(事实上我已经检查过没有抛出异常),而后者只是让我感到困惑,这也是我修改可靠会话绑定设置的原因。
我非常坚持这一点。任何人都可以建议为什么可靠会话会以这种方式出错?
答案 0 :(得分:1)
你需要覆盖默认值,并将你的超时设置为更高或更低取决于原因,似乎在一些其他程序启动或停止仅在异常之前的一毫秒之后,timout会导致异常
或者最有可能导致
您的分配超时可能会被添加为18分钟或18个呼叫的连续单个超时.plus其他使用时间会加在一起作为一个完整的超时。这可能是它要求更多时间的原因。
在任何情况下,您都必须静态设置自己的设置,因为自动默认值总是会超过您所做的任何更改。
键入您的本地主机http绑定名称,并将closetimeout设置为5.00分钟 甚至可能更改请求时间。 Requesttimeout 2.00分钟
closeTimeout =&#34; 00:05:00&#34;