【发布时间】:2012-09-07 00:48:18
【问题描述】:
我看到一些关于这个主题的问题没有得到回答。 我想向使用 NetTcpBinding 的自托管 WCF 应用程序发送请求。 问题是,我必须使用套接字。
我编写了一个传输绑定元素,它打开一个 TcpListener(在 ChannelListener OnOpen 上) 这很好用,但在这种情况下 - 我将不得不使用我自己的消息框架模型。
显然,我不会实现 net.tcp 消息框架模型(http://msdn.microsoft.com/en-us/library/ff470920%28v=prot.10%29.aspx)
我已经阅读了一些帖子(包括 http://blogs.msdn.com/b/carlosfigueira/archive/2008/01/13/writing-custom-requests-to-simple-wcf-services.aspx),这些帖子建议我应该发送一个请求并解释通过 MessageEncoder/MessageInspector 发送的字节。
这样,我基本上可以为我的每个方法/操作创建一条消息(带有次要 根据请求更改)
我尝试了这种方法,当我使用 WCF 通道(来自 ChannelFactory)时,我得到了有问题的字节(通过使用自定义 MessageEncoder)。
我已经保存了这些字节,并通过 TcpClient 发送它们 - MessageEncoder 不会启动。
当我打开一个普通频道时:
ChannelFactory<ITestService> factory = new ChannelFactory<ITestService>(new NetTcpBinding(),
"net.tcp://localhost:76599");
factory.CreateChannel().DoSomething(string.Empty); //gets to MessageEncoder
当我通过 Sockets 尝试相同的操作时:
TcpClient cli = new TcpClient("localhost", 76599);
byte[] fileArray = File.ReadAllBytes("c:\\fileFromMessageEncoder.bin");
cli.GetStream().Write(fileArray, 0, fileArray.Length); // Does not get to MessageEncoder
有什么想法吗?
【问题讨论】:
-
您的帖子有一点我不清楚:为什么必须使用套接字与服务器通信?另外,如果你必须使用套接字,为什么不构建一个简单的套接字服务器呢?了解激发您不寻常需求的原因可能有助于找到最佳解决方案。
-
@PaulKeister 我有一些客户端已经在使用我的合约(通过不同的 wcf 绑定)-我希望其他客户端(使用 c++、Java 或 Mono)能够连接到同一个 WCF 应用程序,所以我可以在不使用自己的框架模型的情况下管理请求。这样,我可以发送二进制数据(来自客户端,包装在 WCF Contract 接口中),它会启动一个操作,然后通过我自己实现的 Channel 返回我的响应。提前感谢您可能想到的任何解决方案:)
-
显然,您可以通过添加带有 SOAP 或 REST 绑定的端点相当轻松地创建功能性 Java 或 Mono 客户端(您可以在 Windows 上将 WCF 用于(托管)C++)。至于 NetTcp 的跨平台实现,有趣的是,您提供的链接上有一些来自 Microsoft 的专利警告。很明显,你正以相当快的水流逆流而上。有关一些背景信息,请参阅此问题:stackoverflow.com/questions/6459619/…
-
@PaulKeister 使用 SOAP 或 REST 绑定不相关,因为我需要使用基于 tcp 的传输以获得更好的性能。我的客户是由我公司以外的众多开发人员开发的,所以我需要能够提供一个他们可以使用的单一接口。创建一个暴露的 Contract 的实现,它构建 net.tcp 使用的二进制数据似乎是完美的解决方案.我不重建 net.tcp 消息框架模型的原因是为了避免与 Microsoft 的问题。但是,读取发送到 MessageEncoder 的字节并从客户端发送相同的字节似乎是合乎逻辑的。
-
显然我对跨平台实现很感兴趣。托管客户端当前使用另一个 WCF 终结点。再次感谢:)