Dienstendpunkte und Adressieren von WarteschlangenService Endpoints and Queue Addressing

In diesem Thema wird erläutert, wie Clients Dienste adressieren, die Daten aus Warteschlangen auslesen, und wie Dienstendpunkte Warteschlangen zugeordnet werden.This topic discusses how clients address services that read from queues and how service endpoints map to queues. Die folgende Abbildung zeigt dem klassische Erinnerung, dass Windows Communication Foundation (WCF) in der Bereitstellung der Warteschlange.As a reminder, the following illustration shows the classic Windows Communication Foundation (WCF) queued application deployment.

In der Warteschlange AnwendungsdiagrammQueued Application Diagram

Damit der Client die Nachricht an den Dienst senden kann, richtet der Client die Nachricht an die Zielwarteschlange.For the client to send the message to the service, the client addresses the message to the Target Queue. Damit der Dienst Nachrichten aus der Warteschlange lesen kann, legt er als Abhöradresse die Zielwarteschlange fest.For the service to read messages from the queue, it sets its listen address to the Target Queue. Adressierung in WCF ist Uniform Resource Identifier-URI-basiert, während die Warteschlangennamen für Message Queuing (MSMQ) nicht URI-basiert sind.Addressing in WCF is Uniform Resource Identifier (URI)-based while Message Queuing (MSMQ) queue names are not URI-based. Es ist daher wichtig, zu verstehen, wie zum Adressieren von Warteschlangen in MSMQ mithilfe von WCF erstellt.It is therefore essential to understand how to address queues created in MSMQ using WCF.

MSMQ-AdressierungMSMQ Addressing

MSMQ verwendet Pfade und Formatnamen, um eine Warteschlange zu identifizieren.MSMQ uses paths and format names to identify a queue. Pfade geben einen Hostnamen und einen QueueName an.Paths specify a host name and a QueueName. Optional kann ein Private$ zwischen dem Hostnamen und dem QueueName vorliegen, um eine private Warteschlange anzugeben, die nicht im Active Directory-Verzeichnisdienst veröffentlicht wird.Optionally, there can be a Private$ between the host name and the QueueName to indicate a private queue that is not published in the Active Directory directory service.

Pfadnamen werden "Formatnames zugeordnet des", um zusätzliche Aspekte der Adresse, einschließlich routing und Warteschlangen-Manager-Übertragungsprotokoll zu bestimmen, zugeordnet.Path names are mapped to "FormatNames" to determine additional aspects of the address, including routing and queue manager transfer protocol. Der Warteschlangen-Manager unterstützt zwei Übertragungsprotokolle: das systemeigene MSMQ-Protokoll und das SOAP Reliable Messaging Protocol (SRMP).The Queue Manager supports two transfer protocols: native MSMQ protocol and SOAP Reliable Messaging Protocol (SRMP).

Weitere Informationen zu MSMQ-Pfad und den Format-Namen finden Sie unter zu Message Queuing.For more information about MSMQ path and format names, see About Message Queuing.

NetMsmqBinding und DienstadressierungNetMsmqBinding and Service Addressing

Bei der Adressierung einer Nachricht an einen Dienst wird das Schema in dem URI anhand des für die Kommunikation verwendeten Transports ausgewählt.When addressing a message to a service, the scheme in the URI is chosen based on the transport used for communication. Jeder Transport in WCF ist ein eindeutiges Schema.Each transport in WCF has a unique scheme. Das Schema muss die Art des für die Kommunikation verwendeten Transports wiedergeben,The scheme must reflect the nature of transport used for communication. z. B. net.tcp, net.pipe, HTTP usw.For example, net.tcp, net.pipe, HTTP, and so on.

Die MSMQ-Warteschlangentransport in WCF macht ein net.msmq-Schema.The MSMQ queued transport in WCF exposes a net.msmq scheme. Alle Nachrichten, die mithilfe des net.msmq-Schemas adressiert werden, werden mithilfe von NetMsmqBinding über den MSMQ-Warteschlangen-Transportkanal gesendet.Any message addressed using the net.msmq scheme is sent using the NetMsmqBinding over the MSMQ queued transport channel.

