我试图实现以下 - 使用可靠会话由多个线程访问的一个客户端代理实例(保持打开).到目前为止我所管理的是A)与客户端代理的可靠会话,每次调用创建和处理或B)我的目标,但没有可靠的会话.
但是,当我在绑定上启用可靠会话时,会出现以下行为:
客户端
在应用程序启动时,一切似乎都能正常工作,直到大约18条消息进入WCF会话.我首先得到proxy.InnerChannel.Faulted引发的事件,然后在我在代理上调用方法时捕获异常.例外是a System.TimeoutException,带有消息:
"请求通道在00:00:59.9062512之后等待回复时超时.增加传递给Request的调用的超时值或增加Binding上的SendTimeout值.分配给此操作的时间可能是一部分更长的超时."
内部异常有类似的消息:
"请求操作未在分配的00:01:00超时内完成.分配给此操作的时间可能是较长超时的一部分."
使用内部堆栈跟踪顶部的方法是:
System.ServiceModel.Channels.ReliableRequestSessionChannel.SyncRequest.WaitForReply(TimeSpan timeout)
Run Code Online (Sandbox Code Playgroud)
然后我调用proxy.Close后跟proxy.Abort(捕获并忽略异常).如果我使用默认设置(即简单<reliableSession/>),则调用代理.关闭会产生另一个System.Timeout异常(虽然这次分配的超时是00:00:00),但是如果我覆盖上面指定的默认值,则不会抛出异常.
服务端
使用WCF跟踪我得到一个System.ServiceModel.CommunicationException消息:
"序列已被远程端点终止.会话已停止等待特定回复.因此,可靠会话无法继续.可靠会话出现故障."
并且堆栈跟踪结束于:
System.ServiceModel.AsyncResult.End[TAsyncResult](IAsyncResult result)
Run Code Online (Sandbox Code Playgroud)
当远程连接到服务器时,我得到相同的消息,这发生在代码执行步骤超过服务调用中我的服务的return语句导致错误时.
对我来说令人费解的是,该服务是稳定的,并且在我的帖子开头描述的选项A)或B)运行,并且发生在不同数量的消息(大约18)之后.前面的事实表明代码没有任何问题(事实上我已经检查过没有抛出异常),而后者只是让我感到困惑,这就是为什么我修改了可靠会话绑定的设置.
我很坚持这个.任何人都可以建议为什么可靠的会话会以这种方式出错?
小智 1
您需要覆盖默认值,并根据原因将超时设置得更高或更低,似乎在其他程序启动或停止后的异常发生前一毫秒,超时就导致了异常
或者最可能的原因
您分配的超时可能会添加为 18 分钟或 18 个调用的连续单个超时。加上其他使用时间会添加到一起作为一个完整的超时。这可能就是它要求更多时间的原因。
在任何情况下,您都必须静态设置自己的设置,因为自动默认设置将始终覆盖您所做的任何更改。
输入您的本地主机 http 绑定名称并将关闭超时设置为 5 分钟,甚至还可以更改请求时间。请求超时 2.00 分钟
关闭超时=“00:05:00”
| 归档时间: |
|
| 查看次数: |
4790 次 |
| 最近记录: |