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();
}
}
何时设置/断开TCP连接取决于创建/处理服务对象(MessageProcessor)的时间和数量。
WCF非常灵活,可以处理许多不同的模型。这些由服务的InstanceContextMode和ConcurrencyMode控制。这些可以在配置文件中设置,也可以在创建服务时在代码中设置。
InstanceContextMode控制何时创建服务对象。有三种选择。
1) 每次呼叫。每次客户端调用您的某个服务方法时,都会创建MessageProcessor的新实例。即使是同一个客户端调用两个方法,也会得到两个MessageProcessor对象。这是默认设置。
2) 每个会话:一些传输(如TCP)支持可靠的会话。客户端连接将启动新会话,并将创建MessageProcessor对象的实例。客户端可以调用许多方法,同一个实例将处理它们。当客户端断开连接时,对象将被销毁。请注意,许多客户端仍然会产生许多MessageProcessor对象(每个客户端都有自己的会话)。
3) 单个:所有服务调用都使用MessageProcessor对象的同一实例。只要服务主机处于活动状态,对象就会一直存在。
并发模式控制允许多少线程进入同一服务对象。例如,使用Single instanceContext,您可能允许在不同的线程上同时服务多个客户端调用,或者如果WCF不安全,您可能希望强制WCF一次只允许一个线程进入MessageProcessor。
假设您希望在客户端需要时保持TCP连接的有效性,这取决于您使用的InstanceContextMode,以及连接/断开TCP连接的位置和方式。例如,如果使用单一模式,您只需在创建服务主机时进行连接,并在主机关闭时断开连接。如果使用"每次呼叫"模式,您可能会在所有服务对象都被破坏时断开连接,或者等待一小段时间以防再次呼叫。这真的取决于您。