Создание маршрутизатора WCF - Контракт маршрутизатора

ОГЛАВЛЕНИЕ

Контракт маршрутизатора

Маршрутизаторы получают сообщения, предназначенные для подчиненных служб, и ответственны за пересылку этих сообщений соответствующей службе. Они также ответственны за получение сообщений от службы и передачу их клиенту. Обычный контракт маршрутизатора предоставляет единственную операцию, которая может обработать любой запрос сообщения или ответ. В приведенном ниже примере эта операция именуется ProcessMessage:

[ServiceContract(Namespace = 
"http://www.thatindigogirl.com/samples/2008/01")]
public interface IRouterService {
  [OperationContract(Action = "*", ReplyAction = "*")]
  Message ProcessMessage(Message requestMessage);

В обычной ситуации такие свойства OperationContractAttribute, как Action и ReplyAction, выводятся, как указывалось ранее в этой статье, – из пространства имен контракта службы, имени контракта и имени операции. По умолчанию, при прибытии сообщения диспетчер канала должен найти операцию, соответствующую определенному заголовку Action. Однако, в случае, когда Action и ReplyAction установлены на "*", диспетчер канала будет отправлять любые сообщения, не сопоставленные с конкретной операцией, вышеупомянутой многоцелевой операции вне зависимости от значения заголовка Action. Чтобы избежать двусмысленности, только одна операция может указать "*" для свойства Action или ReplyAction.

Типичный маршрутизатор предоставляет единственную операцию, вроде ProcessMessage, которая может обработать любое достигшее ее сообщение. Тогда как Action и ReplyAction обеспечивают сопоставление сообщения с ProcessMessage при помощи диспетчера канала, сигнатура операции также должна иметь возможность обработать любое сообщение.

Чтобы решить эту задачу, ProcessMessage получает и возвращает нетипизированные сообщения в форме типа Message («Сообщение»). Маршрутизатор может получить доступ к коллекции заголовка и телу сообщения через этот тип, но автоматической сериализации не происходит, помимо общих заголовков адресации, которые десериализуются и делаются доступными через строго типизированные свойства.

Любая последующая обработка сообщений зависит от реализации маршрутизатора. Базовый маршрутизатор просто получит нетипизированное сообщение и перенаправит его подчиненным службам, ожидая ответа. Аналогично, ответ перенаправляется вызывающему клиенту в том же необработанном формате.