TCP服务作为WCF服务

3
我有一个基于TCP的服务,想通过WCF公开。该服务API类似于TcpListener类(实际上是基于它),接受TCP连接作为客户端,并通过客户端类发送和接收派生自Stream的原始对象。我想创建一个WCF包装器,利用WCF序列化功能,允许发送和接收对象。
基本契约只包含两个操作:发送和接收,格式通常是无模式的,例如JSON,但客户端可以在连接时指定协议,因此我想准备好接受其中一些协议。
它也应该与SSL一起工作。目前,当我需要使用SSL时,我必须将TcpClient.GetStream()包装在SslStream中,但性能非常差。我希望不使用这种hack方式使用我的服务,并使用WCF SSL,类似于:
            <binding name="MyBinding">
               <security mode="Transport">
                 <transport clientCredentialType="Windows" />
                </security>
            </binding>   

这是我目前的疑问:

  1. 我需要创建什么?自定义传输还是自定义绑定?

  2. 是否有任何特殊实现方式可以允许WCF跟踪/管理我的服务或客户端连接的生命周期?

谢谢。


2
也许你应该把这个问题分开提问。 - lockstock
好的,它太宽了。 - vtortola
你看过提供的NetTcpBinding吗?从技术上讲,该绑定仅与.NET客户端和服务兼容,但也许你可以编写一个自定义绑定,在内部使用它来支持非.NET客户端。你可以创建一个具有Stream属性的数据契约类,并修改NetTcpBinding的Web配置以启用流请求支持。NetTcpBinding还支持像你上面的代码片段一样的SSL。 - ajawad987
我会看一下,这个想法似乎不错。 - vtortola
1个回答

1
  1. 您需要像示例中一样在绑定上创建安全设置。这个页面是有关WCF绑定安全设置的MSDN文章。我认为SSLStream包装器应该是处理这个问题的正确方式-我不确定为什么性能如此糟糕。您可以查看这个SO问题,了解由于缓冲不正确而导致SSLStream速度缓慢的情况。根据您如何使用套接字这个答案讨论了由于编码二进制数据的方式而导致的性能下降。如果您发送许多小消息,则此特定设置将非常缓慢。第二个SO链接建议使用类似Google的proto-buf库。

  2. 您所说的跟踪/管理生命周期是什么意思?您是否指超时陈旧的连接?我相信TCPListener已经处理了这个问题。

我知道我可能没有回答你的问题,但没有更多的细节很难确定缓慢的确切原因。

实际问题并不是SSL速度慢,而是如何从头开始创建TCP绑定或传输。 - vtortola
让我澄清一下我的意思 - 您可以使用您在问题中粘贴的设置配置WCF服务以具有传输安全性。这将使WCF服务处理所有SSL内容。您需要使用MSDN上关于WCF绑定和安全设置的链接文档,以了解确切的需求。您也可以像您在问题中尝试的那样使用SSLStream。在那种情况下,可能会有许多导致缓慢的原因,我在答案中尝试解释了其中的一些。 - Ben Echols

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接