【问题标题】:How to tell if WCF service client proxy has timed out如何判断 WCF 服务客户端代理是否已超时
【发布时间】:2012-07-23 15:55:51
【问题描述】:

我有一个使用带有消息加密的 wsHttpBinding 的 WCF 服务。我使用相同的服务引用,除非它出现故障,在这种情况下我创建一个新的。我遇到了一个问题,即会话已超时且服务已结束,但客户端应用程序的 CommunicationState 仍为 Opened。

如何在 ClientBase 中判断连接是否超时?如果当前服务代理已超时,我希望在我的客户端应用程序中创建一个新的服务代理。

下面是我的客户端绑定:

  <wsHttpBinding>
    <binding name="wsHttpBindingWithAuthClient" closeTimeout="00:01:00"
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
      bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
      maxBufferPoolSize="524288" maxReceivedMessageSize="20000000"
      messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
      allowCookies="false">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <reliableSession ordered="true" inactivityTimeout="00:10:00"
        enabled="false" />
      <security mode="Message">
        <transport clientCredentialType="Windows" proxyCredentialType="None"
          realm="" />
        <message clientCredentialType="UserName" negotiateServiceCredential="true"
          algorithmSuite="Default" />
      </security>
    </binding>
  </wsHttpBinding>

【问题讨论】:

  • 为什么不能每次都新建代理?
  • 我必须每次都设置我的 ClientCredentials 和 ServiceCertificate 字段。我不确定每次通话都这样做的后果。

标签: c# wcf wshttpbinding


【解决方案1】:

你为什么不把你所有的服务调用包装在一个 try/catch 中,并在服务器连接超时的特定异常类型的 catch 块中,重新创建代理。

try
{
  serviceProxyGlobal.Method()
}
catch(WhateverServerTimeoutException ex)
{
  serviceProxyGlobal = new ServiceProxy();
  //retry maybe?
}
catch(Exception ex)
{
  logException(ex);
}

【讨论】:

  • 这是重试的好习惯,但不能回答我的问题。无法回答吗?
  • 这是检查 WCF 连接(使用这种类型的绑定)是否超时的唯一方法,可以在其上调用代理方法。它似乎回答了这个问题。您还希望客户端如何判断服务器是否已关闭其连接?
  • 我希望有一些简单的方法可以调用 ClientBase,例如“IsAlive”。这就是我问这个问题的原因。如果这是唯一的方法,那么我会接受。
  • 这将是多余的,你会调用服务器两次,一次检查它是否活着,两次实际调用你的方法。另一个解决方案是使用双工绑定 (msdn.microsoft.com/en-us/library/ms731064.aspx),但在大多数情况下,仅检查连接是否已关闭就太过分了。
  • 我不明白为什么服务器正在关闭客户端连接。我实际上不确定是关闭客户端还是服务器端。查看服务器日志,它似乎是服务器,因为客户端继续使用不再有效的安全会话。
【解决方案2】:

请考虑使用简单的 getter 访问该共享 Web 服务引用,您基本上在返回对它的引用之前尝试“ping”您的 Web 服务(“ping”方法应该非常简单,例如 Boolean Ping() { return true; })如果它抛出异常(在这里你必须满足所有可能的情况),简单地处理它,抑制它(如果它是一个你可以识别并且你期望的异常)并创建新的共享连接。

或者,您可以设计一种方法,在后台线程中每隔 [Web 服务超时,以分钟为单位] / 2 分钟 ping 您的 Web 服务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-15
    • 2014-05-12
    • 2012-11-24
    • 2011-03-22
    • 2012-03-25
    • 2011-10-22
    相关资源
    最近更新 更多