Конечные точки служб и адресация очередиService Endpoints and Queue Addressing

В этом разделе рассматриваются принципы обращения клиентов к службам, выполняющим чтение из очередей, и сопоставления конечных точек служб с очередями.This topic discusses how clients address services that read from queues and how service endpoints map to queues. Как напоминание, на следующем рисунке показано классическое развертывание приложения, помещенного в очередь Windows Communication Foundation (WCF).As a reminder, the following illustration shows the classic Windows Communication Foundation (WCF) queued application deployment.

Схема находящихся в очереди приложенийQueued Application Diagram

Чтобы отправить службе сообщение, клиент адресует это сообщение целевой очереди.For the client to send the message to the service, the client addresses the message to the Target Queue. Чтобы прочитать сообщение из очереди, служба задает целевую очередь в качестве своего адреса прослушивания.For the service to read messages from the queue, it sets its listen address to the Target Queue. Адресация в WCF основана на универсальном коде ресурсов (URI), тогда как имена очередей сообщений (MSMQ) не основаны на универсальном коде ресурса (URI).Addressing in WCF is Uniform Resource Identifier (URI)-based while Message Queuing (MSMQ) queue names are not URI-based. Поэтому важно понимать, как обращаться к очередям, созданным в MSMQ, с помощью WCF.It is therefore essential to understand how to address queues created in MSMQ using WCF.

Адресация к очереди сообщений MSMQMSMQ Addressing

В MSMQ очереди обозначаются с помощью путей и имен форматов.MSMQ uses paths and format names to identify a queue. Путь указывает имя узла и QueueName.Paths specify a host name and a QueueName. Также можно добавить Private$ между именем узла и QueueName, чтобы указать частную очередь, не опубликованную в службе каталогов Active Directory.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.

Пути сопоставляются с "Форматнамес" для определения дополнительных аспектов адреса, включая протокол маршрутизации и передачи диспетчера очереди.Path names are mapped to "FormatNames" to determine additional aspects of the address, including routing and queue manager transfer protocol. Диспетчер очередей поддерживает два протокола передачи данных: собственный протокол MSMQ и протокол SRMP.The Queue Manager supports two transfer protocols: native MSMQ protocol and SOAP Reliable Messaging Protocol (SRMP).

Дополнительные сведения о пути MSMQ и именах форматов см. в статье об очередях сообщений.For more information about MSMQ path and format names, see About Message Queuing.

NetMsmqBinding и адресация к службеNetMsmqBinding and Service Addressing

При адресации сообщения службе выбирается схема из URI (в зависимости от транспорта, используемого для передачи данных).When addressing a message to a service, the scheme in the URI is chosen based on the transport used for communication. Каждый транспорт в WCF имеет уникальную схему.Each transport in WCF has a unique scheme. Схема должна отражать тип транспорта, используемого для передачи данных.The scheme must reflect the nature of transport used for communication. Например: net.tcp, net.pipe, HTTP и т. п.For example, net.tcp, net.pipe, HTTP, and so on.

Транспорт MSMQ в WCF предоставляет схему net. MSMQ.The MSMQ queued transport in WCF exposes a net.msmq scheme. Любое сообщение, адресованное с помощью схемы net.msmq, отправляется с помощью NetMsmqBinding через транспортный канал очередей MSMQ.Any message addressed using the net.msmq scheme is sent using the NetMsmqBinding over the MSMQ queued transport channel.

Адресация очереди в WCF основана на следующем шаблоне:The addressing of a queue in WCF is based on the following pattern:

NET. msmq:// <host-name> /[частный/] <queue-name>net.msmq: // <host-name> / [private/] <queue-name>

Где:where:

  • <host-name> имя компьютера, на котором размещена целевая очередь.<host-name> is the name of the machine that hosts the Target Queue.

  • [private] - необязательный элемент.[private] is optional. Используется при адресации к целевой очереди, которая является частной.It is used when addressing a Target Queue that is a private queue. При адресации к общей очереди не допускается указывать «private».To address a public queue, you must not specify private. Обратите внимание, что, в отличие от путей MSMQ, в форме URI WCF отсутствует "$".Note that, unlike MSMQ paths, there is no "$" in the WCF URI form.

  • <queue-name> имя очереди.<queue-name> is the name of the queue. Имя очереди также может относиться к вложенной очереди.The queue name can also refer to a subqueue. Таким таким, <queue-name> = <name-of-queue> [;вложенное имя очереди].Thus, <queue-name> = <name-of-queue>[;sub-queue-name].

