1

我有一个 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() 而不会超时。这似乎有效,但我不确定为什么。

4

0 回答 0