gpt4 book ai didi

WCF TCP 客户端——关于如何使用它们的基本指南?

转载 作者:可可西里 更新时间:2023-11-01 02:30:35 24 4
gpt4 key购买 nike

我有一个 WCF 服务,想使用 TCP 绑定(bind)连接到它。这一切都很好,但是你应该如何处理客户呢?我注意到,如果您为每次调用创建一个新客户端,它不会重新使用该 channel 并留下一堆 TCP 连接,直到它们超时。

创建一个客户端,在上面调用一个方法,然后关闭它是否正常使用?

如果你想重新使用连接怎么办?有什么限制?你能从不同的线程同时调用吗?如果不能,是否必须自己做连接池?并且在重新使用连接时,是否必须在调用之前检查连接状态并在出现故障时清理它?

最佳答案

嗯,这是很多问题,情况确实有点复杂。当你创建一个客户端时,你可以通过服务引用来完成它,并获得从 ClientBase<ServiceContract> 派生的类。或者你可以使用 ChannelFactory<ServiceContract>并手动创建 channel (前一种情况在内部使用 ChannelFactory)。

这与您的问题有什么关系?让我们首先看看真正的 TCP 连接。当您定义 NetTcpBinding你可以设置它的MaxConnections属性(默认为 10)。此属性定义池连接数。这意味着如果您创建到服务器的客户端 channel 并关闭该 channel ,则连接不会立即终止。它在池中保持打开状态,直到它被另一个打开的客户端 channel 使用到同一服务器或直到它的空闲超时到期。您可以打开服务器允许的尽可能多的连接,但只能打开 MaxConnections 定义的连接数一旦您关闭相关的客户 channel ,将被汇集在一起​​。其他连接将立即终止。如果您创建 CustomBinding您可以直接使用 TCP 传输,您还可以控制空闲超时(我认为默认值为 2 分钟)。只要相关的 ChannelFactory 连接就会被合并未被销毁 = 使用一个 ChannelFactory每个应用程序(ClientBase 在内部执行)。

现在让我们谈谈 channel 本身,因为它与您的其他问题有关。 WCF 区分全 session 和无 session channel 。 TcpTransportChannel是全 session 的。这意味着一旦您打开 channel ,您就会创建一个 session 。 session 意味着来自单个客户端代理的所有请求在默认情况下始终由相同的服务实例(每个 session 实例)提供服务。但是实例默认是单线程的。这意味着您可以让多个线程使用同一个代理,但该服务将按顺序处理请求。如果您希望您的服务同时处理多个请求,您必须将其标记为 [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple] .完成后,您负责服务中的线程安全处理(多个线程访问同一服务实例)。

session channel 有一个很大的缺点。服务上的任何故障或异常都会中断 channel ,您通常会在尝试再次使用 channel 后知道这一点(异常表示 channel 处于故障状态且无法使用)。您必须始终正确处理这些情况,并且一旦您不想使用它们就必须正确关闭 channel /代理,或者一旦它们出现故障就中止它们。无法修复故障 channel - 它必须中止并且您必须创建新的代理/ channel 。如果您不这样做,我不确定连接是否会返回到池中。

重用代理/ channel 取决于您正在构建的应用程序类型。我绝对不会在 Web 应用程序的多个请求中重用代理/ channel ,但在 WinForm 或 WPF 应用程序中重用绝对没问题。

编辑:

ClientBase使用 ChannelFactory在内部。顺便怎么了ChannelFactory被使用随着时间的推移而改变。在 .NET 3.0 中,为每个 ClientBase 创建了工厂。实例。由于 .NET 3.5 WCF 使用内部 MRU 缓存(最近使用),它缓存最多 32 个最近使用的工厂。要利用此缓存,您必须使用不带参数或带有 endpointConfigurationName 的代理构造函数和 remoteAddress/EndpointAddress .您不得在代码中创建端点 - 这些代理不使用缓存。有关该主题的更多信息是 here .

关于WCF TCP 客户端——关于如何使用它们的基本指南?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6218838/

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