0

我有一个 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连接是否保持活动?没有在config中设置该属性)例如,在构造一个包装类之后,它的API1或API2在10分钟后被调用,这比这个WCF连接的超时值要长。

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

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

2 回答 2

4

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

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

Q1:根据 MSDN,openTimeout 是 1 分钟

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

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

于 2012-11-08T07:19:30.223 回答
1

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

WCF 不活动超时

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

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

于 2012-11-08T07:48:52.500 回答