gpt4 book ai didi

wcf - ChannelFactory.Close VS IClientChannel.Close

转载 作者:行者123 更新时间:2023-12-03 08:41:02 27 4
gpt4 key购买 nike

考虑以下代码,它是许多 ChannelFactory 示例的典型代码:

WSHttpBinding myBinding = new WSHttpBinding();
EndpointAddress myEndpoint = new EndpointAddress(
ConfigurationSettings.AppSettings["HelloWorldServiceURL"]);

ChannelFactory<IHelloWorldService> myChannelFactory =
new ChannelFactory<IHelloWorldService>(myBinding, myEndpoint);

IHelloWorldService proxy = myChannelFactory.CreateChannel();
((IClientChannel)proxy).Open();
HelloWorldDataContract dc = proxy.SayHello();
((IClientChannel)proxy).Close();

请注意,调用 proxy.Open() 时, channel 的状态和 ChannelFactory 的状态都变为“已打开”。当调用 proxy.Close() 时, channel 的状态变为“关闭”,但 ChannelFactory 的状态保持为“打开”。

是否也应该关闭 ChannelFactory?我似乎在很多例子中都没有看到这一点。此外,如果可能,请解释打开 channel 与打开 channel 工厂之间的区别。

此外,我知道 IDisposable issue ,因此除非它对答案有直接影响,否则为了这个问题可能可以忽略它。

最佳答案

我发现主要答案不准确,所以我在这里回复。

很明显微软做了一个绝对一团糟出 channel 和工厂和客户。文档也没有帮助,因为它们似乎只是为了掩盖困惑,所以我不得不求助于测试。

由于非缓存 channel 的性能问题,v3.5 中的实现发生了变化解决这些问题并添加缓存,但这只会使问题复杂化。

重点是ChannelFactory中的 channel 实际上和IClientChannel使用的 channel 没有区别当您使用 ChannelFactory.CreateChannel() 创建 channel 时.都是同一个锅。不信?尝试:

ChannelFactory<IService> factory = new ChannelFactory<IService>();
// ...
IService service = factory.CreateChannel();
factory.Close();
service.DoIt() // Throws object disposed exception

所以实际上,在内部它都是同一个 channel 。我个人已经开始处理 channel 工厂而不是客户端 channel ,并且没有遇到任何问题。我也尝试在循环中创建 100000 个客户端 channel ,并且只关闭 ChannelFactory .

关于wcf - ChannelFactory.Close VS IClientChannel.Close,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/866302/

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