【问题标题】:Why is my service's Dispose() method called even when I don't invoke it? (using BasicHttpBinding)为什么即使我不调用我的服务的 Dispose() 方法,它也会被调用? (使用 BasicHttpBinding)
【发布时间】:2012-05-02 17:53:46
【问题描述】:

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

在我的客户端中,我使用 ChannelFactory 创建了两个代理。在 proxy1 上,我调用了 3 次 MyMethod() 操作,然后有几行代码用于处理 proxy1:

var castedProxy = (IDisposable)proxy1;
castedProxy.Dispose();

在 proxy2 上,我再次调用 MyMethod() 操作 3 次,但这次我不强制转换并调用 Dispose()。当我运行服务器/客户端时,我得到了 6 次相同的跟踪:

服务器的跟踪 + 当前线程 ID
MyMethod() 的 Trace + CurrentThread ID
Dispose() 的 Trace + CurrentThread ID

我的问题是:为什么跟踪的Dispose() 部分每次都会发生,即使我只使用前 3 个跟踪?我的猜测是,这与使用 BasicHttpBinding 时本身没有会话管理这一事实有关,因此旧资源仍然存在,打印旧的 Dispose() 调用。

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的快速和有见地的回复!绝对 100% 回答了我的问题。 :D
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-07-08
      • 1970-01-01
      • 2021-04-16
      • 1970-01-01
      • 1970-01-01
      • 2018-04-15
      • 1970-01-01
      • 2015-12-13
      • 1970-01-01
      相关资源
      最近更新 更多