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

2024-04-04

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

创建客户端,调用其方法,然后关闭它是正常使用吗?

如果您想重新使用该连接怎么办?对此有何限制?可以从不同线程同时调用吗?如果不能,是否必须自己进行连接池?当重新使用连接时,是否必须在调用之前检查连接状态并在出现故障时进行清理?


嗯,这是很多问题,而且情况确实有点复杂。创建客户端时,您可以通过服务引用并获取派生类来完成此操作ClientBase<ServiceContract>或者你可以使用ChannelFactory<ServiceContract>并手动创建通道(前一种情况在内部使用 ChannelFactory)。

这与你的问题有何关系?我们首先看一下真实的 TCP 连接。当你定义NetTcpBinding你可以设置它的MaxConnections属性(默认值为 10)。该属性定义池连接的数量。这意味着如果您创建到服务器的客户端通道并关闭该通道,连接不会立即终止。它在池中保持打开状态,直到被同一服务器的另一个打开的客户端通道使用或直到其空闲超时到期。您可以打开服务器允许的任意数量的连接,但仅限由MaxConnections一旦您关闭相关客户渠道,该费用将被集中。其他连接将立即终止。如果你创建CustomBinding你可以直接使用TCP传输,你也可以控制空闲超时(我认为默认是2分钟)。只要相关的连接被池化ChannelFactory没有被破坏=使用一个ChannelFactory每个应用程序(ClientBase内部做)。

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

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

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

Edit:

Yes ClientBase uses ChannelFactory内部。方式如何ChannelFactory用途随着时间的推移而改变。在 .NET 3.0 中,工厂是为每个ClientBase实例。由于 .NET 3.5 WCF 使用内部 MRU 缓存(最近使用的),它最多可缓存 32 个最近使用的工厂。要利用此缓存,您必须使用不带参数或带参数的代理构造函数endpointConfigurationName and remoteAddress / EndpointAddress。您不得在代码中创建端点 - 这些代理不使用缓存。有关该主题的更多信息是here http://blogs.msdn.com/b/wenlong/archive/2007/10/27/performance-improvement-of-wcf-client-proxy-creation-and-best-practices.aspx.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WCF TCP 客户端 - 如何使用它们的基本指南? 的相关文章

