WCF:使客户端保持活动状态并有时间关闭它
我有一个WCF服务API的包装器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();
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的麻烦。