我开发了一个使用net.tcp适配器并侦听特定端口的WCF服务。我想使用普通的.net客户端连接到该服务,该客户端使用套接字将数据发送到端口并监听响应。
当我尝试向此服务发送数据时,我收到错误:“现有连接被远程主机强行关闭”。
但是,我能够通过另一个使用WCF服务的地址/绑定/合同的客户端连接该服务。
有没有一种方法可以让我通过使用普通的基于套接字的客户端与WCF服务进行通信?
答案 0 :(得分:51)
关键决定是否使WCF服务符合套接字客户端,或者是否使套接字客户端符合WCF服务。
尝试符合WCF服务最简单,而不是尝试在WCF中实现自定义内容,这绝非易事。在下面的“其他资源”部分的底部,您将看到一个链接,该链接描述了尝试符合WCF服务所必需的消息检查。
话虽如此,.NET套接字本身并不与WCF通信。
任何尝试这样做都需要在WCF方面进行自定义编程。
无论您是使用.NET中的TcpClient还是原始套接字连接到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“。
尝试将非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
服务,但你是强迫
socket客户端做的很重
吊装。即便如此,你还是得不到
WCF的内置优势
绑定如果你期待
这一点。
http://blogs.msdn.com/carlosfigueira/archive/2008/01/13/writing-custom-requests-to-simple-wcf-services.aspx
答案 1 :(得分:6)
Net.TCP绑定使用的是一种自定义的线级框架格式,虽然尼古拉斯·艾伦最近在该主题上发布了一系列关于该主题的博客文章。该系列从这里开始:http://blogs.msdn.com/drnick/archive/2009/01/19/message-framing-part-1.aspx
说实话,Net.TCP目前对WCF到WCF通信更有用。如果你想与你需要处理的自定义TCP格式互操作,你最好使用原始套接字或创建自己的自定义WCF传输通道(这可能不是微不足道的,顺便说一句)
答案 2 :(得分:0)
HY,
您启用了WCF跟踪吗?因为如果您这样做并且您收到以下消息:“该服务不允许您匿名登录。”然后(通常)是安全设置问题。
在这种情况下,请禁用绑定的安全模式:
<netTcpBinding>
<binding name="MyCustomBinding">
<security mode="None" />
</binding>
</netTcpBinding>
但更好的方法是使用证书。