Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WCF:使客户端保持活动状态并有时间关闭它_Wcf_Timeout_Client_Keep Alive - Fatal编程技术网

WCF:使客户端保持活动状态并有时间关闭它

WCF:使客户端保持活动状态并有时间关闭它,wcf,timeout,client,keep-alive,Wcf,Timeout,Client,Keep Alive,我有一个WCF服务API的包装器 Class APIWrapper { private WCFClient _client; //constructor opens a client connection public APIWrapper() { _client = new WCFClient(); _client.open(); } public API1() { _client.doSomething1();

我有一个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托管在IIS7中,WCF将开始连接或不连接,保持连接处于活动状态是没有意义的

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

问题1:根据MSDN,打开超时为1分钟


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

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

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

问题1:根据MSDN,打开超时为1分钟


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

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

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


但是,我同意Jordi的观点,在确实需要之前,您应该使用无状态wcf服务。

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

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


不过,我同意Jordi的观点,即在确实需要之前,您应该使用无状态wcf服务。

关于第1季度,Taner是对的,您应该查看“inactivityTimeout”,谢谢。所以对于Q2,最好使用析构函数来释放连接,始终释放资源。WCF可能会以大量未使用的打开连接结束,从而导致性能问题。但是WCF ClientBase实现IDisposable,当GC工作时,它将对其调用.close(),唯一不同的是显式地在close()期间捕获异常,然后调用abort()。但是这个异常在GC过程中已经不重要了,不必捕捉它,而是关心资源的问题。一个昂贵的资源应该尽可能晚地使用,并且应该尽快释放。当然,您可以依赖GC,并且可能会为您工作。我来自C++,我非常喜欢处理所有的细节:关于Q1,Taner是正确的,你应该检查“IcActuviyTimeOutt”谢谢。所以对于Q2,最好使用析构函数来释放连接,始终释放资源。WCF可能会以大量未使用的打开连接结束,从而导致性能问题。但是WCF ClientBase实现IDisposable,当GC工作时,它将对其调用.close(),唯一不同的是显式地在close()期间捕获异常,然后调用abort()。但是这个异常在GC过程中已经不重要了,不必捕捉它,而是关心资源的问题。一个昂贵的资源应该尽可能晚地使用,并且应该尽快释放。当然,您可以依赖GC,并且可能会为您工作。我来自C++,我非常喜欢处理所有的细节:谢谢。我想10分钟就足够了。这个包装器类不会持续更长的时间。API即使在包装器类中也是无状态的,这只是为了省去手动打开和关闭WCF conn的麻烦。谢谢。我想10分钟就足够了。这个包装器类不会持续更长的时间。API即使在包装器类中也是无状态的,这只是为了省去手动打开和关闭WCF conn的麻烦。