【问题标题】:Sending custom WCF requests via Sockets通过套接字发送自定义 WCF 请求
【发布时间】: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 终结点。再次感谢:)

标签: c# .net wcf sockets tcp


【解决方案1】:

终于搞定了。
在发送通过 MessageEncoder 获得的字节之前,我为 Net.Tcp 连接启动了默认握手。

请务必注意,端点 uri 必须采用 UTF-8 编码。

这个过程非常简单 - 发送协商请求,发送 End Preamble 消息(0x0C)并等待服务器返回 Preamble Ack 消息(0x0B)。

然后您可以发送二进制信封并接收来自 WCF 应用程序的响应。

我希望这篇文章可以在将来对某人有所帮助。

NegotiationConsts.Via via = new NegotiationConsts.Via(uri);
int arraySize = via.EndpointString.Length + 
NegotiationConsts.DefaultRequestLength;

byte[] request = new byte[arraySize];

int count = 0;
request[count++] = NegotiationConsts.Version.RECORD_TYPE;
request[count++] = NegotiationConsts.Version.MAJOR_VERSION;
request[count++] = NegotiationConsts.Version.MINOR_VERSION;

request[count++] = NegotiationConsts.Mode.RECORD_TYPE;
request[count++] = NegotiationConsts.Mode.DUPLEX;

request[count++] = NegotiationConsts.Via.RECORD_TYPE;
request[count++] = via.Length;
via.EndpointString.CopyTo(request,count);
count+=via.EndpointString.Length;

request[count++] = NegotiationConsts.WCFEncoding.RECORD_TYPE;
request[count++] = NegotiationConsts.WCFEncoding.BINARY_ENCODING;

return request;

【讨论】:

    猜你喜欢
    • 2012-05-27
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    • 2011-06-10
    相关资源
    最近更新 更多