Ich versuche, eine TCP-Clientverbindung in einem WCF-Dienst zu hosten, der mit einer Drittanbieter-App kommuniziert. Der WCF-Dienst wickelt die TCP-Aufrufe an die Drittanbieteranwendung um, sodass jede Anwendung, die eine Verbindung mit dem WCF-Dienst herstellt, keine Kenntnis von der TCP-Verbindung hat. Aufgrund des Protokolls, das die Drittanbieter-App benötigt, muss die TCP-Verbindung am Leben erhalten werden. Ich habe die Logik implementiert, um Fehler zu behandeln und die Verbindung wiederherzustellen, aber das Problem, mit dem ich konfrontiert bin, ist, wie ich diese Verbindung öffne und schließe. Gibt es eine Möglichkeit für mich, die offenen und schließenden Anrufe des Hosts zu überschreiben, so dass ich dasselbe mit meinem CommunicationService machen kann?TCP Keep Alive-Verbindung gehostet in WCF
Mein Code:
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();
}
}
Was erwarten Sie, wenn zwei Clients (und damit zwei Threads) gleichzeitig versuchen, Ihre 'ProcessMessage'-Methode (und im Prinzip auch Ihre TCP-Verbindung) aufzurufen? –
Welchen InstanceContextMode verwenden Sie für Ihren Service? Dies wird die Lebensdauer und mögliche mehrere Instanzen von MessageProcessor stark bestimmen. – GazTheDestroyer
KirkWoll, ich habe Logik innerhalb meiner Kommunikationsklasse, um Multithreading zu handhaben.Ich stehe Nachrichten an und gebe ihnen Priorität basierend auf ihrem Typ. GazTheDestroyer, ich fürchte, ich bin mir nicht sicher, was Sie meinen, das ist das erste Mal, dass ich mit WCF gearbeitet habe. Was mache ich nicht ideal? Gibt es einen besseren Weg, dies zu tun? – jtiger