我有一个 WCF 客户端应用程序,它为每个调用创建一个新的代理实例。我在前一个实例上调用 Close() 以确保连接已关闭,但它总是在 1 分钟后超时,这是默认的关闭时间。在这种情况下,我之前调用了 Abort(),而不是 Close(),但后来我意识到我会超过 10 个并发连接的默认限制。我不确定是什么导致 Close() 调用超时。查看 WCF 跟踪日志,我看到一段日志显示以下内容,但我不清楚这是我调用 Close() 还是自动执行此操作的结果:
- 一条消息已关闭
- 一条消息已关闭
- 消息再次关闭
我的服务定义了以下行为:
[ServiceBehavior(IncludeExceptionDetailInFaults = true, AutomaticSessionShutdown = false, InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
以下是我的服务行为:
<service behaviorConfiguration="AdminServiceBehavior" name="My.WebServices.AdminService">
<endpoint address="" binding="wsHttpBinding" bindingConfiguration="AdminUserNameBinding"
name="wsHttpBindingWithAuthAdmin" contract="My.WebServices.IAdminService">
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" name="mexAdminBinding"
contract="IMetadataExchange" />
我需要做什么才能优雅地关闭()我的连接而不会超时?我已经阅读了有关何时调用 Close() 与 Abort() 的文章,以及是否应该处理/使用“使用”块,但 Close() 对我而言超时且 Abort() 无法释放的事实并发会话让我感到困惑。
这可能与AutomataticSessionShutdown有关,但我不确定它为什么会导致 Close() 中止。老实说,我不知道为什么我将该属性设置为 false。
更新:将 AutomaticSessionShutdown 设置为 true(默认值)允许我调用 Close() 而不会超时。这似乎有效,但我不确定为什么。