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

C# 通过套接字发送自定义WCF请求,c#,.net,wcf,sockets,tcp,C#,.net,Wcf,Sockets,Tcp,关于这个话题,我已经看到一些问题只回答了一半。 我想向我的自托管WCF应用程序发送一个请求,该应用程序使用NetTcpBinding。 问题是,我必须使用插座 我已经编写了一个传输绑定元素,它在ChannelListener OnOpen上打开一个TcpListener 这很好,但在这种情况下,我必须使用自己的消息框架模型 显然,我不打算实现net.tcp消息框架模型 我读了一些帖子,其中建议我应该发送一个请求,并解释通过MessageEncoder/MessageInspector发送的字节

关于这个话题,我已经看到一些问题只回答了一半。 我想向我的自托管WCF应用程序发送一个请求,该应用程序使用NetTcpBinding。 问题是,我必须使用插座

我已经编写了一个传输绑定元素,它在ChannelListener OnOpen上打开一个TcpListener 这很好,但在这种情况下,我必须使用自己的消息框架模型

显然,我不打算实现net.tcp消息框架模型

我读了一些帖子,其中建议我应该发送一个请求,并解释通过MessageEncoder/MessageInspector发送的字节

这样,我基本上可以使用minor为我的每个方法/操作创建一条消息 每个请求的更改

我尝试了这种方法,当我使用来自ChannelFactory的WCF通道时,通过使用自定义MessageEncoder获得了有问题的字节

我保存了这些字节,并通过TcpClient发送它们-MessageEncoder不会启动

当我打开正常频道时:

        ChannelFactory<ITestService> factory = new ChannelFactory<ITestService>(new    NetTcpBinding(),
            "net.tcp://localhost:76599");

        factory.CreateChannel().DoSomething(string.Empty); //gets to MessageEncoder
有什么想法吗?

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

需要注意的是,端点uri必须是UTF-8编码的

这个过程非常简单-发送协商请求,发送结束前导消息0x0c,然后等待服务器返回前导确认消息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;

关于你的帖子,有一点我不清楚:为什么你必须使用套接字与服务器通信?另外,如果必须使用套接字,为什么不构建一个简单的套接字服务器呢?了解什么是激励你的不寻常需求可能有助于找到最好的解决方案。@ PaulKistist.我有几个客户已经通过不同的WCF绑定使用我的合同——我希望其他客户使用C++、java或MNO来连接到同一个WCF应用程序,这样我就可以不用我自己的框架模型来管理请求了。这样,我可以从客户端发送二进制数据,包装在WCF合同接口中,该接口将启动一个操作,然后通过我自己实现的通道返回我的响应。感谢您可能会想到的任何解决方案:显然,您可以通过添加SOAP或REST绑定的端点来轻松地创建功能性java或MNO客户端,可以在Windows上使用WCF来管理托管C++。至于NetTcp的跨平台实现,有趣的是,在您提供的链接上有一些来自微软的专利警告。很明显,你正以相当快的速度向上游游去。请参阅此问题了解一些背景信息:@PaulKeister使用SOAP或REST绑定与此无关,因为我需要使用基于tcp的传输来获得更好的性能。我的客户是由我公司以外的众多开发人员开发的,因此我需要能够提供他们可以使用的单一界面。创建公开合同的实现,构建net.tcp使用的二进制数据似乎是一个完美的解决方案。我不重建net.tcp消息框架模型的原因是为了避免与Microsoft发生问题。然而,读取发送到MessageEncoder的字节并从客户端发送相同的字节似乎是合乎逻辑的。显然,我对跨平台实现感兴趣。托管客户端当前使用另一个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;