Пример 1. Для адресации к частной очереди PurchaseOrders, размещенной на компьютере abc.adatum.com, универсальный код ресурса (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.

Пример 2. Для адресации к общей очереди AccountsPayable, размещенной на компьютере def.adatum.com, универсальный код ресурса (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.

Адрес очереди используется прослушивателем как код URI прослушивания, из которого выполняется чтение сообщений.The queue address is used as the Listen URI by the Listener to read messages from. Другими словами, адрес очереди подобен порту прослушивания сокета TCP.In other words, the queue address is equivalent to the listen port of TCP socket.

Конечная точка, выполняющая чтение из очереди, должна указывать адрес очереди с помощью указанной выше схемы при открывании узла службы (ServiceHost).An endpoint that reads from a queue must specify the address of the queue using the same scheme specified previously when opening the ServiceHost. Примеры см. в разделе Привязка к сети MSMQ.For examples, see Net MSMQ Binding.

Несколько контрактов в очередиMultiple Contracts in a Queue

Сообщения в очереди могут реализовывать различные контракты.Messages in a queue can implement different contracts. В данном случае для успешного чтения и обработки сообщений особенно важно, чтобы выполнялось одно из следующих требований:In this case, it is essential that one of the following is true to successfully read and process all messages:

  • Укажите конечную точку для службы, реализующей все контракты.Specify an endpoint for a service that implements all the contracts. Рекомендуем использовать этот подход.This is the recommended approach.

  • Укажите несколько конечных точек с различными контрактами, но убедитесь, что во всех конечных точках используется один и тот же объект NetMsmqBinding.Specify multiple endpoints with different contracts, but ensure that all the endpoints use the same NetMsmqBinding object. Логика отправки сообщений в модели ServiceModel использует тот же цикл обработки сообщений, считывающий сообщения из транспортного канала для отправки, что в конечном итоге приводит к демультиплексированию сообщений на различные конечные точки на основе контракта.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. Для пары «URI прослушивания/привязка» создается цикл обработки сообщений.A message pump is created for a listen URI/Binding pair. Адрес очереди используется прослушивателем в очереди как URI прослушивания.The queue address is used as the Listen URI by the queued listener. Использование одного объекта привязки всеми конечными точками обеспечивает использование одного цикла обработки сообщений для чтения сообщения и его демультиплексирования на соответствующие конечные точки на основе контракта.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.

Обмен сообщениями SRMPSRMP Messaging

Как указано выше, можно использовать протокол SRMP для передачи между очередями.As previously discussed, you can use the SRMP protocol for queue-to-queue transfers. Этот прием обычно используется, когда транспорт HTTP передает сообщения между очередью передачи и целевой очередью.This is commonly used when an HTTP transport transmits messages between the Transmission Queue and the Target Queue.

Чтобы воспользоваться протоколом SRMP, адресуйте сообщения с помощью схемы URI net.msmq, как указано выше, и укажите один из двух протоколов (SRMP или защищенный SRMP) в свойстве QueueTransferProtocol элемента NetMsmqBinding.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.

Указать свойство QueueTransferProtocol можно только при отправке.Specifying the QueueTransferProtocol property is a send-only feature. Оно указывает, какой именно протокол передачи между очередями используется клиентом.This is an indication by the client which kind of queue transfer protocol to use.

Использование Active DirectoryUsing Active Directory

В очереди сообщений MSMQ предусмотрена поддержка интеграции с Active Directory.MSMQ comes with support for Active Directory integration. Чтобы установить MSMQ с интеграцией с Active Directory, компьютер должен быть частью домена Windows.When MSMQ is installed with Active Directory integration, the machine must be part of a Windows domain. Active Directory используется для публикации очередей для обнаружения; Такие очереди называются публичными очередями.Active Directory is used to publish queues for discovery; such queues are called public queues. При адресации к очереди можно разрешить ее (т. е. узнать ее идентификатор) с помощью Active Directory.When addressing a queue, the queue can be resolved using Active Directory. Это похоже на разрешение IP-адреса сетевого имени с помощью службы доменных имен (DNS).This is similar to how Domain Name System (DNS) is used to resolve the IP address of a network name. Свойство UseActiveDirectory элемента NetMsmqBinding принадлежит к типу Boolean и указывает, должен ли канал в очереди использовать Active Directory для разрешения URI очереди.The UseActiveDirectory property in NetMsmqBinding is a Boolean that indicates whether the queued channel must use Active Directory to resolve the queue URI. По умолчанию для этого свойства установлено значение false.By default it is set to false. Если свойству UseActiveDirectory задано значение true, то канал в очереди преобразует URI вида net.msmq:// в имя формата с помощью Active Directory.If the UseActiveDirectory property is set to true, then the queued channel uses Active Directory to convert the net.msmq:// URI to format name.

Свойство UseActiveDirectory имеет значение только для клиента, отправляющего сообщение, поскольку оно используется для разрешения адреса очереди при отправке сообщений.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.

Сопоставление URI net.msmq именам форматов MSMQMapping net.msmq URI to Message Queuing Format Names

Канал в очереди обрабатывает сопоставление предоставленного ему имени URI net.msmq именам форматов MSMQ.The queued channel handles mapping the net.msmq URI name provided to the channel to MSMQ format names. В следующей таблице приведены общие правила их сопоставления.The following table summarizes the rules used to map between them.

Адрес очереди WCF, основанный на URIWCF URI-based queue address Используется свойство Active DirectoryUse Active Directory property Свойство протокола передачи между очередямиQueue Transfer Protocol property Результирующие имена форматов MSMQResulting MSMQ format names
Net.msmq://<machine-name>/private/abc False (по умолчанию)False (default) Native (по умолчанию)Native (default) DIRECT=OS:machine-name\private$\abc
Net.msmq://<machine-name>/private/abc FalseFalse SRMPSRMP DIRECT=http://machine/msmq/private$/abc
Net.msmq://<machine-name>/private/abc TrueTrue СобственныйNative PUBLIC=some-guid (идентификатор GUID очереди)PUBLIC=some-guid (the GUID of the queue)

Чтение сообщений из очереди недоставленных сообщений или из очереди подозрительных сообщенийReading Messages from the Dead-Letter Queue or the Poison-Message Queue

Для чтения сообщений из очереди подозрительных сообщений, являющейся вложенной очередью целевой очереди, откройте ServiceHost, указав адрес вложенной очереди.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.

Пример. Служба, считывающая из очереди подозрительных сообщений частной очереди PurchaseOrders с локального компьютера обращается по адресу net.msmq://localhost/private/PurchaseOrders;poison.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.

Для чтения сообщений из системной очереди недоставленных транзакционных сообщений код URI должен иметь следующий вид: 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.

Для чтения сообщений из системной очереди недоставленных нетранзакционных сообщений код URI должен иметь следующий вид: 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.

При использовании пользовательской очереди недоставленных сообщений обратите внимание, что эта очередь должна находиться на локальном компьютере.When using a custom dead-letter queue, note that the dead-letter queue must reside on the local computer. Таким образом, код URI очереди недоставленных сообщений быть только таким:As such, the URI for the dead-letter queue is restricted to the form:

NET. msmq://ЛОКАЛХОСТ/[частный/] <custom-dead-letter-queue-name> .net.msmq: //localhost/ [private/] <custom-dead-letter-queue-name>.

Служба WCF проверяет, что все получаемые сообщения были адресованы в конкретную очередь, в которой она прослушивается.A WCF service verifies that all messages it receives were addressed to the particular queue it is listening on. Если очередь назначения сообщения не соответствует очереди, в которой оно содержится, служба не обрабатывает сообщение.If the message’s destination queue does not match the queue it is found in, the service does not process the message. Если служба прослушивает очередь недоставленных сообщений, эту проблему необходимо решить обязательно, поскольку сообщения в такой очереди всегда адресованы в другое расположение.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. Для чтения сообщений из очереди недоставленных или подозрительных сообщений необходимо использовать ServiceBehavior и параметр Any.To read messages from a dead-letter queue, or from a poison queue, a ServiceBehavior with the Any parameter must be used. Пример см. в разделе очереди недоставленных сообщений.For an example, see Dead Letter Queues.

MsmqIntegrationBinding и адресация к службеMsmqIntegrationBinding and Service Addressing

MsmqIntegrationBinding используется для обмена информацией с традиционными приложениями MSMQ.The MsmqIntegrationBinding is used for communication with traditional MSMQ applications. Чтобы упростить взаимодействие с существующим приложением MSMQ, WCF поддерживает только адресацию имени формата.To ease interoperation with an existing MSMQ application, WCF supports only format name addressing. Таким образом, сообщения, отправленные с помощью этой привязки, должны соответствовать следующей схеме URI:Thus, messages sent using this binding must conform to the URI scheme:

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

Имя MSMQ-format-name указывается в формате MSMQ в статье об очереди сообщений.The MSMQ-format-name is of the form specified by MSMQ in About Message Queuing.

Обратите внимание, что можно использовать только прямые имена форматов, а также открытые и закрытые имена форматов (требуется интеграция Active Directory) при получении сообщений из очереди с помощью MsmqIntegrationBinding.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. Впрочем, рекомендуется использовать прямые имена форматов.However, it is advised that you use direct format names. Например, в Windows Vista использование любого другого имени формата вызывает ошибку, так как система пытается открыть подочередь, которую можно открыть только с помощью прямого имени формата.For example, on Windows 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.

При адресации к SRMP с помощью MsmqIntegrationBinding не требуется добавлять /msmq/ к прямому имени формата для отправки с помощью служб IIS.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. Например, при обращении к очереди ABC с помощью протокола SRMP вместо следует DIRECT=http://adatum.com/msmq/private$/abc использовать 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.

Обратите внимание, что нельзя использовать адресацию net.msmq:// вместе с MsmqIntegrationBinding.Note that you cannot use net.msmq:// addressing with MsmqIntegrationBinding. Так как MsmqIntegrationBinding поддерживает адресацию имен в формате MSMQ в свободной форме, можно использовать службу WCF, которая использует эту привязку для использования функций многоадресной рассылки и списков рассылки в MSMQ.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. Единственное исключение: необходимо указать CustomDeadLetterQueue при использовании MsmqIntegrationBinding.One exception is specifying CustomDeadLetterQueue when using the MsmqIntegrationBinding. Требуемая форма: net.msmq://, как и при указании с помощью NetMsmqBinding.It must be of the form net.msmq://, similar to how it is specified using the NetMsmqBinding.

См. такжеSee also