为什么我的服务的Dispose()方法被调用,即使我没有调用它? (使用BasicHttpBinding)

时间:2012-05-02 17:53:46

标签: .net wcf c#-4.0 dispose idisposable

我正在参加.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()调用。

提前感谢您提供的任何见解! :)

2 个答案:

答案 0 :(得分:3)

客户端上的代理服务器和服务器上的服务是两个不同的对象。

对于服务器,每个服务对象的生命周期由InstanceContextMode的{​​{1}}控制。如果将其设置为ServiceBehaviour,则将为每个调用创建并销毁服务类的新实例。 WCF会为您执行此操作 - 您只需设置PerCall

通常,客户端和服务器将处于不同的进程中。如果您认为这样,那么客户端代理的生命周期不会控制服务的生命周期。

答案 1 :(得分:0)

您在客户端上调用dispose,而不是在服务器上调用。因为您的WCF服务是按请求配置的,所以即使客户端仍然存在,也会为每次调用创建和处理该类。

WCF默认调用服务中的Dispose。这是正常行为。如果服务实现IDisposable,则在销毁服务时调用Dispose