调用Close或Abort后WCF会话未关闭

时间:2016-01-15 17:08:52

标签: c# wcf session nettcpbinding

我的服务器 - 客户端应用程序使用WCF的会话,并按如下所述进行注释:

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession, ConcurrencyMode=ConcurrencyMode.Multiple)]

它通过双工NetTcpBinding进行通信并使用Message security:

<netTcpBinding>
    <binding name="WCFSecurityBinding" receiveTimeout="01:00:00" sendTimeout="00:00:10"  closeTimeout="00:01:00"
             maxBufferSize="6553600" maxBufferPoolSize="52428800" maxReceivedMessageSize="6553600">
      <security mode="Message">
        <message clientCredentialType="UserName" />
      </security>
      <reliableSession ordered="true" inactivityTimeout="01:00:00"/>
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
                    maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
    </binding>
  </netTcpBinding>

一切正常,但我想在某些情况下手动关闭会话。我很好,因为我无法从服务器端关闭会话。所以我试图从客户端强制关闭会话。 我非常简单的场景是(服务器为[S],客户端为[C]):

  1. [S]启动主机应用

  2. [C]连接到[S]并启动会话

  3. [C]结束会议
  4. [S]处理InstanceContext.Closing事件
  5. [C]从会话中访问某些方法并获得异常。
  6. 所以三号对我来说很有趣。 我尝试调用proxy.Close()和proxy.Abort()以及DuplexChannelFactory.Close()。没有什么对我有用 - 处理程序(第4点)从未被调用过,当我能够从服务器获取数据时,会话仍然存在作为证明点5。我无法找到除关闭和中止之外的任何其他内容。我错过了什么吗?

    实现我的行为的唯一两种方法是:

    1. 提出异常(非常脏)
    2. 使用IsTerminating = true修饰符向服务添加特殊的CloseSession方法。这很酷,但是,我想使用WCF基础设施中的一些东西。
    3. - 编辑 我尝试了各种方法:

              try
              {
                  _proxy.Close();
              }
              catch (FaultException)
              {
                  _proxy.Abort();
              }
              catch (CommunicationException)
              {
                  _proxy.Abort();
              }
              catch (TimeoutException)
              {
                  _proxy.Abort();
              }
      

      或者

      DuplexChannelFactory<...> dcf...
      ...
      dcf.Close();
      dcf.Abort();
      Close();
      Abort();
      

      没有任何作品,也没有例外。

0 个答案:

没有答案