1

我已经看到一些关于这个主题的问题没有得到回答。我想向使用 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

当我通过套接字尝试相同时:

        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

有任何想法吗?

4

1 回答 1

0

终于让它工作了。
在发送通过 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-09-08T15:01:10.660 回答