3

我正在学习 .NET Web 服务简介课程,我们目前正在学习的其中一件事是 IDisposable 接口。作为一个相对简单的例子,我创建了一个带有MyMethod()操作的服务(服务器/客户端)。该方法在调用时仅打印一条跟踪语句。我还在我的服务器上实现了 IDisposable Dispose(),再次在服务器实现的版本中使用简单的 WriteLine 跟踪来实现该方法。

在我的客户端中,我使用 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() 调用。

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

4

2 回答 2

3

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

对于服务器,每个服务对象的生命周期InstanceContextModeServiceBehaviour. 如果设置为PerCall,则将为每次调用创建和销毁服务类的新实例。WCF 为您执行此操作 - 您只需设置ServiceBehaviour.

通常,客户端和服务器将处于不同的进程中。如果你这样想,客户端代理的生命周期并不能控制服务的生命周期是有道理的。

于 2012-05-02T18:09:53.477 回答
0

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

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

于 2012-05-02T18:09:39.257 回答