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 客户端 - 如何使用它们的基本指南? 的相关文章

  • WCF 服务绑定采用默认值而不是自定义值

    我已经构建了一个 APi 它是一个 WCF 服务 在服务的 web config 中 我指定了一个自定义 bindong 如下所示
  • WCF:如何诊断故障通道?

    我正在为我的实验室进行一项更改 希望能够帮助诊断我们所看到的一些奇怪的通道故障现象 有一个测试应用程序使用 DuplexChannelFactory 连接到几个 Windows 服务 并且由于某种原因 该测试应用程序上的通道似乎出现了很多故
  • Silverlight 套接字:模仿框架 Bind、Listen 和 Accept 方法?

    我有这个 NET Framework C 类 它实际上充当 TCP 连接的包装器Socket http msdn microsoft com en us library attbb8f5 aspxSystem Net Sockets 命名空
  • 如何使用C从http下载文件?

    最近几天我试图弄清楚如何从 URL 下载文件 这是我对套接字的第一个挑战 我用它来了解协议 所以我想在没有 cURL 库的情况下只用 C 语言来完成它 我搜索了很多 现在我可以打印页面的源代码 但我认为这与文件不同 我不必只将接收到的数据从
  • 如何启动WCF语音聊天应用程序?

    我正在寻找开发 WCF 语音聊天应用程序 我想使用 WCF 服务来构建应用程序 Invite gt OK lt gt Audio flow lt
  • 使用 wsHttpBinding 时,为什么 InstanceContextMode.PerSession 的行为类似于 PerCall?

    我有 AJAX 客户端使用 SOAP 1 2 使用的 WCF 服务 网页配置
  • PHP 通过 TCP/IP 发送消息

    我尝试通过 TCP IP 从 PHP 网站向 Arduino 发送消息 使用以下代码我可以从 php 网站发送消息 问题是 当第一次调用该网站时 消息不会立即发送 网站刷新几次后 消息就会到达 但逻辑上很多次 就像网站刷新量一样 已经尝试将
  • 无法在 Visual Studio 2010 IDE 中添加启用 HTTPS 的 WCF 服务作为服务引用

    通过 Visual Studio 2010 IDE 添加启用 HTTPS 的 WCF 服务作为服务引用时 出现以下异常 下载 https abc cloudapp net DataService svc 时出错 请求失败 HTTP 状态为
  • WCF Xml 与二进制序列化的优缺点

    我知道如果我将二进制序列化与 WCF 一起使用 我就会失去互操作性 如果我愿意接受这一点 我想知道使用二进制比 Xml 是否有效率优势 如果还有我上面没有提到的其他优点和缺点 是的 可能是一个大事件 XML 序列化数据比二进制数据要大 使用
  • 10G 链路的 netcat 和 iperf 结果存在巨大差异

    我很困惑看到 netcat 和 iperf 结果之间的巨大差异 我有 10 G 链路连接我的服务器和客户端 iperf 的速度约为 10Gb s 但 netcat 的速度仅为约 280 MB s 可能是什么错误 对于 Iperf Serve
  • 将大文件返回为拆分 zip 文件、流或字节数组 WCF 的最佳方法

    我已经将 zip 文件流返回给客户端 如下所示MessageContract MessageContract public class ExportResult C MessageHeader public PackedStudy C Pa
  • 使用 Rx 简化异步 Silverlight Web 服务请求

    我已经使用 Rx 为我的 WCF Web 服务编写了一个简化的 Silverlight 客户端库 但是我注意到有时我会丢失已完成的事件 public IObservable
  • TCP 校验和可能无法检测到错误吗?如果是的话,这件事是如何处理的?

    如果 TCP 有效负载在传输过程中被损坏 则重新计算的校验和将与传输的校验和不匹配 太好了 到目前为止一切都很好 如果 TCP 校验和在传输过程中损坏 则重新计算的校验和将与现在损坏的校验和不匹配 太好了 到目前为止一切都很好 当有效负载和
  • 如何在运行时通过 URL 使用 WCF Web 服务?

    我想通过 URL 访问服务中公开的所有方法 如果假设 URL 为 http localhost MyService MyService svc 我如何访问方法 如果假设我有一个 ServiceReference 如果没有服务参考号该怎么办
  • 使用 netMSMQ 绑定进行有序交付

    使用 WCF netMSMQbinding 时是否可以保证有序交付 我们将一个插入命令后跟多个更新命令放在同一个队列上 有时其中一个更新会击败插入命令 添加了广泛的日志记录后 很明显它们正在以正确的顺序添加到队列中 并以不同的顺序进行处理
  • 无法在 Windows 8 上的 IIS 中提供 WCF 服务

    当我尝试在 Windows 8 计算机中的 IIS 上提供 WCF 服务时 出现众所周知的错误 由于扩展配置的原因 无法提供您请求的页面 如果页面是脚本 请添加处理程序 如果应下载该文件 请添加 MIME 映射 旧的解决方法是运行aspne
  • WCF 和 n 层架构以及序列化性能

    当使用 WCF 服务作为接口层使用 5 层架构 前端 gt 接口层 gt 业务层 gt 数据库层 gt 数据库 时 让客户端应用程序调用它的方法 我是否也应该使用 WCF 服务业务层和数据库层 我问是因为 3 个服务之间进行的所有序列化 反
  • 如何在没有 ASP.NET 的情况下从 json 客户端调用 .NET AuthenticationService

    我有一个 WCF 4 服务 位于安全子文件夹中 在客户端使用 NET AuthenticationService 使用表单身份验证进行身份验证后可以访问该服务 此 WCF 服务适用于通过 json 进行通信的移动应用程序客户端 但不是 AS
  • PHP WCF 集成

    是不是如果我想支持php客户端访问我的服务 我必须有一个基本的http端点 这是因为php仍然只支持soap 1 1吗 据我所知 自从我使用 PHP 以来已经两年了 情况仍然如此 如果客户端应用程序将使用 PHP 的内置 SoapClien
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe

随机推荐

  • 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 连接 直到超时 创建客户端 调用其方法 然后关闭它是正常