Ich kann den Leistungsvorteil eines Duplex-Async-Anrufs nicht leugnen, aber einige Dinge lassen mich vorsichtig sein.
Mein Anliegen ist, dass WCF bei einem Client-Objekt, das instanziiert wurde, erkennen kann, welche bestimmte Client-Service-Instanz das Callback-Argument erhalten soll?
Kann mir jemand sagen, ob das eine gute Idee ist? Wenn nicht warum nicht?
%Vor%Wenn der obige virtuelle Pfad reserviert ist, kann er verworfen werden. Ich möchte, dass die Lebensdauer des Client-Service ziemlich kurz ist. IE eine Anfrage machen und eine Antwort erhalten und wenn fertig erhalten, töte es. Wie schlimm ist die Leistungseinbuße, wenn es darum geht, die Lebensdauer des Client-Dienstes kurz zu halten, anstatt sie zu bündeln und länger am Leben zu erhalten.
Die Idee ist, Zeitüberschreitungen zu vermeiden. Wenn fertig Empfangen, Senden, Entsorgen Sie so schnell wie möglich. Per Konvention - kann die Client-Dienste nicht weitergeben. Wenn Sie Informationen benötigen, erstellen Sie eine neue, einfache - genau wie EF / L2S etc.
Wie kann ich innerhalb des WCF-Dienstes selbst die Sitzung mit dem Client beenden? dh. Ich möchte nicht, dass der Client die Sitzung beendet - ich weiß, dass ich meine Operation entsprechend anpassen kann, aber ich möchte, dass sich der Dienst programmatisch beendet, wenn bestimmte Bedingungen erfüllt sind.
Ich kann den Port anbringen und entsprechend weiterleiten, um ein Firewall-Problem zu lösen, aber ich mache mir Sorgen, wenn der Client hinter einem Lastenausgleichssystem sitzen würde. Wie würde der Dienst wissen, welcher bestimmte Server angerufen wird?
Ich denke, am Ende ist Duplex Services einfach eine weitere fehlgeschlagene Architektur von Microsoft. Dies ist eines der Dinge, die auf dem Papier wirklich gut aussahen, aber bei genauerer Betrachtung einfach auseinanderfallen.
Es gibt zu viele Schwächen:
1) Sich auf die Sitzung verlassen, um Client-Listener vom Server einzurichten. Dies ist Sitzungsinformation wird im Speicher gespeichert. Daher kann der Server selbst nicht ausgeglichen werden. Oder wenn es Lastenausgleich gibt, müssen Sie die IP-Affinität aktivieren, aber jetzt, wenn einer der Server bombardiert wird, können Sie nicht einfach einen anderen hinzufügen und erwarten, dass alle diese Sitzungen automatisch auf den neuen Server migriert werden.
2) Für jeden Client, der hinter einem Router / Firewall / Loadbalancer sitzt, muss ein neuer Endpunkt mit einem bestimmten Port erstellt werden. Andernfalls kann der Router die Rückrufnachrichten nicht ordnungsgemäß an den entsprechenden Client weiterleiten. Eine Alternative besteht darin, einen Router zu haben, der eine benutzerdefinierte Programmierung ermöglicht, um einen bestimmten Pfad zu einem bestimmten Server umzuleiten. Wieder eine große Bestellung. Oder ein anderer Weg ist für den Client mit dem Callback, seine eigene Datenbank zu hosten und Daten über eine Datenbank zu teilen & lt; - Könnte in einer Situation funktionieren, in der Lizenzgebühren kein Problem sind ..., aber es bringt eine Menge Komplexität und so beschwerlich auf dem Client und es mischt die Anwendung und Dienste Ebene zusammen (was in einigen außergewöhnlichen Situation akzeptabel sein kann, aber nicht zu den großen Setup-Kosten)
3) All das sagt im Grunde, dass Duplex praktisch nutzlos ist. Wenn Sie einen Rückruf benötigen, sollten Sie einen Client auf der Client-Seite einrichten. Es wird einfacher und viel besser skalierbar sein. Außerdem gibt es weniger Kopplung zwischen Client und Server.
Die beste Duplex-Lösung für skalierbare Architekturen verwendet am Ende keine.
Es hängt davon ab, wie kurz Sie die neu hinzugekommenen Kunden benötigen und wie lange sie dauern werden. Pooling wäre keine Option, wenn Sie jedes Mal einen neuen Client benötigen, aber wenn die Clients das gleiche tun, warum nicht einen Pool von ihnen warten, um verwendet zu werden, wenn sie den gleichen Client erneut erstellen.
>In einem Callback-Szenario, in dem der Dienst den Client zurückruft (um wirklich eine Funktion auf dem Client aufzurufen), um Informationen weiterzuleiten, ist der Dienst jetzt der Client und umgekehrt. Sie können den Dienst haben, der den Rückruf durchführt. Schließen Sie die Verbindung, aber sie bleibt geöffnet, bis der GC über diese Verbindung verfügen kann. Aus meiner Erfahrung kann das länger dauern als erwartet. Kurz gesagt sollte der Client verantwortlich sein (der Client ist derjenige, der den Anruf zu etwas macht), um sich selbst abzuschalten oder die Verbindung zu unterbrechen, der Dienst sollte nur Antworten geben oder Daten von einem Client übernehmen.
Bei Duplex-Callbacks ruft der Service, der jetzt zum Client zurückruft, die Adresse des Clients hinter der Duplexchannelfactory ab. Wenn der Dienst den Client nicht zurückrufen kann, glaube ich nicht, dass es viel zu tun gibt. Sie müssen sicherstellen, dass der Port, den Ihre Clients für den Dienst anrufen, für Rückrufe geöffnet ist, denke ich.
Tags und Links wcf .net c# architecture duplex