我正在参加.NET Web服务入门课程,我们目前正在学习的其中一项是IDisposable界面。作为一个相对简单的示例,我创建了一个具有MyMethod()
操作的服务(服务器/客户端)。该方法只是在调用时打印一个trace语句。我还在我的服务器上实现了IDisposable,在服务器实现的版本中再次使用了一个简单的WriteLine跟踪来实现Dispose()
方法。
在我的客户端,我使用ChannelFactory创建了两个代理。在proxy1上,我调用MyMethod()
操作3次,然后有几行代码来处理proxy1:
var castedProxy = (IDisposable)proxy1;
castedProxy.Dispose();
在proxy2上,我再次调用MyMethod()
操作3次,除了这次我没有强制转换并调用Dispose()
。当我运行服务器/客户端时,我得到相同的跟踪6次:
服务器的Trace + CurrentThread ID
MyMethod()的Trace + CurrentThread ID
Dispose()的Trace + CurrentThread ID
我的问题是:为什么每次都会发生跟踪的Dispose()
部分,即使我只使用前3条跟踪?我的猜测是,它与使用BasicHttpBinding时没有会话管理本身有关,因此旧资源仍然存在,打印旧的Dispose()调用。
提前感谢您提供的任何见解! :)
答案 0 :(得分:3)
客户端上的代理服务器和服务器上的服务是两个不同的对象。
对于服务器,每个服务对象的生命周期由InstanceContextMode
的{{1}}控制。如果将其设置为ServiceBehaviour
,则将为每个调用创建并销毁服务类的新实例。 WCF会为您执行此操作 - 您只需设置PerCall
。
通常,客户端和服务器将处于不同的进程中。如果您认为这样,那么客户端代理的生命周期不会控制服务的生命周期。
答案 1 :(得分:0)
您在客户端上调用dispose,而不是在服务器上调用。因为您的WCF服务是按请求配置的,所以即使客户端仍然存在,也会为每次调用创建和处理该类。
WCF默认调用服务中的Dispose。这是正常行为。如果服务实现IDisposable
,则在销毁服务时调用Dispose
。