如何将基于套接字的客户端与 WCF (net.tcp) 服务一起使用?
Posted
技术标签:
【中文标题】如何将基于套接字的客户端与 WCF (net.tcp) 服务一起使用?【英文标题】:How to use socket based client with WCF (net.tcp) service? 【发布时间】:2010-10-07 10:57:08 【问题描述】:我开发了一个使用 net.tcp 适配器并监听特定端口的 WCF 服务。我想使用普通的 .net 客户端连接到该服务,该客户端使用套接字将数据发送到端口并监听响应。 当我尝试向该服务发送数据时,出现错误:“现有连接被远程主机强制关闭”。 但是,我可以通过另一个使用 WCF 服务的地址/绑定/合同的客户端连接该服务。 有没有一种方法可以让我使用基于普通套接字的客户端与 WCF 服务进行通信?
【问题讨论】:
为了确保每个人都明白您在这里要做什么...请澄清一下您是否尝试使用 .NET 中的内置套接字编程工具连接到网络。 Tcp WCF 服务,反之亦然? EnocNRoll,你说得对。我正在尝试使用基于套接字的客户端与基于 net.tcp 的 WCF 服务进行通信。 【参考方案1】:关键决定是让WCF服务符合socket客户端还是让socket客户端符合WCF服务。
尝试遵循 WCF 服务将是最简单的,而不是尝试在 WCF 中实现一些自定义的东西,这绝非易事。在下面的“其他资源”部分的底部,您将看到一个链接,该链接描述了尝试符合 WCF 服务所必需的消息检查。
话虽如此,.NET 套接字本身并不与 WCF 通信。
任何尝试这样做都需要在 WCF 方面进行自定义编程。
无论您是使用 TcpClient 还是 .NET 中的原始套接字连接到 WCF 并与之通信都无关紧要。任何此类互操作性都必须使用 WCF 中的自定义逻辑进行处理。请注意,Net.Tcp 是一种自定义传输协议。从技术上讲,它使用 TCP 的方式与 TcpClient 不同。
例如,UDP 是 Linux 世界中的套接字服务器非常常用的。 WCF 不提供内置的 UDP 传输。但是,有一个为 WCF 实现 UDP 的 WCF UDP 示例。不幸的是,该示例没有说明与非 WCF UPD 套接字服务器之间的通信。
我有一个非常详细的悬而未决的问题,我在其中解释了我为使示例代码普遍可测试以使用 UDP...
Is it possible to make the WcfTestClient work for custom transport channels?
还没有人回答我的问题。所以,如果你成功地完成了这项工作,我很感兴趣。我的案例是希望 WCF 服务能够调用在 Linux 上运行的 UDP 套接字服务器,而不必使用非 WCF 编码使我的服务混乱。我不想混合方法。
其他资源...
选择传输本文指出“WCF TCP 传输针对 两端的场景 通信正在使用 WCF”。
http://msdn.microsoft.com/en-us/library/ms733769.aspx
尝试将非 WCF 客户端连接到 WCF 服务 使用 BasicHttpBinding。 开发人员最终编写自定义代码 通过 WebClient(而不是 TcpClient)。http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/c2d72c2d-c095-4ae1-b8ae-d15f32a4e0be/
WCF 与原始 .NET 套接字答案指出 TCP + 二进制序列化或 UDP + 二进制 可能需要序列化。那里 是一个 UDP 绑定示例,因为我 上面提到过。http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/c0520111-c1ca-4ffd-a4e0-ac68e86130ee/
将自定义请求写入简单 WCF 服务作者解释了如何找出消息的格式 需要发送到服务,所以 TcpClient 或其他非 WCF 套接字客户端可以发送写入 WCF 服务的信息。这 这里的含义是你不是 试图符合 WCF 服务,而是你在强迫 套接字客户端做重 起重。即使这样,你也没有得到 WCF 的内在优势 如果您期望绑定 http://blogs.msdn.com/carlosfigueira/archive/2008/01/13/writing-custom-requests-to-simple-wcf-services.aspx
【讨论】:
但是你批评了精彩的 WCF,所以你需要被带到外面拍摄:) - 不过我要 +1。 谢谢,我尽量让我的答案有用,如果它们有任何不正确,我总是会更新它们。我也将它们视为我个人知识的参考,而不仅仅是 *** 上的要点。 很好的答案 EnocNRoll。非常令人印象深刻。一个明确的 +1 ;) 我对这个问题投了赞成票,所以现在你有足够的声望来投票了。你只有 11 个,但需要 15 个。现在你有 21 个了。欢迎使用 ***。 所以继续尝试你的新能力,重新尝试支持我的答案。谢谢。【参考方案2】:Net.TCP 绑定使用了一种自定义的线级框架格式,虽然 Nicholas Allen 最近开始了一系列关于该主题的博客文章,但该格式并没有真正记录在案。系列从这里开始:http://blogs.msdn.com/drnick/archive/2009/01/19/message-framing-part-1.aspx
说实话,Net.TCP 目前确实对 WCF 到 WCF 的通信更有用。如果您想与需要处理的自定义 TCP 格式进行互操作,最好使用原始套接字或创建自己的自定义 WCF 传输通道(顺便说一句,这可能不是微不足道的)
【讨论】:
有据可查,请参阅 [MC-NMF] .NET 消息帧协议规范。【参考方案3】:喂,
您是否启用了 WCF 跟踪?因为如果你这样做并且你收到以下消息:“该服务不允许你匿名登录。”那么它(通常)是一个安全设置问题。
在这种情况下,禁用绑定的安全模式:
<netTcpBinding>
<binding name="MyCustomBinding">
<security mode="None" />
</binding>
</netTcpBinding>
但最好使用证书。
【讨论】:
以上是关于如何将基于套接字的客户端与 WCF (net.tcp) 服务一起使用?的主要内容,如果未能解决你的问题,请参考以下文章