Die Adressierung einer Warteschlange in WCF basiert auf dem folgenden Muster:The addressing of a queue in WCF is based on the following pattern:

NET.MSMQ: / / < Hostname> / [private /] < Queue-Name>net.msmq: // <host-name> / [private/] <queue-name>

Dabei gilt:where:

  • <Hostname> ist der Name des Computers, der die Zielwarteschlange hostet.<host-name> is the name of the machine that hosts the Target Queue.

  • [privat] ist optional.[private] is optional. Dies wird verwendet, wenn eine Zielwarteschlange adressiert wird, bei der es sich um eine private Warteschlange handelt.It is used when addressing a Target Queue that is a private queue. Um eine öffentliche Warteschlange zu adressieren, dürfen Sie nicht "privat" angeben.To address a public queue, you must not specify private. Beachten Sie, dass im Gegensatz zu MSMQ-Pfaden, in der WCF-URI-Formular kein "$" vorhanden ist.Note that, unlike MSMQ paths, there is no "$" in the WCF URI form.

  • <Warteschlangenname> ist der Name der Warteschlange.<queue-name> is the name of the queue. Der Warteschlangenname kann auch auf eine Unterwarteschlange verweisen.The queue name can also refer to a subqueue. Folglich < Warteschlangenname> = < Name-of-Queue> [; Sub-queue-Name].Thus, <queue-name> = <name-of-queue>[;sub-queue-name].

Beispiel1: Für die Adressierung einer privaten Warteschlange PurchaseOrders, die auf dem Computer abc atadatum.com gehostet wird, wäre der URI net.msmq://abc.adatum.com/private/PurchaseOrders.Example1: To address a private queue PurchaseOrders hosted on computer abc atadatum.com, the URI would be net.msmq://abc.adatum.com/private/PurchaseOrders.

Beispiel2: Für die Adressierung einer öffentlichen Warteschlange AccountsPayable, die auf dem Computer def atadatum.com gehostet wird, wäre der URI net.msmq://def.adatum.com/AccountsPayable.Example2: To address a public queue AccountsPayable hosted on computer def atadatum.com, the URI would be net.msmq://def.adatum.com/AccountsPayable.

Die Warteschlangenadresse wird vom Listener als Abhör-URI zum Lesen von Nachrichten verwendet.The queue address is used as the Listen URI by the Listener to read messages from. Mit anderen Worten, die Warteschlangenadresse entspricht dem Abhöranschluss des TCP-Sockets.In other words, the queue address is equivalent to the listen port of TCP socket.

Ein Endpunkt, der aus einer Warteschlange liest, muss die Adresse der Warteschlange nach demselben Schema angeben, das zuvor beim Öffnen des ServiceHost angegeben worden war.An endpoint that reads from a queue must specify the address of the queue using the same scheme specified previously when opening the ServiceHost. Beispiele finden Sie unter Net MSMQ-Bindung und Message Queuing-Integration binden Samples.For examples, see Net MSMQ Binding and Message Queuing Integration Binding Samples.

Mehrere Verträge in einer WarteschlangeMultiple Contracts in a Queue

