管理频繁调用的WCF连接

时间:2010-08-13 22:59:23

标签: vb.net wcf

也许我在这里缺少一些基本的东西,所以如果我是的话,请纠正我。我有一个本地服务和一个通过WCF进行通信的WinForms应用程序,但我似乎最终在我的应用程序中有很多代码副本:

Public Shared Sub MyLocalMethod1()
    Dim tcpBinding As New NetTcpBinding
    tcpBinding.SendTimeout = New TimeSpan(0, 0, 5)

    Dim tcpFactory As ChannelFactory(Of MyWCFClass.MyWCFInterface) = New  _
                        ChannelFactory(Of MyWCFClass.MyWCFInterface)(tcpBinding, "net.tcp://localhost:4079")

    Dim ServiceWCFConnection As MyWCFClass.MyWCFInterface = tcpFactory.CreateChannel

    ServiceWCFConnection.MyWCFMethod1()

    tcpFactory.Close()

End Sub

我应该在某种辅助类中创建连接,让我的服务使用它,然后关闭连接,所以我没有这个连接代码的多个副本。但是,我应该打开这个连接,还是每次关闭它都有意义? WinForm通常每隔几秒就调用一次服务,因此尝试拥有一个可以分别访问所有这些不同调用的公共副本更有意义,而不是每次都打开关闭新连接。

1 个答案:

答案 0 :(得分:1)

这取决于您的需求,因为两种方法都是正确的。您可以将频道创建代码包装成一些帮助器。您将拥有与单个位置一起使用相同的功能来编辑频道创建代码(DRY原则)。服务的使用较慢,因为每次调用都会创建新的TCP连接。使用一些一次性帮助程序类来表示您创建的连接。

如果您决定在整个应用程序中使用单通道(代理),则必须考虑一些新的复杂性。您正在使用Net.Tcp绑定创建传输会话 - TCP连接将长时间存在。此外,WCF服务实例将与连接同时存在,因为默认实例化模式是PerSession。因此,单个服务实例将处理来自客户端的所有请求=您的服务将变为有状态。此外,当您使用打开的通道进行多次调用时,您必须测试通道的状态 - 网络问题,服务器问题,超时或未处理的异常会将通道切换到故障状态 - 此类通道和相关服务实例不能再使用。你必须中止这样的频道并开启新频道。