【问题标题】:WCF: keeping a client alive and time to close itWCF:保持客户端存活并有时间关闭它
【发布时间】:2012-10-28 08:16:15
【问题描述】:

我有一个 WCF 服务 API 的包装器

Class APIWrapper
{
   private WCFClient _client;
   //constructor opens a client connection
   public APIWrapper()
   {
      _client = new WCFClient();
      _client.open();
   }

   public API1()
   {
       _client.doSomething1();
   }

   public API2()
   {
       _client.doSomething2();
   }

}

我想问:

Q1 会出现超时异常吗?如果这个包装类实例存在太久? (默认情况下 WCF 连接是否保持活动状态?没有在配置中设置该属性) 例如,一个包装类构建后,它的API1或API2在10分钟后被调用,这比这个WCF连接的超时值还要长。

Q2 我是否需要显式关闭连接,如果需要,我应该像下面这样在包装类的析构函数中这样做吗?

~APIWrapper
{
    if(_client !=null)
    try{
         _client.close();  }
    catch(Exception e){
         _client.Abort();   }
}

【问题讨论】:

    标签: wcf timeout client keep-alive


    【解决方案1】:

    据我所知,WCF 不会保持连接处于活动状态。在经过预定义的时间后(inactivityTimeout="00:10:00"),当您尝试调用 _client.doSomething1() 或服务上的任何其他方法时,连接将引发异常。

    WCF inactivity timeout

    要保持连接活跃,您应该以预定义的时间间隔调用一个简单的方法,假设每 1 分钟一次。

    但是,我同意 Jordi 的观点,即您应该使用无状态的 wcf 服务,直到真正有必要为止。

    【讨论】:

    • 谢谢。我觉得 10 分钟就足够了。这个包装类不会持续更长的时间。 API即使在包装类中也是无状态的,这只是为了省去手动打开和关闭WCF conn的麻烦。
    【解决方案2】:

    我不确定你为什么要这样做,但如果 WCF 托管在 IIS7 中,WCF 将在有或没有连接的情况下启动,保持连接处于活动状态是没有意义的。

    根据我的经验,这类服务在无状态时效果最好(除非你有充分的理由)。我强烈建议每次打开和关闭连接。如果您这样做是为了提高性能,还有另一种方法可以避免每次关闭和打开。

    Q1:根据 MSDN,openTimeout 是 1 分钟

    http://msdn.microsoft.com/en-us/library/system.servicemodel.channels.binding.opentimeout.aspx

    Q2:您不需要显式关闭连接,但这是一种很好的做法,我强烈建议您这样做。不关闭连接可能会导致 WCF 开销。

    【讨论】:

    • 关于Q1,Taner是对的,你应该检查“inactivityTimeout”
    • 谢谢。所以对于Q2来说,最好有一个析构函数来释放连接
    • 是的,总是释放资源。 WCF 可能以大量未使用的打开连接结束,从而导致性能问题。
    • 但是 WCF ClientBase 实现了 IDisposable,当 GC 工作时,它会在其上调用 .close(),唯一不同的是显式地在 close() 期间捕获异常然后调用 abort() .但是这个异常在 GC 期间已经无关紧要了,不必捕获它。
    • 这是一个关心资源的问题。一个昂贵的资源应该尽可能晚地被占用,并且应该尽快被释放。当然,您可以依赖 GC,并且可能会为您工作。我来自 C++,我真的很喜欢明确地处理一切:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2019-11-05
    • 2018-03-03
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    相关资源
    最近更新 更多