通过套接字发送自定义WCF请求

时间:2012-09-07 00:48:19

标签: c# .net wcf sockets tcp

我已经看到了一些关于这个主题的问题。 我想向我的自托管WCF应用程序发送请求,该应用程序使用NetTcpBinding。 问题是,我必须使用套接字。

我写了一个传输绑定元素,它打开一个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

任何想法?

1 个答案:

答案 0 :(得分: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;