Gruppieren von Nachrichten in der Warteschlange einer Sitzung
Windows Communication Foundation (WCF) stellt eine Sitzung bereit, mit der verwandte Nachrichten gruppiert und von einer empfangenden Anwendung verarbeitet werden können. Die Nachrichten in einer Sitzung müssen Teil der gleichen Transaktion sein. Da alle Nachrichten Teil der gleichen Transaktion sind, wird die gesamte Sitzung zurückgesetzt, wenn eine Nachricht nicht verarbeitet werden kann. Sitzungen weisen ähnliche Verhaltensweisen bezüglich Warteschlangen für unzustellbare Nachrichten und Warteschlangen für potenziell schädliche Nachrichten auf. Die Time to Live (TTL)-Eigenschaft einer Bindung in der Warteschlange, die für Sitzungen konfiguriert wurde, wird auf die gesamte Sitzung angewendet. Wenn nur ein Teil der Nachrichten in der Sitzung vor Ablauf der TTL gesendet wird, wird die gesamte Sitzung in der Warteschlange für unzustellbare Nachrichten abgelegt. Analog wird ggf. die gesamte Sitzung in der Warteschlange für potenziell schädliche Nachrichten abgelegt, wenn Nachrichten in einer Sitzung nicht von der Anwendungswarteschlange an eine Anwendung gesendet werden können.
Beispiel für das Gruppieren von Nachrichten
Das Gruppieren von Nachrichten kann beispielsweise hilfreich sein, wenn Sie eine Anwendung für die Auftragsverarbeitung als WCF-Dienst implementieren. Angenommen, ein Client sendet einen Auftrag an diese Anwendung, die eine Anzahl von Elementen enthält. Der Client ruft für jedes Element den Dienst auf. Dadurch wird jeweils eine separate Nachricht gesendet. Es kann sein, dass Server A das erste Element empfängt und Server B das zweite. Immer, wenn ein Element hinzugefügt wird, muss der Server, der das Element verarbeitet, die entsprechende Reihenfolge ermitteln, und das Element muss hinzugefügt werden. Dieser Vorgang ist nicht sehr effizient. Dieses Problem tritt auch dann auf, wenn alle Anfragen nur von einem Server behandelt werden, da der Server alle Aufträge überwachen muss, die derzeit verarbeitet werden, und das neue Element einem Auftrag zugeordnet werden muss. Durch das Gruppieren aller Anforderungen für einen Auftrag wird die Implementierung einer solchen Anwendung stark vereinfacht. Alle Elemente für einen Auftrag werden von der Clientanwendung in einer Sitzung gesendet, sodass der Auftrag vom Dienst in einer Sitzung verarbeitet werden kann. \
Prozeduren
So richten Sie einen Dienstvertrag für Sitzungen ein
Definieren Sie einen Dienstvertrag, der eine Sitzung erfordert. Verwenden Sie dazu das OperationContractAttribute-Attribut, und geben Sie Folgendes an:
SessionMode=SessionMode.Required
Markieren Sie die Vorgänge im Vertrag als unidirektional, da von diesen Methoden nichts zurückgegeben wird. Verwenden Sie dazu das OperationContractAttribute-Attribut, und geben Sie Folgendes an:
[OperationContract(IsOneWay = true)]
Implementieren Sie den Dienstvertrag, und geben Sie einen InstanceContextMode von PerSession an. Dadurch wird der Dienst für jede Sitzung nur einmal instanziiert.
[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]
Jeder Dienstvorgang erfordert eine Transaktion. Verwenden Sie das OperationBehaviorAttribute-Attribut für die Angabe. Der Vorgang, mit dem die Transaktion abgeschlossen wird, sollte auch TransactionAutoComplete auf true festlegen.
[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
Konfigurieren Sie einen Endpunkt, der die vom System bereitgestellte NetProfileMsmqBinding-Bindung verwendet.
Erstellen Sie eine Transaktionswarteschlange mit System.Messaging. Sie können die Warteschlange auch mit Message Queuing (MSMQ) oder MMC erstellen. Erstellen Sie in diesem Fall eine Transaktionswarteschlange.
Erstellen Sie mit ServiceHost einen Host für den Dienst.
Öffnen Sie den Diensthost, um den Dienst verfügbar zu machen.
Schließen Sie den Diensthost.
So richten Sie einen Client ein
Erstellen Sie einen Transaktionsbereich zum Schreiben in die Transaktionswarteschlange.
Erstellen Sie den WCF-Client mit dem ServiceModel Metadata Utility Tool (Svcutil.exe)-Tool.
Platzieren Sie den Auftrag.
Schließen Sie den WCF-Client.
Beispiel
Beschreibung
Im folgenden Beispiel wird der Code für den IProcessOrder-Dienst sowie für einen Client bereitgestellt, der diesen Dienst verwendet. Es wird veranschaulicht, wie WCF die Gruppierungsfunktion mit Warteschlangensitzungen bereitstellt.