gpt4 book ai didi

.net - 为什么即使我不调用服务的 Dispose() 方法也会调用它? (使用 BasicHttpBinding)

转载 作者:行者123 更新时间:2023-12-02 00:22:16 24 4
gpt4 key购买 nike

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

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

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

在 proxy2 上,我再次调用 MyMethod() 操作 3 次,除了这次我没有强制转换和调用 Dispose()。当我运行服务器/客户端时,我得到了 6 次相同的痕迹:

Server's Trace + CurrentThread ID
MyMethod()'s Trace + CurrentThread ID
Dispose()'s Trace + CurrentThread ID

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

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

最佳答案

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

对于服务器,每个服务对象的生命周期由ServiceBehaviourInstanceContextMode控制。如果将其设置为 PerCall,则每次调用都会创建和销毁服务类的新实例。 WCF 为您做这件事 - 您只需设置 ServiceBehaviour

一般情况下,客户端和服务端会在不同的进程中。如果您这样想,那么客户端代理的生命周期不控制服务的生命周期是有道理的。

关于.net - 为什么即使我不调用服务的 Dispose() 方法也会调用它? (使用 BasicHttpBinding),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10419100/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com