2010-12-06 16 views
3

Bei asynchronen WCF-Serviceanrufen kann (und muss) der Service den empfangenen Rückruf ausführen. Dies ist im Allgemeinen APM sinnvoll, aber im WCF-Fall wird der Callback tatsächlich auf der Client-Seite ausgeführt, was bedeutet, dass der Server in essense Client-seitigen Code ausführen konnte.Wie werden Callbacks in WCF implementiert?

Kann jemand etwas Licht darauf werfen, wie dies implementiert wird? Wenn zum Beispiel eine HTTP-Bindung verwendet wird, wenn der Dienst den Rückruf ausführt, beginnt er eine HTTP-Antwort zurückzusenden, die der WCF-Client als Nachricht zur Ausführung des Rückrufs deserialisiert, und die Antwort wird mit der Rückkehr der End-Methode des asynchrone Operation? Kann der Service den Rückruf zweimal anrufen

Vielen Dank!

Bearbeiten: Nur um sicherzustellen, dass ihre nicht Verwirrung ist, frage ich nicht über Rückrufe mit Duplex-Verträgen, aber die AsyncCallback in einem Vertrag wie folgt (http://msdn.microsoft.com/en- us/library/ms731177.aspx):

+0

+1 Jetzt, da ich verstehe, dass Sie über async Implementierung von Operationen auf der Service-Seite gefragt habe, merke ich, dass "was ist der Callback-Parameter" und "Was sind die Regeln für was die Service-Implementierung sollte damit tun - z Was passiert, wenn ich zweimal aufrufe? " sind sehr interessante Fragen. Siehe http://piers7.blogspot.com/2009/09/implementing-asynchronous-operations-in.html für ein bisschen mehr dazu. Eine Sache, die ich denke, ist klar: der Rückruf ruft nicht clientseitigen Code auf - es ist Code im WCF-Service-Dispatcher-Stack. –

Antwort

4

Rückrufe mit HTTP-Protokoll werden als Composite-Duplex-Kommunikation (WS-DualHttpBidning) implementiert. Es bedeutet, dass sich beide Seiten auf unterschiedlichen Transportverbindungen gegenseitig anrufen. Wenn der Client den Dienst aufruft, sendet er eine HTTP-Anforderung. Der Dienst verarbeitet die Anforderung und speichert einen Rückrufkanal für die spätere Verwendung. Dann gibt es eine HTTP-Antwort zurück, die nur die initiierende Anfrage bestätigt. Es löst keinen Rückruf aus. Der Callback wird vom Service durch Aufruf der Operation auf dem Callback-Kanal ausgelöst. Es erstellt eine HTTP-Anfrage, die vom Server an den Client gesendet wird. Der Client führt eine Rückrufoperation aus und gibt eine HTTP-Antwort an den Server zurück.

Dieser Kommunikationsfluss verwendet ein Zweiwege-Nachrichtenaustauschmuster, aber Duplexkommunikation verwendet normalerweise Einwegnachrichten. Der Server kann den Client-Rückruf so oft aufrufen, wie er benötigt (die Auswirkungen von Client- und Inaktivitätszeitlimit beeinflussen dies).

Für die Duplex-Kommunikation müssen sowohl Client als auch Server erreichbar sein (Firewall-Einstellungen für beide Seiten). Auf dem HTTP-Client wird ein eigener Endpunkt angezeigt, der sich wie ein anderer Webdienst verhält. Im Gegensatz dazu hat net.tcp einen Vollduplex-Kommunikationskanal, so dass sowohl Server-Anrufe als auch Rückruf-Cqlls auf derselben TCP-Verbindung ausgeführt werden.

Edit:

Sorry, ich habe Ihre Frage nicht verstehen. Async-Vorgänge (AsyncPattern) sind auf dem Server implementiert - die Implementierung erfolgt vollständig vom Client aus (umschlossen von der WCF-Dienstarchitektur). Der Client kommuniziert im allgemeinen HTTP-Anfrage/Antwort-Muster, und der Dienst kann für jede Anfrage nur eine einzige Antwort senden.

WCF unterstützt zwei asynchrone Verarbeitungsebenen - Async-Aufrufe und Async-Vorgänge. Ersteres ist auf dem Client implementiert und Dienst weiß nichts darüber, das spätere ist auf dem Dienst implementiert und der Client weiß nichts darüber. Diese Ansätze werden oft in Beispielen kombiniert, die Verwirrung stiften können.

Jeder Ansatz hat seinen eigenen Ansatz. Async-Aufrufe ermöglichen den nicht blockierenden Dienstaufruf, bei dem der Client andere Vorgänge ausführen kann, während der Dienst die Anforderung verarbeitet (die Benutzeroberfläche friert nicht ein). Asynchrone Operationen dienen der besseren Skalierbarkeit von stark genutzten Diensten.Sync-Ausführung blockiert den WCF-Verarbeitungsthread, bis die Ausführung abgeschlossen ist, während die asynchrone Ausführung das Zurückgeben des Verarbeitungsthreads an den Threadpool ermöglicht (damit eine andere Anforderung verarbeitet werden kann), während der Vorgang zeitaufwendige Operationen ausführt - normalerweise IO- oder Netzwerkkommunikation.

+0

Das klingt nicht richtig - also sind asynchrone WCF-Vorgänge standardmäßig Duplex-Kommunikation? Ich möchte Sie jedoch ausdrücklich dazu bringen, einen Vertrag als Doppelvertrag zu definieren. Dies hat dieselben Probleme wie das, was ich oben erwähnt habe (Berechtigungen, Firewalls usw.), bist du dir sicher? – SpeksETC

2

Im Wesentlichen ist die Kommunikation identisch mit dem Serveraufruf. Die "Client" -Seite hat grundsätzlich einen Endpunkt mit dem Callback-Vertrag, so dass der "Server" sie aufrufen kann. Keine Magie.

+0

Das hört sich nicht richtig an - Sie sagen, dass der Server, um den Callback des Clients auszuführen, eine weitere HTTP-Anfrage erstellt und diese an den Client sendet? Was ist, wenn der Client nicht berechtigt ist, einen Socket zu öffnen und auf eingehende Anforderungen zu warten? Was passiert, wenn der Client hinter einem Router/einer Firewall/etc steht? – SpeksETC

+0

versuchen Sie es. Wenn es keinen Kommunikationsmechanismus gibt, wird es nicht passieren. –

1

Der WCF-Client-Stapel ruft die Rückrufmethode auf, wenn er die HTTP-Antwort vom Server empfängt. Wie Alex Lo sagte, merkt der Server dies nicht - er weiß nicht einmal, dass der clientseitige Code Async-Aufrufe verwendet: Alles, was er sieht, ist eine HTTP-Anfrage.

Ich habe die blutigen Details nicht untersucht, aber ich stelle mir vor, dass der Rückruf an einem IO-Completion-Port erfolgt.

Verwandte Themen