WCF Callback-Schnittstelle - Wer schließt den Kanal
Habe ich Probleme/Fragen schließen eine callback - /duplex-Kommunikationskanal.
Hier sind meine prototypischen WCF Schnittstellen:
[ServiceContract(CallbackContract = typeof(IMyInterfaceCallback))]
public interface IMyInterface
{
[OperationContract]
void StartWork();
}
public interface IMyInterfaceCallback
{
[OperationContract(IsOneWay = true)]
void WorkFeedback();
}
Auf der client-Seite erstelle ich meine WCF-Schnittstelle über:
DuplexChannelFactory<IMyInterface> dcf = new DuplexChannelFactory<IMyInterface>(implOfIMyInterfaceCallback, customBinding, ea);
IMyInterface myInterface = dcf.CreateChannel();
Auf der server-Seite, die ich dann verwenden
OperationContext.Current.GetCallbackChannel<IMyInterfaceCallback>();
abrufen der callback-Zeiger, die dann verwendet werden können, um die Kommunikation mit dem client.
Meine Fragen sind jetzt:
- Der sollte in der Nähe der Kommunikationskanal? Der client oder der server
- Die Kommunikation von Objekten geschlossen werden müssen? Die ursprüngliche Schnittstelle (IMyInterface) oder das callback-interface (IMyInterfaceCallback) oder beides.
Ich versuchte, schließen Sie die callback-Schnittstelle auf der server-Seite, zu der Zeit, wenn der server weiß, es wird nicht mehr Rückrufe.
Mit der ICommunicationObject::Schließen auf die callback-Schnittstelle jedoch resultierte in einer minute Blockierung der Bedienung.
Schließen auf der client-Seite ist meiner Meinung nach nicht der richtige Weg, da der client nicht wissen, ob es mehr Rückrufe zu erwarten.
Vielen Dank für jede Hilfe.
Frank
P. S.:
Dies scheint eine sehr grundlegende Frage, aber bisher fand ich keine hilfreichen Informationen bei der Suche über google oder im stackoverflow...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den DuplexChannel verwendet eine TCP-Verbindung unter der Haube, und das ist, wie es emuliert eine bidirektionale Kommunikation. Aber der client ist, der immer offen ist, die Verbindung, es ist also auch die Verantwortlichen für die Schließung als auch (Denke in ein TCP-socket). Daher sollten Sie die client-Schnittstelle IMyInterface (das ergibt sich aus IClientChannel), um es zu schließen.
Grüße
Pablo.
Sollte sich der client schließen Sie den service-Kanal (als normal).
Den callback-Kanal erworben durch GetCallbackChannel sollte NICHT geschlossen werden meiner Erfahrung nach (Siehe Verwandte Frage von mir: Brauche ich zum Schließen und/oder Entsorgen Sie die callback-Kanäle, die durch die OperationContext.Aktuelle.GetCallbackChannel?)
Beim schließen der Kanal, den Sie verwenden sollten das bevorzugte Muster:
Da der client (in der Regel) nicht wissen können, ob oder nicht alle Nachrichten sind noch im Gange, während versucht, schließen Sie den Kanal, das würde zu einer Ausnahme führen.