WCF中托管的TCP保持活动连接

本文关键字:活动 连接 TCP WCF | 更新日期: 2023-09-27 18:29:04

我正试图在与第三方应用程序通信的wcf服务中托管TCP客户端连接。WCF服务将包装对第三方应用程序的tcp调用,以便任何连接到WCF服务的应用程序都不知道tcp连接。由于第三方应用程序需要的协议,tcp连接必须保持活动状态。我已经实现了处理错误和重新连接的逻辑,但我遇到的问题是如何打开和关闭这个连接。我有没有办法覆盖主机的Open和Close调用,这样我就可以对我的CommunicationService执行同样的操作?

我的代码:

public partial class HostService : ServiceBase
{
    private ServiceHost _host;
    public HostService()
    {
        InitializeComponent();
    }
    protected override void OnStart(string[] args)
    {
        Type serviceType = typeof(MessageProcessor);
        var serviceUri = new Uri("http://localhost:9091/");
        _host = new ServiceHost(serviceType, serviceUri);
        _host.Open();
    }
    protected override void OnStop()
    {
        _host.Close();
    }
}
[ServiceContract]
public interface IMessageProcessor
{
    [OperationContract]
    void ProcessMessage(string message);
}
public class MessageProcessor : IMessageProcessor
{
    //This is handling my TCP connection.
    private CommunicationService _communicationService;
    public MessageProcessor()
    {
        _communicationService = new CommunicationService();
    }
    public void ProcessMessage(string message)
    {
        if(_communicationService.Connected)
        {
            var request = new QueryMessage();
            var result = _communicationService.TransmitMessage(request);
        }
        else
        {
            //Error handling, not necessary for now
        }
    }
    //I want to do this
    public override Open()
    {
        _communicationService.Open();
    }
    public override Close()
    {
        _communicationService.Close();
    }
}

WCF中托管的TCP保持活动连接

何时设置/断开TCP连接取决于创建/处理服务对象(MessageProcessor)的时间和数量。

WCF非常灵活,可以处理许多不同的模型。这些由服务的InstanceContextMode和ConcurrencyMode控制。这些可以在配置文件中设置,也可以在创建服务时在代码中设置。

InstanceContextMode控制何时创建服务对象。有三种选择。

1) 每次呼叫。每次客户端调用您的某个服务方法时,都会创建MessageProcessor的新实例。即使是同一个客户端调用两个方法,也会得到两个MessageProcessor对象。这是默认设置。

2) 每个会话:一些传输(如TCP)支持可靠的会话。客户端连接将启动新会话,并将创建MessageProcessor对象的实例。客户端可以调用许多方法,同一个实例将处理它们。当客户端断开连接时,对象将被销毁。请注意,许多客户端仍然会产生许多MessageProcessor对象(每个客户端都有自己的会话)。

3) 单个:所有服务调用都使用MessageProcessor对象的同一实例。只要服务主机处于活动状态,对象就会一直存在。

并发模式控制允许多少线程进入同一服务对象。例如,使用Single instanceContext,您可能允许在不同的线程上同时服务多个客户端调用,或者如果WCF不安全,您可能希望强制WCF一次只允许一个线程进入MessageProcessor。

假设您希望在客户端需要时保持TCP连接的有效性,这取决于您使用的InstanceContextMode,以及连接/断开TCP连接的位置和方式。例如,如果使用单一模式,您只需在创建服务主机时进行连接,并在主机关闭时断开连接。如果使用"每次呼叫"模式,您可能会在所有服务对象都被破坏时断开连接,或者等待一小段时间以防再次呼叫。这真的取决于您。