Nachrichten in einer Warteschlange können verschiedene Verträge implementieren.Messages in a queue can implement different contracts. In diesem Fall muss eines der folgenden Szenarien zutreffen, um alle Nachrichten erfolgreich lesen und verarbeiten zu können:In this case, it is essential that one of the following is true to successfully read and process all messages:

  • Geben Sie einen Endpunkt für einen Dienst an, der alle Verträge implementiert.Specify an endpoint for a service that implements all the contracts. Dies ist die empfohlene Vorgehensweise.This is the recommended approach.

  • Geben Sie mehrere Endpunkte mit verschiedenen Verträgen an, stellen Sie jedoch sicher, dass alle Endpunkte das gleiche NetMsmqBinding-Objekt verwenden.Specify multiple endpoints with different contracts, but ensure that all the endpoints use the same NetMsmqBinding object. 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.The dispatching logic in ServiceModel uses a message pump that reads messages out of the transport channel for dispatch, which eventually de-multiplexes messages based on the contract to different endpoints. Es wird ein Nachrichtensystem für ein Abhör-URI-/Bindungspaar erstellt.A message pump is created for a listen URI/Binding pair. Die Warteschlangenadresse wird von dem Warteschlangenlistener als Abhör-URI verwendet.The queue address is used as the Listen URI by the queued listener. Da alle Endpunkte dasselbe Bindungsobjekt verwenden, wird sichergestellt, dass ein einziges Nachrichtensystem zum Lesen der Nachricht und zum Ausführen von De-Multiplexing für relevante Endpunkte auf der Grundlage des Vertrags verwendet wird.Having all the endpoints use the same binding object ensures that a single message pump is used to read the message and de-multiplex to relevant endpoints based on the contract.

SRMP-MessagingSRMP Messaging

Wie zuvor erläutert, können Sie das SRMP-Protokoll für Übertragungen zwischen Warteschlangen einsetzen.As previously discussed, you can use the SRMP protocol for queue-to-queue transfers. Dies wird häufig angewendet, wenn ein HTTP-Transport Nachrichten zwischen der Übertragungswarteschlange und der Zielwarteschlange sendet.This is commonly used when an HTTP transport transmits messages between the Transmission Queue and the Target Queue.

Um das SRMP-Übertragungsprotokoll zu verwenden, adressieren Sie Nachrichten mithilfe des net.msmq-URI-Schemas, wie zuvor erwähnt, und geben Sie Ihre Wahl zwischen SRMP oder sicherem SRMP in der QueueTransferProtocol-Eigenschaft der NetMsmqBinding an.To use the SRMP transfer protocol, address messages using the net.msmq URI scheme, as mentioned previously, and specify the choice of SRMP or Secured SRMP in the QueueTransferProtocol property of the NetMsmqBinding.

Das Angeben der QueueTransferProtocol-Eigenschaft wirkt sich nur auf das Senden aus.Specifying the QueueTransferProtocol property is a send-only feature. Dadurch gibt der Client an, welche Art von Warteschlangenübertragungsprotokoll verwendet werden soll.This is an indication by the client which kind of queue transfer protocol to use.

Using Active DirectoryUsing Active Directory

MSMQ wird mit Unterstützung für Active Directory-Integration geliefert.MSMQ comes with support for Active Directory integration. Wenn MSMQ mit Active Directory-Integration installiert wird, muss der Computer Teil einer Windows-Domäne sein.When MSMQ is installed with Active Directory integration, the machine must be part of a Windows domain. Active Directory verwendet wird, um Warteschlangen für die Erkennung zu veröffentlichen. Diese Warteschlangen heißen öffentliche Warteschlangen.Active Directory is used to publish queues for discovery; such queues are called public queues. Wenn Sie eine Warteschlange adressieren, kann die Warteschlange mit Active Directory aufgelöst werden.When addressing a queue, the queue can be resolved using Active Directory. Dies funktioniert auf ähnliche Weise wie bei der Verwendung des DNS-Systems (Domain Name System) für die Auflösung einer IP-Adresse eines Netzwerknamens.This is similar to how Domain Name System (DNS) is used to resolve the IP address of a network name. Die UseActiveDirectory-Eigenschaft in der NetMsmqBinding ist ein boolescher Wert, der angibt, ob der in der Warteschlange stehende Kanal Active Directory verwenden muss, um den URI der Warteschlange aufzulösen.The UseActiveDirectory property in NetMsmqBinding is a Boolean that indicates whether the queued channel must use Active Directory to resolve the queue URI. In der Standardeinstellung ist die Eigenschaft auf false festgelegt.By default it is set to false. Wenn die UseActiveDirectory-Eigenschaft als true angegeben wird, verwendet der in der Warteschlange stehende Kanal Active Directory zum Umwandeln des net.msmq://-URI in den Formatnamen.If the UseActiveDirectory property is set to true, then the queued channel uses Active Directory to convert the net.msmq:// URI to format name.

