Ich habe eine WCF-Implementierung und ich hosten es innerhalb Windows-Dienst (selbst gehostet). Ich benutze Callback-Vertrag, um einige Ereignisse auf der Clientseite auszulösen.
Die Frage ist, wie kann ich sicher sein, oder überprüfen, dass der Client noch am Leben ist, um sein Rückruf-Ereignis auszulösen. Gibt es einen Überprüfungsmechanismus? Ich benutze .NET 3.5.
Danke.Wie erkennen, ob Client für Rückruf in WCF lebt?
3
A
Antwort
0
Es gibt keine eingebauten Weg.
Wenn der Client nicht verfügbar ist, um den Rückruf zu verarbeiten, wird der Dienst entweder hängen bleiben oder eine Ausnahme auslösen, wenn er versucht, den Client-Rückruf aufzurufen (abhängig vom Status des Rückrufkanals).
Ein mögliche Lösung für dieses Problem ist here
0
Mein Ansatz für das gleiche Problem einer „DefaultCallback“ Klasse erstellen sollte, die den Callback-Schnittstelle implementiert und nichts tun (es keine Not ImplmentedException natürlich werfen) . Dann können Sie ein Stück Code wie folgt schreiben:
private IServiceCallBack[] GetCallBack()
{
var returnValue = new IServiceCallBack[1];
var com = (ICommunicationObject)(returnValue[0] = OperationContext.Current.GetCallbackChannel<IServiceCallBack>());
com.Closing += new EventHandler((object sender, EventArgs e) =>
{
returnValue[0] = new DefaultCallBack();
});
com.Faulted += new EventHandler((object sender, EventArgs e) =>
{
returnValue[0] = new DefaultCallBack();
});
return returnValue;
}
Also, wenn der Rückruf-Client in geschlossenen oder fehlerhaften Zustand ist, wird es durch einen konformen Objekt ersetzt, das nichts tut.
Ich möchte es anmutig erkennen. Ich möchte es nicht von einer Ausnahme abhängig machen. Kann ich den Callback-Vertrag einfach an ICommunicationObject übergeben und dann seinen Status überprüfen? Würde es funktionieren? – Fer
Es tut mir leid, dass ich die Antwort darauf nicht kenne. –
Danke @hugh. Ich werde CallingContract zu ICommunicationObject umwandeln und prüfen, ob der Status offen ist. Übrigens wird eine bessere Lösung geschätzt. – Fer