Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Thema wird erläutert, wie Clients Dienste adressieren, die aus Warteschlangen gelesen werden und wie Dienstendpunkte Warteschlangen zugeordnet werden. Zur Erinnerung: Die folgende Abbildung zeigt die klassische Anwendungsbereitstellung mit Warteschlangen unter Windows Communication Foundation (WCF).
Damit der Client die Nachricht an den Dienst senden kann, adressiert er die Nachricht an die Zielwarteschlange. Damit der Dienst Nachrichten aus der Warteschlange lesen kann, legt er als Abhöradresse die Zielwarteschlange fest. Die Adressierung in WCF ist auf URI (Uniform Resource Identifier)-basiert, während Message Queuing (MSMQ)-Warteschlangennamen nicht URI-basiert sind. Daher ist es wichtig zu verstehen, wie Warteschlangen, die in MSMQ mithilfe von WCF erstellt wurden, adressiert werden.
MSMQ-Adressierung
MSMQ verwendet Pfade und Formatnamen, um eine Warteschlange zu identifizieren. Pfade spezifizieren einen Hostnamen und ein QueueName
. Optional kann zwischen dem Hostnamen und dem Private$
eine private Warteschlange QueueName
angegeben werden, die nicht im Active Directory-Verzeichnisdienst veröffentlicht wird.
Pfadnamen werden "FormatNames" zugeordnet, um zusätzliche Aspekte der Adresse zu bestimmen, einschließlich Routing und Übertragungsprotokoll des Warteschlangen-Managers. Der Warteschlangen-Manager unterstützt zwei Übertragungsprotokolle: systemeigenes MSMQ-Protokoll und SOAP Reliable Messaging Protocol (SRMP).
Weitere Informationen zu MSMQ-Pfad- und Formatnamen finden Sie unter About Message Queuing.
NetMsmqBinding und Dienstadressierung
Beim Adressieren einer Nachricht an einen Dienst wird das Schema im URI basierend auf dem für die Kommunikation verwendeten Transport ausgewählt. Jeder Transport in WCF verfügt über ein eindeutiges Schema. Die Regelung muss die Art des Verkehrs widerspiegeln, der für die Kommunikation verwendet wird. Beispiel: net.tcp, net.pipe, HTTP usw.
Der MSMQ-Warteschlangentransport in WCF stellt ein net.msmq-Schema zur Verfügung. Alle Nachrichten, die mithilfe des net.msmq-Schemas adressiert werden, werden mithilfe von NetMsmqBinding
über den MSMQ-Warteschlangen-Transportkanal gesendet.
Die Adressierung einer Warteschlange in WCF basiert auf dem folgenden Muster:
net.msmq: // <Hostname> / [private/] <Warteschlangenname>
wo:
< Hostname> ist der Name des Computers, auf dem die Zielwarteschlange gehostet wird.
[privat] ist optional. Sie wird verwendet, wenn eine Zielwarteschlange adressiert wird, bei der es sich um eine private Warteschlange handelt. Um eine öffentliche Warteschlange zu adressieren, dürfen Sie nicht "privat" angeben. Beachten Sie, dass im Gegensatz zu MSMQ-Pfaden im WCF-URI-Formular kein "$" vorhanden ist.
< queue-name> ist der Name der Warteschlange. Der Warteschlangenname kann auch auf eine Unterwarteschlange verweisen. Folglich gilt: <queue-name> = <name-of-queue>[;sub-queue-name].
Beispiel1: Um eine private Warteschlange PurchaseOrders zu adressieren, die auf dem Computer abc.adatum.com gehostet wird, lautet der URI net.msmq://abc.adatum.com/private/PurchaseOrders.
Beispiel 2: Um eine öffentliche Warteschlange "AccountsPayable" zu adressieren, die auf computer def atadatum.com gehostet wird, lautet der URI net.msmq://def.adatum.com/AccountsPayable.
Die Warteschlangenadresse wird vom Listener als Abhör-URI zum Lesen von Nachrichten verwendet. Die Warteschlangenadresse entspricht also dem Listenport des TCP-Sockets.
Ein Endpunkt, der aus einer Warteschlange liest, muss die Adresse der Warteschlange unter Verwendung des Schemas angeben, das zuvor beim Öffnen des ServiceHost angegeben wurde. Beispiele finden Sie unter Net MSMQ Binding.
Mehrere Verträge in einer Warteschlange
Nachrichten in einer Warteschlange können unterschiedliche Verträge implementieren. In diesem Fall ist es wichtig, dass eine der folgenden Bedingungen erfüllt ist, um alle Nachrichten erfolgreich zu lesen und zu verarbeiten.
Geben Sie einen Endpunkt für einen Dienst an, der alle Verträge implementiert. Dies ist der empfohlene Ansatz.
Geben Sie mehrere Endpunkte mit unterschiedlichen Verträgen an, stellen Sie jedoch sicher, dass alle Endpunkte dasselbe
NetMsmqBinding
Objekt verwenden. Die Dispatchlogik in ServiceModel verwendet ein Nachrichtensystem, das Nachrichten aus dem Transportkanal für den Dispatch ausliest, der schließlich für die Nachrichten auf der Grundlage des Vertrags ein De-Multiplexing mit anderen Endpunkten ausführt. Es wird ein Nachrichtensystem für ein Abhör-URI-/Bindungspaar erstellt. Die Warteschlangenadresse wird von dem Warteschlangenlistener als Abhör-URI verwendet. Wenn alle Endpunkte dasselbe Bindungsobjekt verwenden, wird sichergestellt, dass eine einzelne Nachrichtenpumpe eingesetzt wird, um die Nachricht zu lesen und auf Grundlage des Vertrags an die relevanten Endpunkte zu verteilen.
SRMP-Nachrichten
Wie zuvor erläutert, können Sie das SRMP-Protokoll für Übertragungen zwischen Warteschlangen einsetzen. Dies wird häufig verwendet, wenn ein HTTP-Transport Nachrichten zwischen der Übertragungswarteschlange und der Zielwarteschlange überträgt.
Um das SRMP-Übertragungsprotokoll zu verwenden, adressieren Sie Nachrichten mit dem net.msmq-URI-Schema, wie bereits erwähnt, und geben Sie die Auswahl von SRMP oder sicheren SRMP in der Eigenschaft von QueueTransferProtocol
im NetMsmqBinding
an.
Das Angeben der QueueTransferProtocol
-Eigenschaft wirkt sich nur auf das Senden aus. Dies ist ein Hinweis des Clients, welche Art von Warteschlangenübertragungsprotokoll verwendet werden soll.
Verwenden von Active Directory
MSMQ bietet Unterstützung für die Active Directory-Integration. Wenn MSMQ mit Active Directory-Integration installiert wird, muss der Computer Teil einer Windows-Domäne sein. Active Directory wird verwendet, um Warteschlangen für die Ermittlung zu veröffentlichen; solche Warteschlangen werden als öffentliche Warteschlangen bezeichnet. Bei der Adressierung einer Warteschlange kann die Warteschlange mithilfe von Active Directory aufgelöst werden. Dies ähnelt der Verwendung von DNS (Domain Name System), um die IP-Adresse eines Netzwerknamens aufzulösen. Die UseActiveDirectory
Eigenschaft in NetMsmqBinding
ist ein boolescher Wert, der angibt, ob der in die Warteschlange eingereihte Kanal Active Directory verwenden muss, um den Warteschlangen-URI aufzulösen. Standardmäßig ist dies auf false
festgelegt. Wenn die UseActiveDirectory
Eigenschaft auf true
festgelegt ist, verwendet der in die Warteschlange eingereihte Kanal Active Directory, um den URI net.msmq:// in den Formatnamen zu konvertieren.
Die UseActiveDirectory
Eigenschaft ist nur für den Client aussagekräftig, der die Nachricht sendet, da sie verwendet wird, um die Adresse der Warteschlange beim Senden von Nachrichten aufzulösen.
Zuordnen des net.msmq-URI zu Message Queuing-Formatnamen
Der in der Warteschlange stehende Kanal verarbeitet die Zuordnung des net.msmq-URI-Namens, der für den Kanal bereitgestellt wurde, zu MSMQ-Formatnamen. In der folgenden Tabelle sind die Regeln zusammengefasst, die für die Zuordnung zwischen ihnen verwendet werden.
WCF-URI-basierte Warteschlangenadresse | Verwenden Sie die Active Directory-Eigenschaft | Queue Transfer Protocol-Eigenschaft | Resultierende MSMQ-Formatnamen |
---|---|---|---|
Net.msmq://<machine-name>/private/abc |
False (Standardwert) | Systemeigen (Standardwert) | DIRECT=OS:machine-name\private$\abc |
Net.msmq://<machine-name>/private/abc |
Falsch | SRMP | DIRECT=http://machine/msmq/private$/abc |
Net.msmq://<machine-name>/private/abc |
Richtig | Einheimisch |
PUBLIC=some-guid (die GUID der Warteschlange) |
Lesen von Nachrichten aus der Dead-Letter-Warteschlange oder der Poison-Message-Warteschlange
Zum Lesen von Nachrichten aus einer Warteschlange für potenziell schädliche Nachrichten, bei der es sich um eine Unterwarteschlange der Zielwarteschlange handelt, öffnen Sie den ServiceHost
mit der Adresse der Unterwarteschlange.
Beispiel: Ein Dienst, der aus der Warteschlange für potenziell schädliche Nachrichten der privaten PurchaseOrders-Warteschlange auf dem lokalen Computer liest, würde net.msmq://localhost/private/PurchaseOrders;poison adressieren.
Zum Lesen von Nachrichten aus einer transaktionalen Systemwarteschlange für unzustellbare Nachrichten muss der URI folgendes Format haben: net.msmq://localhost/system$;DeadXact.
Zum Lesen von Nachrichten aus einer nicht transaktionalen Systemwarteschlange für unzustellbare Nachrichten muss der URI folgendes Format haben: net.msmq://localhost/system$;DeadLetter.
Wenn Sie eine benutzerdefinierte Warteschlange für unzustellbare Nachrichten verwenden, beachten Sie, dass sich die Warteschlange für unzustellbare Nachrichten auf dem lokalen Computer befinden muss. Deshalb ist der URI für die Warteschlange für unzustellbare Nachrichten auf das folgende Format beschränkt:
net.msmq: //localhost/ [private/] <custom-dead-letter-queue-name>.
Ein WCF-Dienst überprüft, ob alle empfangenen Nachrichten an die bestimmte Warteschlange adressiert wurden, auf die er lauscht. Wenn die Zielwarteschlange der Nachricht nicht mit der Warteschlange übereinstimmt, in der sie gefunden wird, verarbeitet der Dienst die Nachricht nicht. Dies ist ein Problem, das Dienste, die eine Warteschlange für unzustellbare Nachrichten abhören, behandeln müssen, da alle Nachrichten in der Warteschlange für unzustellbare Nachrichten für eine andere Adresse bestimmt waren. Um Nachrichten aus einer Warteschlange für unzustellbare Nachrichten oder einer Warteschlange für potenziell schädliche Nachrichten zu lesen, muss ein ServiceBehavior
mit dem Any-Parameter verwendet werden. Ein Beispiel finden Sie unter "Warteschlangen für tote Buchstaben".
NetMsmqBinding und Dienstadressierung
Dies MsmqIntegrationBinding
wird für die Kommunikation mit herkömmlichen MSMQ-Anwendungen verwendet. Um die Zusammenarbeit mit einer vorhandenen MSMQ-Anwendung zu vereinfachen, unterstützt WCF nur die Formatnamenadressierung. Daher müssen nachrichten, die mit dieser Bindung gesendet werden, dem URI-Schema entsprechen:
msmq.formatname:<MSMQ-format-name>>
Der MSMQ-Formatname entspricht dem Formular, das von MSMQ in About Message Queuing angegeben wird.
Beachten Sie, dass Sie nur direkte, öffentliche und private Formatnamen verwenden können (letzteres erfordert die Integration in Active Directory), wenn Sie Nachrichten aus einer Warteschlange mit MsmqIntegrationBinding
empfangen. Es wird jedoch empfohlen, direkte Formatnamen zu verwenden. Bei Windows Vista führt die Verwendung eines anderen Formatnamens beispielsweise zu einem Fehler, da das System versucht, eine Unterabfrage zu öffnen, die nur mit direkten Formatnamen geöffnet werden kann.
Bei der Adressierung von SRMP mithilfe von MsmqIntegrationBinding
ist es nicht erforderlich, /msmq/ zu dem direkten Formatnamen hinzuzufügen, um das Senden durch Internetinformationsdienste (Internet Information Services, IIS) zu unterstützen. Beispiel: Bei der Adressierung einer Warteschlange abc mit dem SRMP-Protokoll anstelle von DIRECT=http://adatum.com/msmq/private$/abc
, sollten Sie verwenden DIRECT=http://adatum.com/private$/abc
.
Beachten Sie, dass Sie die net.msmq://-Adressierung nicht mit MsmqIntegrationBinding
verwenden können. Da MsmqIntegrationBinding
die Adressierung im freiformatigen MSMQ-Format unterstützt, können Sie einen WCF-Dienst verwenden, der diese Bindung verwendet, um Multicast- und Verteilerlistenfunktionen in MSMQ zu nutzen. Eine Ausnahme ist das Angeben von CustomDeadLetterQueue
bei der Verwendung von MsmqIntegrationBinding
. Dies muss der Form net.msmq://entsprechen, ähnlich wie sie mithilfe der NetMsmqBinding
Datei angegeben wird.