Die UseActiveDirectory-Eigenschaft hat nur für den Client Bedeutung, der die Nachricht sendet, da sie beim Senden von Nachrichten zur Auflösung der Adresse der Warteschlange verwendet wird.The UseActiveDirectory property is meaningful only for the client that is sending the message because it is used to resolve the address of the queue when sending messages.

Zuordnen des net.msmq-URI zu Message Queuing-FormatnamenMapping net.msmq URI to Message Queuing Format Names

Der in der Warteschlange stehende Kanal verarbeitet die Zuordnung des net.msmq-URI-Namens, der für den Kanal bereitgestellt wurde, zu MSMQ-Formatnamen.The queued channel handles mapping the net.msmq URI name provided to the channel to MSMQ format names. In der folgenden Tabelle werden die Regeln, die für die Zuordnung zwischen den Namen verwendet werden, zusammengefasst.The following table summarizes the rules used to map between them.

WCF URI-basierte WarteschlangenadresseWCF URI-based queue address Verwenden Sie die Active Directory-EigenschaftUse Active Directory property Warteschlangen-Übertragungsprotokoll-EigenschaftQueue Transfer Protocol property Resultierende MSMQ-FormatnamenResulting MSMQ format names
NET.MSMQ://<Machine-Name >/Private/AbcNet.msmq://<machine-name>/private/abc False (Standardwert)False (default) Systemeigen (Standardwert)Native (default) DIRECT=OS:Computername\privat$\abcDIRECT=OS:machine-name\private$\abc
NET.MSMQ://<Machine-Name >/Private/AbcNet.msmq://<machine-name>/private/abc FalseFalse SRMPSRMP DIRECT =http://machine/msmq/private$/ AbcDIRECT=http://machine/msmq/private$/abc
NET.MSMQ://<Machine-Name >/Private/AbcNet.msmq://<machine-name>/private/abc TrueTrue SystemeigenNative PUBLIC=some-guid (die GUID der Warteschlange)PUBLIC=some-guid (the GUID of the queue)

Lesen von Nachrichten aus der Warteschlange für unzustellbare Nachrichten oder der Warteschlange für potenziell schädliche NachrichtenReading Messages from the Dead-Letter Queue or the Poison-Message Queue

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.To read messages from a poison-message queue that is a subqueue of the target queue, open the ServiceHost with the address of the subqueue.

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.Example: A service that reads from the poison-message queue of the PurchaseOrders private queue from the local machine would address net.msmq://localhost/private/PurchaseOrders;poison.

Zum Lesen von Nachrichten aus einer transaktionalen Systemwarteschlange für unzustellbare Nachrichten muss der URI folgendes Format haben: net.msmq://localhost/system$;DeadXact.To read messages from a system transactional dead-letter queue, the URI must be of the form: 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.To read messages from a system nontransactional dead-letter queue, the URI must be of the form: 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.When using a custom dead-letter queue, note that the dead-letter queue must reside on the local computer. Deshalb ist der URI für die Warteschlange für unzustellbare Nachrichten auf das folgende Format beschränkt:As such, the URI for the dead-letter queue is restricted to the form:

NET.MSMQ: //localhost/ [private /] < Custom-Dead-Letter-Queue-Name>.net.msmq: //localhost/ [private/] <custom-dead-letter-queue-name>.

Ein WCF-Dienst stellt sicher, dass alle empfangenen Nachrichten an die überwachte Warteschlange adressiert waren, die er überwacht wird.A WCF service verifies that all messages it receives were addressed to the particular queue it is listening on. Wenn die Zielwarteschlange der Nachricht nicht mit der Warteschlange übereinstimmt, in der sie gefunden wird, verarbeitet der Dienst die Nachricht nicht.If the message’s destination queue does not match the queue it is found in, the service does not process the message. 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.This is an issue that services listening to a dead-letter queue must address because any message in the dead-letter queue was meant to be delivered elsewhere. 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.To read messages from a dead-letter queue, or from a poison queue, a ServiceBehavior with the Any parameter must be used. Ein Beispiel finden Sie unter Warteschlangen für unzustellbare.For an example, see Dead Letter Queues.

