我已经看到了一些关于这个主题的问题。 我想向我的自托管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
任何想法?
答案 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;