随机推荐

  • distanceFromLocation - 计算两点之间的距离

    只是一个关于核心位置的简单问题 我正在尝试计算两点之间的距离 代码如下 void locationChange CLLocation newLocation CLLocation oldLocation Configure the new
  • Python Tesseract 无法识别这种字体

    我有这个图像 我想使用 python 将其读取为字符串 我认为这并不难 我发现了 tesseract 然后是使用 tesseract 的 python 脚本的包装器 所以我开始阅读图像 效果很好 直到我尝试阅读这张图像 我是否需要训练它来读
  • Java中小型不可变对象的缓存策略?

    我正在开发一个应用程序 它创建大量小型 不可变的 Java 对象 一个例子可能是 public class Point final int x final int y final int z 许多 Point 实例可能需要引用相同的 x y
  • 在哪里使用带循环的 return 语句?

    有时我会感到困惑where使用return陈述 我明白它的作用 只是我没有正确理解它的位置 这是相同代码的简短示例 正确方法 def product list list of numbers c 1 for e in list of num
  • 使用 URI (Xamarin) 的 Android FFImageLoading

    我正在尝试从光标加载联系人图像 因此我有每个图像的 URI 但我想使用 FFImageLoading 库将这些图像添加到视图中 以便我可以轻松加载占位符并进行圆形变换 但是 我在使用具有 URI 的库时遇到困难 我尝试使用 Path 将 U
  • android:如何从twitter获取趋势?

    我想从 Twitter 获取趋势 任何人都可以帮我解决这个问题吗 我已经使用以下方式登录了login button并且获得了活跃的会话 现在问题是如何获取趋势标签 https dev twitter com rest reference g
  • 如何在 Rmarkdown 演示文稿(滑动)中回显代码之前显示块输出?

    我最近开始在 Rmarkdown 中使用 Slidy 演示模板 并且喜欢每张幻灯片如何允许您向下滚动以获取更多内容 我使用它的一种方法是与我的学生共享绘图 请参阅下面的示例代码 在一张幻灯片上 我可以显示绘图以及用于创建绘图的确切代码 可以
  • 为什么 VSCode 在启动调试器之前不激活 conda?

    当我在 VSCode 中启动调试器时 只有在调试过程因 缺少必需的依赖项 导入错误而停止后 conda 环境才会被激活 立即重新启动调试器就可以正常工作了 此问题发生在 Anaconda base 和其他环境中 测试代码 import pa
  • 使用 ui-router(AngularJS) 时,$rootScope.$on("$routeChangeSuccess) 或 $rootScope.$on("$stateChangeSuccess) 不起作用

    我在应用程序中使用 UI router 来嵌套视图 但同时我想在路由更改时监听事件 在使用 UI router 之前 routeChangeSuccess 触发得很好 但在 ui router 之后 它不会触发 文档建议使用 viewCon
  • 将csv字符串读入向量C++

    csv转vector有很多选项 包括读取 csv 文件并将其所有数据添加到 C 中的向量中 https stackoverflow com questions 60322479 read a csv file and and add its
  • 设计决策:(VB.NET)我应该创建一个类或模块来轻松连接到多个数据库之一吗?

    基本上 我们有三个数据库可以从中获取数据 一种是 SQL Server 数据库 一种是 Access 数据库 连接起来特别烦人 因为我们必须映射网络驱动器等 最后一个将是 Oracle 数据库 当 IT 最终授予我们权限时 我正在考虑创建一
  • 调试时无法进入迭代器块 (C#)

    我正在尝试调试从单元测试项目执行的代码 但是当我尝试进入一个方法时 它只是直接传递到下一行 并且不会命中该方法内的断点 该方法位于不同项目中的一个类上 但所有代码都是在调试模式下构建的 我已经尝试清理和重建解决方案 但没有任何乐趣 然而 自
  • 我可以在 Docker for Mac 中使用不安全的 Kubernetes API 端点吗?

    当我在 Docker for Mac 中运行 Kubernetes 时 Kube API 似乎只能从安全端点访问https 本地主机 6443 https localhost 6443 通过 minikube 我可以使用 Kube API
  • Sql CE 多条语句不一致

    长期以来 您确实可以使用 SQL CE 执行多个语句 https stackoverflow com questions 6970502 can i execute multiple statements in sql server com
  • 在 Windows 中执行全屏抓取

    我正在研究一个想法 涉及全面捕获屏幕 包括窗口和应用程序 对其进行分析 然后将项目作为叠加层绘制回屏幕上 我想学习图像处理技术 如果我可以直接访问 Windows 屏幕 我可以获得大量的数据来处理 我可以用它来构建以前从未见过的自动化工具
  • 获取分离片段中的上下文/活动?

    有一个类似的问题 https stackoverflow com questions 20464273 get the application context in fragment in android大多数答案建议使用在哪里getAct
  • 未捕获的类型错误:使用 $.param() 序列化传单数据时无法读取未定义的属性“lat”

    我想先说一下 我对 JavaScript 很陌生 我正在尝试使用 Leaflet 和 AJAX 调用来发布用户位置和地图边界 在我的事件处理程序中stateUpdater onLocationFound日志语句打印出正确的用户坐标和地图边界
  • 具有后备功能的 HTML5 视频标签

    我正在寻找在 html 中嵌入视频和音频的解决方案 新的 videotag 支持 ogg 和 mp4 但是否有针对 flv 和其他格式的后备解决方案 例如 如果我想嵌入一个 ogg 它会检查是否支持html5 如果不支持 它会使用后备 如果
  • 是否可以创建一个 git 存储库,其中分支是来自其他存储库的克隆?

    情况如下 我继承了两台独立的机器 一台用于 开发 另一台是生产机器 问题是 它们当然不同步 为了使情况更加清晰 我在每台计算机上创建了应用程序目录的独立 git 存储库 我现在希望能够比较这些存储库 以便找出它们之间的不同之处 我的想法是创
  • WCF TCP 客户端 - 如何使用它们的基本指南?

    我有一个 WCF 服务并希望使用 TCP 绑定连接到它 这一切都很好 但是你应该如何处理客户呢 我注意到 如果您为每个调用创建一个新客户端 它不会重新使用该通道 并会留下一堆 TCP 连接 直到超时 创建客户端 调用其方法 然后关闭它是正常