0

我有一个使用带有消息加密的 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>
4

2 回答 2

2

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

try
{
  serviceProxyGlobal.Method()
}
catch(WhateverServerTimeoutException ex)
{
  serviceProxyGlobal = new ServiceProxy();
  //retry maybe?
}
catch(Exception ex)
{
  logException(ex);
}
于 2012-07-23T17:58:46.340 回答
0

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

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

于 2012-07-23T16:19:52.783 回答