NetMsmqBinding und DienstadressierungMsmqIntegrationBinding and Service Addressing

Die MsmqIntegrationBinding wird für die Kommunikation mit herkömmlichen MSMQ-Anwendungen verwendet.The MsmqIntegrationBinding is used for communication with traditional MSMQ applications. Um die Interoperation mit einer vorhandenen MSMQ-Anwendung zu vereinfachen, WCF das einzige formatnamenadressierung unterstützt.To ease interoperation with an existing MSMQ application, WCF supports only format name addressing. Folglich müssen Nachrichten, die mithilfe dieser Bindung gesendet werden, dem URI-Schema entsprechen:Thus, messages sent using this binding must conform to the URI scheme:

MSMQ.FormatName:<MSMQ-Formatnamen>>msmq.formatname:<MSMQ-format-name>>

Der MSMQ-Formatnamen wird der angegebenen von MSMQ in Form zu Message Queuing.The MSMQ-format-name is of the form specified by MSMQ in About Message Queuing.

Beachten Sie, dass Sie nur direkte Formatnamen verwenden können und dass Sie öffentliche und private Formatnamen (dies erfordert die Integration von Active Directory) verwenden können, wenn Nachrichten von einer Warteschlange mithilfe von MsmqIntegrationBinding empfangen werden.Note that you can only use direct format names, and public and private format names (requires Active Directory integration) when receiving messages from a queue using MsmqIntegrationBinding. Es wird jedoch empfohlen, direkte Formatnamen zu verwenden.However, it is advised that you use direct format names. Bei Windows VistaWindows Vista kann die Verwendung eines anderen Formatnamens z. B. einen Fehler verursachen, da das System versucht, eine Unterwarteschlange zu öffnen, die nur bei Verwendung von direkten Formatnamen geöffnet werden kann.For example, on Windows VistaWindows Vista, using any other format name causes an error because the system attempts to open a subqueue, which can only be opened with direct format names.

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.When addressing SRMP using MsmqIntegrationBinding, there is no requirement to add /msmq/ in the direct format name to help Internet Information Services (IIS) with dispatching. Zum Beispiel: bei der Adressierung einer Warteschlange Abc mithilfe des SRMP-statt DIRECT Protokolls =http://adatum.com/msmq/private$/ Abc verwenden Sie DIRECT =http://adatum.com/private$/ Abc.For example: When addressing a queue abc using the SRMP protocol, instead of DIRECT=http://adatum.com/msmq/private$/abc, you should use DIRECT=http://adatum.com/private$/abc.

Beachten Sie, dass Sie net.msmq:// nicht für die Adressierung mit MsmqIntegrationBinding verwenden können.Note that you cannot use net.msmq:// addressing with MsmqIntegrationBinding. Da MsmqIntegrationBinding Freiform-MSMQ formatnamenadressierung unterstützt, können Sie einen WCF-Dienst, die dieser Bindung verwendet, um Multicast-und Verteilerlistenfunktionen in MSMQ zu verwenden.Because MsmqIntegrationBinding supports free-form MSMQ format name addressing, you can use a WCF service that uses this binding to use multicast and distribution list features in MSMQ. Eine Ausnahme ist das Angeben von CustomDeadLetterQueue bei der Verwendung von MsmqIntegrationBinding.One exception is specifying CustomDeadLetterQueue when using the MsmqIntegrationBinding. Das Format muss net.msmq sein:// sein, ähnlich wie bei der Verwendung von NetMsmqBinding festgelegt.It must be of the form net.msmq://, similar to how it is specified using the NetMsmqBinding.

Siehe auchSee Also

Webhosting einer Anwendung mit QueuingWeb Hosting a Queued Application