Поделиться через


Протокол надежного обмена сообщениями, версия 1.0

В этом разделе рассматриваются сведения о реализации Windows Communication Foundation (WCF) для протокола WS-Reliable Messaging февраля 2005 г. (версия 1.0), необходимого для взаимодействия с использованием транспорта HTTP. WCF следует спецификации WS-Reliable Messaging с ограничениями и пояснениями, описанными в этом разделе. Обратите внимание, что протокол WS-ReliableMessaging версии 1.0 реализуется начиная с WinFX.

Протокол WS-Reliable Messaging за февраль 2005 г. реализован в WCF ReliableSessionBindingElement.

Для удобства объяснения в этом разделе используются следующие роли:

  • инициатор: клиент, инициирующий создание последовательности сообщений WS-Reliable;

  • респондент: служба, получающая запросы инициатора.

В этом документе используются префиксы и пространства имен, описанные в следующей таблице.

Префикс Пространство имен
wsrm http://schemas.xmlsoap.org/ws/2005/02/rm
netrm http://schemas.microsoft.com/ws/2006/05/rm
s http://www.w3.org/2003/05/soap-envelope
wsa http://schemas.xmlsoap.org/ws/2005/08/addressing
wsse http://docs.oasis-open.org/wss/2004/01/oasis-200401-wssecurity-secext-1.0.xsd

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

Сообщения установления последовательности

WCF реализует CreateSequence и CreateSequenceResponse сообщения для установления надежной последовательности сообщений. Действуют следующие ограничения.

  • B1101: инициатор WCF не создает необязательный элемент Expires в CreateSequence сообщении или в случаях, когда CreateSequence сообщение содержит Offer элемент, необязательный Expires элемент в элементе Offer .

  • B1102: при доступе к сообщению CreateSequence WCFResponder отправляет и получает оба Expires элемента, если они существуют, но не используют их значения.

Протокол WS-Reliable Messaging использует механизм Offer для формирования двух коррелированных встречных последовательностей, которые составляют сеанс.

  • R1103: если сообщение CreateSequence содержит элемент Offer, респондент системы надежного обмена сообщениями должен либо принять последовательности и выдать ответ CreateSequenceResponse, который содержит элемент wsrm:Accept, образующий две коррелированных встречных последовательности, либо отклонить запрос CreateSequence.

  • R1104: SequenceAcknowledgement и сообщения приложения, передаваемые во встречной последовательности, должны быть отправлены по адресу ссылки конечной последовательности ReplyTo в CreateSequence.

  • R1105: адреса ссылок на конечные точки AcksTo и ReplyTo в сообщении CreateSequence должны совпадать на уровне октетов.

    Средство реагирования WCF проверяет, идентична ли часть AcksTo URI и ReplyTo EPR перед созданием последовательности.

  • R1106: ссылки на конечные точки AcksTo и ReplyTo в сообщении CreateSequence должны иметь один и тот же набор параметров ссылок.

    WCF не применяется, но предполагает, что [ссылочные параметры] AcksTo идентичны и ReplyToCreateSequence используют [эталонные параметры] из ReplyTo ссылки на конечные точки для подтверждения и сообщений последовательности.

  • R1107: при установке двух встречных последовательностей с помощью механизма Offer сообщение SequenceAcknowledgement и сообщения приложения во встречных последовательностях должны отправляться по ссылке на конечную точку ReplyTo в сообщении CreateSequence.

  • R1108: при установке двух встречных последовательностей с помощью механизма "Offer" свойство [address] дочернего элемента ссылки на конечную точку wsrm:AcksTo элемента wsrm:Accept в сообщении CreateSequenceResponse должно с точностью до байта совпадать с универсальным кодом ресурса (URI) назначения сообщения CreateSequence.

  • R1109: при установке двух встречных последовательностей с помощью механизма Offer сообщения, отправленные инициатором, и подтверждения на сообщения респондента должны отправляться по одной и той же ссылке на конечную точку.

    WCF использует WS-Reliable Messaging для установления надежных сеансов между инициатором и ответчиком. Реализация WS-Reliable Messaging WCF предоставляет надежный сеанс для одностороннего, ответного запроса и полного дуплексного обмена сообщениями. Механизм CreateSequence/CreateSequenceResponse обмена сообщениями WS-Reliable Позволяет Offer установить две связанные последовательности и обеспечить протокол сеанса, подходящий для всех конечных точек сообщения. Поскольку WCF обеспечивает гарантию безопасности для такого сеанса, включая сквозную защиту для целостности сеансов, практически гарантирует, что сообщения, предназначенные для той же стороны, прибывают в то же место назначения. Кроме того, это делает возможным передачу подтверждений последовательностей в сообщениях приложений. Поэтому ограничения R1104, R1105 и R1108 применяются к WCF.

Пример сообщения CreateSequence.

<s:Envelope>
  <s:Header>
    <a:Action s:mustUnderstand="1">
      http://schemas.xmlsoap.org/ws/2005/02/rm/CreateSequence
    </a:Action>
    <a:ReplyTo>
      <a:Address>
         http://Business456.com/clientA
      </a:Address>
    </a:ReplyTo>
    <a:MessageID>
      urn:uuid:addabbbf-60cb-44d3-8c5b-9e0841629a36
    </a:MessageID>
    <a:To s:mustUnderstand="1">
      http://Business456.com/clientA
    </a:To>
  </s:Header>
  <s:Body>
    <wsrm:CreateSequence>
      <wsrm:AcksTo>
       <wsa:Address>
         http://Business456.com/clientA
       </wsa:Address>
     </wsrm:AcksTo>
     <wsrm:Offer>
      <wsrm:Identifier>
        urn:uuid:0afb8d36-bf26-4776-b8cf-8c91fddb5496
      </wsrm:Identifier>
     </wsrm:Offer>
   </wsrm:CreateSequence>
  </s:Body>
</s:Envelope>

Пример сообщения CreateSequenceResponse.

<s:Envelope>
  <s:Header>
    <a:Action s:mustUnderstand="1">
      http://schemas.xmlsoap.org/ws/2005/02/rm/CreateSequenceResponse
    </a:Action>
    <a:RelatesTo>
      urn:uuid:addabbbf-60cb-44d3-8c5b-9e0841629a36
    </a:RelatesTo>
    <a:To s:mustUnderstand="1">
      http://Business456.com/clientA
    </a:To>
  </s:Header>
  <s:Body>
   <wsrm:CreateSequenceResponse>
    <Identifier>
     urn:uuid:eea0a36c-b38a-43e8-8c76-2fabe2d76386
    </Identifier>
    <Accept>
    <AcksTo>
      <a:Address>
        http://BusinessABC.com/serviceA
      </a:Address>
    </AcksTo>
    </Accept>
   </wsrm:CreateSequenceResponse>
  </s:Body>
</s:Envelope>

Sequence

Ниже приведен список ограничений, относящихся к последовательностям.

  • B1201:WCF создает и обращается к номерам последовательности, не превышающим xs:longмаксимальное инклюзивное значение, 9223372036854775807.

  • B1202:WCF всегда создает пустое последнее сообщение с URI http://schemas.xmlsoap.org/ws/2005/02/rm/LastMessageдействия.

  • B1203: WCF получает и передает сообщение с заголовком Последовательности, содержащим LastMessage элемент, если URI действия не http://schemas.xmlsoap.org/ws/2005/02/rm/LastMessageявляется.

Пример заголовка последовательности.

<wsrm:Sequence>
  <wsrm:Identifier>
    urn:uuid:addabbbf-60cb-44d3-8c5b-9e0841629a36
  </wsrm:Identifier>
  <wsrm:MessageNumber>
    10
  </wsrm:MessageNumber>
  <wsrm:LastMessage/>
 </wsrm:Sequence>

Заголовок AckRequested

WCF использует AckRequested заголовок в качестве механизма поддержания активности. WCF не создает необязательный MessageNumber элемент. При получении сообщения с заголовком AckRequested , содержащим MessageNumber элемент, WCF игнорирует MessageNumber значение элемента, как показано в следующем примере.

<wsrm:AckRequested>
  <wsrm:Identifier>
    urn:uuid:addabbbf-60cb-44d3-8c5b-9e0841629a36
  </wsrm:Identifier>
</wsrm:AckRequested>

Заголовок SequenceAcknowledgement

WCF использует механизм подтверждения последовательности, предоставляемых в WS-Reliable Messaging.

  • R1401: при установке двух встречных последовательностей с помощью механизма Offer заголовок SequenceAcknowledgement может включаться в любое сообщение приложения, передаваемое определенному получателю.

  • B1402: если WCF должен создать подтверждение перед получением сообщений последовательности (например, для удовлетворения AckRequested сообщения), WCF создает SequenceAcknowledgement заголовок, содержащий диапазон 0-0, как показано в следующем примере.

    <wsrm:SequenceAcknowledgement>
      <wsrm:Identifier>
        urn:uuid:addabbbf-60cb-44d3-8c5b-9e0841629a36
      </wsrm:Identifier>
      <wsrm:AcknowledgementRange Upper="0" Lower="0"/>
    </wsrm:SequenceAcknowledgement>
    
  • B1403: WCF не создает SequenceAcknowledgement заголовки, содержащие Nack элемент, но поддерживающие Nack элементы.

Ошибки протокола WS-ReliableMessaging

Ниже приведен список ограничений, которые применяются к реализации WCF ошибок WS-Reliable Messaging:

  • B1501: WCF не создает MessageNumberRollover ошибки.

  • Конечная точка B1502:WCF может создавать CreateSequenceRefused ошибки, как описано в спецификации.

  • B1503:Когда конечная точка службы достигает предела подключения и не может обрабатывать новые подключения, WCF создает дополнительный CreateSequenceRefused подкод сбоя, netrm:ConnectionLimitReachedкак показано в следующем примере.

    <s:Envelope>
      <s:Header>
        <wsa:Action>
          http://schemas.xmlsoap.org/ws/2005/08/addressing/fault
        </wsa:Action>
      </s:Header>
      <s:Body>
        <s:Fault>
          <s:Code>
            <s:Value>
              s:Receiver
            </s:Value>
            <s:Subcode>
              <s:Value>
                wsrm:CreateSequenceRefused
              </s:Value>
              <s:Subcode>
                <s:Value>
                  netrm:ConnectionLimitReached
                </s:Value>
              </s:Subcode>
            </s:Subcode>
          </s:Code>
          <s:Reason>
            <s:Text xml:lang="en">
              [Reason]
            </s:Text>
          </s:Reason>
        </s:Fault>
      </s:Body>
    </s:Envelope>
    

Ошибки WS-Addressing

Так как WS-Reliable Messaging использует WS-Адресацию, реализация WS-Reliable Messaging WCF может создавать ошибки WS-Адресации. В этом разделе рассматриваются ошибки WS-Адресации, которые WCF явно генерирует на уровне WS-Reliable Messaging:

  • B1601:WCF создает заголовок адресации сообщений сбоя, необходимый, если одно из следующих значений имеет значение true:

    • в сообщении отсутствуют заголовки Sequence и Action;

    • в сообщении CreateSequence отсутствует заголовок MessageId.

    • в сообщении CreateSequence отсутствует заголовок ReplyTo.

  • B1602:WCF создает действие сбоя не поддерживается в ответ на сообщение, которое отсутствует Sequence заголовок и имеет Action заголовок, который не распознается в спецификации WS-Reliable Messaging.

  • B1603:WCF создает конечную точку сбоя Недоступно, чтобы указать, что конечная точка не обрабатывает последовательность на основе проверки CreateSequence заголовков адресации сообщения.

Сочетаемость протокола

Сочетаемость с WS-Addressing

WCF поддерживает две версии WS-Адресации: WS-Адресация 2004/08 [WS-ADDR] и W3C WS-Addressing 1.0 Рекомендации [WS-ADDR-CORE] и [WS-ADDR-SOAP].

Поскольку в спецификации протокола WS-Reliable Messaging указана только версия WS-Addressing 2004/08, он не накладывает ограничений на используемую версию WS-Addressing. Ниже приведен список ограничений, которые применяются к WCF:

  • R2101:WS-Addressing 2004/08 и WS-Addressing 1.0 можно использовать с WS-Reliable Messaging.

  • R2102:Отдельная версия WS-Addressing должна использоваться во всей заданной последовательности обмена сообщениями WS-Reliable Или парой обратных последовательностей, коррелированных с помощью wsrm:Offer механизма.

Сочетаемость с SOAP

WCF поддерживает использование SOAP 1.1 и SOAP 1.2 с WS-Reliable Messaging.

Сочетаемость с WS-Security и WS-SecureConversation

WCF обеспечивает защиту последовательностей обмена сообщениями WS-Reliable с помощью безопасного транспорта (HTTPS), композиции с WS-Security и композиции с WS-Secure Conversation. Ниже приведен список ограничений, которые применяются к WCF:

  • R2301:Чтобы защитить целостность последовательности сообщений WS-Reliable Messaging в дополнение к целостности и конфиденциальности отдельных сообщений, WCF требует, чтобы WS-Secure Conversation использовался.

  • Перед установкой последовательностей сообщений WS-Reliable Messaging необходимо установить сеанс R2302:AWS-Secure Conversation.

  • R2303: если время существования последовательности WS-Reliable Messaging превышает время существования сеанса WS-Secure Conversation, необходимо с помощью привязки обновления WS-Secure Conversation обновить маркер SecurityContextToken, созданный протоколом WS-Secure Conversation.

  • Последовательность обмена сообщениями B2304:WS-Reliable Messaging или пара коррелированных обратных последовательностей всегда привязаны к одному сеансу WS-SecureConversation.

    Источник WCF создает wsse:SecurityTokenReference элемент в разделе CreateSequence расширяемости элемента сообщения.

  • R2305:При создании с помощью WS-Secure Conversation CreateSequence сообщение должно содержать wsse:SecurityTokenReference элемент.

Утверждение WS-Reliable Messaging WS-Policy

WCF использует утверждение WS-Reliable Messaging WS-Policy Для wsrm:RMAssertion описания возможностей конечных точек. Ниже приведен список ограничений, которые применяются к WCF:

  • B3001: WCF присоединяет wsrm:RMAssertion утверждение WS-Policy к wsdl:binding элементам. WCF поддерживает как вложения, так wsdl:binding и wsdl:port элементы.

  • B3002: WCF поддерживает следующие необязательные свойства утверждения WS-Reliable Messaging и обеспечивает контроль над ними в WCFReliableMessagingBindingElement:

    • wsrm:InactivityTimeout

    • wsrm:AcknowledgementInterval

    Пример приведен ниже.

    <wsrm:RMAssertion>
      <wsrm:InactivityTimeout Milliseconds="600000" />
      <wsrm:AcknowledgementInterval Milliseconds="200" />
    </wsrm:RMAssertion>
    

Расширение WS-Reliable Messaging для управления потоком

WCF использует расширяемость WS-Reliable Messaging, чтобы обеспечить дополнительный дополнительный более жесткий контроль над потоком сообщений последовательности.

Элемент управления потоком ReliableSessionBindingElement.FlowControlEnabled включен, задав для свойства значение true. Ниже приведен список ограничений, которые применяются к WCF:

  • B4001: если включен элемент управления потоками надежных сообщений, WCF создает netrm:BufferRemaining элемент в расширяемости заголовка SequenceAcknowledgement элемента.

  • B4002: если включен элемент управления потоками надежных сообщений, WCF не требует netrm:BufferRemaining наличия элемента в заголовке, как показано в SequenceAcknowledgement следующем примере.

    <wsrm:SequenceAcknowledgement>
      <wsrm:Identifier>
        http://fabrikam123.com/abc
      </wsrm:Identifier>
      <wsrm:AcknowledgementRange Upper="1" Lower="1"/>
      <netrm:BufferRemaining>
        8
      </netrm:BufferRemaining>
    </wsrm:SequenceAcknowledgement>
    
  • B4003: WCF используется netrm:BufferRemaining для указания количества новых сообщений, которые может буферировать назначение надежного обмена сообщениями.

  • B4004:Служба надежных сообщений WCF регулирует количество сообщений, передаваемых, когда целевое приложение Reliable Messaging не может быстро получать сообщения. Точка назначения системы надежного обмена сообщениями помещает сообщения в буфер, и значение элемента снижается до 0.

  • B4005: WCF создает netrm:BufferRemaining целые значения в диапазоне от 0 до 4096 включительно и считывает целые значения от 0 до xs:intmaxInclusive значения 214748364 включительно.

Шаблоны обмена сообщениями

В этом разделе описывается поведение WCF при использовании WS-Reliable Messaging для различных шаблонов Обмена сообщениями. Для каждого шаблона обмена сообщениями рассматриваются два варианта развертывания:

  • неадресуемый инициатор - инициатор расположен за брандмауэром, респондент может отправлять инициатору сообщения только с HTTP-ответами;

  • адресуемый инициатор - как инициатор, так и респондент могут принимать HTTP-запросы, т. е. можно установить два встречных HTTP-подключения.

Односторонний неадресуемый инициатор

Привязка

WCF предоставляет шаблон обмена одностороннего сообщения с помощью одной последовательности по одному каналу HTTP. WCF использует HTTP-запросы для передачи всех сообщений из RMS в RMD и HTTP-ответ для передачи всех сообщений из RMD в RMS.

Обмен сообщениями CreateSequence

Инициатор WCF создает CreateSequence сообщение без предложения. Средство реагирования WCF гарантирует отсутствие CreateSequence предложения перед созданием последовательности. Ответит на запрос с сообщением CreateSequenceResponse в ответ на CreateSequence запрос WCF.

SequenceAcknowledgement

Инициатор WCF обрабатывает подтверждения по ответу всех сообщений, кроме сообщений об ошибке CreateSequence . Ответ wcF всегда создает автономное подтверждение в ответе на последовательность и AckRequested сообщения.

Сообщение TerminateSequence

WCF обрабатывается TerminateSequence как односторонняя операция, т. е. ответ HTTP имеет пустой текст и код состояния HTTP 202.

Односторонний адресуемый инициатор

Привязка

WCF предоставляет шаблон обмена односторонним сообщением с помощью одной последовательности через входящий и исходящий канал Http. WCF использует HTTP-запросы для передачи всех сообщений. Все HTTP-ответы имеют пустое тело и код состояния HTTP 202.

Обмен сообщениями CreateSequence

Инициатор WCF создает CreateSequence сообщение без предложения. Средство реагирования WCF гарантирует, что CreateSequence у него нет предложения перед созданием последовательности. Ответ WCF передает CreateSequenceResponse сообщение по HTTP-запросу, адресуемого ссылкой на конечную точку ReplyTo .

Дуплексный адресуемый инициатор

Привязка

WCF предоставляет полностью асинхронный шаблон обмена сообщениями двухстороннего обмена сообщениями с помощью двух последовательностей через входящий и исходящий HTTP-канал. WCF использует HTTP-запросы для передачи всех сообщений. Все HTTP-ответы имеют пустое тело и код состояния HTTP 202.

Обмен сообщениями CreateSequence

Инициатор WCF создает CreateSequence сообщение с предложением. Средство реагирования WCF гарантирует, что CreateSequence у него есть предложение перед созданием последовательности. WCF отправляет CreateSequenceResponse HTTP-запрос, адресованный CreateSequenceReplyTo ссылке на конечную точку.

Время существования последовательности

WCF обрабатывает две последовательности как один полностью дуплексный сеанс.

При создании сбоя, который завершает одну последовательность, WCF ожидает, что удаленная конечная точка будет сбоем обеих последовательностей. При чтении ошибки, которая сбоет одну последовательность, WCF сбой обеих последовательностей.

WCF может закрыть исходящую последовательность и продолжить обработку сообщений в входящей последовательности. И наоборот, WCF может обрабатывать закрытие входящей последовательности и продолжать отправлять сообщения в исходящей последовательности.

Обмен сообщениями запрос-ответ, неадресуемый инициатор

Привязка

WCF предоставляет шаблон обмена одностороннего и ответного сообщения с помощью двух последовательностей по одному каналу HTTP. WCF использует HTTP-запросы для передачи сообщений последовательности запросов и использует HTTP-ответы для передачи сообщений последовательности ответов.

Обмен сообщениями CreateSequence

Инициатор WCF создает CreateSequence сообщение с предложением. Средство реагирования WCF гарантирует, что CreateSequence у него есть предложение перед созданием последовательности. Ответит на запрос с сообщением CreateSequenceResponse в ответ на CreateSequence запрос WCF.

Односторонний обмен сообщениями

Для успешного завершения одностороннего протокола обмена сообщениями инициатор WCF передает сообщение последовательности запросов по HTTP-запросу и получает автономное SequenceAcknowledgement сообщение в ответе HTTP. Сообщение SequenceAcknowledgement должно подтвердить передачу сообщения.

Ответ WCF может ответить на запрос с подтверждением, ошибкой или ответом с пустым текстом и кодом состояния HTTP 202.

Двусторонний обмен сообщениями

Для успешного выполнения протокола обмена сообщениями двумя способами инициатор WCF передает сообщение последовательности запросов по HTTP-запросу и получает сообщение последовательности ответа по HTTP-ответу. Ответ должен содержать подтверждение SequenceAcknowledgement того, что сообщение последовательности запросов было передано.

Ответ WCF может ответить на запрос с ответом приложения, ошибкой или ответом с пустым текстом и кодом состояния HTTP 202.

Из-за наличия односторонних сообщений и временных параметров ответов приложения номера последовательности запросов и номера последовательности ответов не коррелируют между собой.

Повторные попытки ответов

WCF использует корреляцию HTTP-запроса-ответа для двусторонней корреляции протокола обмена сообщениями. Из-за этого инициатор WCF не останавливает повторение сообщения последовательности запросов при подтверждении сообщения последовательности запросов, а вместо того, когда HTTP-ответ несет подтверждение, сообщение пользователя или ошибку. Средство ответа WCF повторяет ответы по http-запросу запроса, к которому сопоставляется ответ.

Обмен сообщениями LastMessage

Инициатор WCF создает и передает пустое телесное последнее сообщение на ноге HTTP-запроса. WCF требует ответа, но игнорирует фактическое сообщение ответа. Ответь WCF отвечает на пустое сообщение последовательности запросов с пустым текстом последнего сообщения последовательности ответа с пустым текстом ответа.

Если ответ WCF получает последнее сообщение, в котором URI действия не http://schemas.xmlsoap.org/ws/2005/02/rm/LastMessageявляется, WCF отвечает с последним сообщением. В случае протокола двустороннего обмена сообщениями последнее сообщение содержит сообщение приложения, а в случае протокола одностороннего обмена сообщениями последнее сообщение будет пустым.

Ответчик WCF не требует подтверждения для пустого сообщения последовательности ответа.

Обмен сообщениями TerminateSequence

Когда все запросы получили допустимый ответ, инициатор WCF создает и передает сообщение последовательности TerminateSequence запросов на ногу HTTP-запроса. WCF требует ответа, но игнорирует фактическое сообщение ответа. Ответитель WCF отвечает на сообщение последовательности запросов с сообщением последовательности TerminateSequenceTerminateSequence ответа.

В обычной последовательности отключения оба сообщения TerminateSequence содержат полный набор SequenceAcknowledgement.

Обмен сообщениями запрос-ответ, адресуемый инициатор

Привязка

WCF предоставляет шаблон обмена сообщениями с запросами с помощью двух последовательностей через входящий и исходящий HTTP-канал. WCF использует HTTP-запросы для передачи всех сообщений. Все HTTP-ответы имеют пустое тело и код состояния HTTP 202.

Обмен сообщениями CreateSequence

Инициатор WCF создает CreateSequence сообщение с предложением. Средство реагирования WCF гарантирует, что CreateSequence у него есть предложение перед созданием последовательности. WCF отправляет CreateSequenceResponse HTTP-запрос, адресованный CreateSequenceReplyTo ссылке на конечную точку.

Корреляция запросов и ответов

Инициатор WCF гарантирует, что все сообщения запроса приложения имеют MessageId ссылку и ссылку на конечную точку ReplyTo . Инициатор WCF применяет ссылку CreateSequence на конечную точку сообщения ReplyTo по каждому сообщению запроса приложения. Для ответа WCF требуется, чтобы входящие сообщения запроса были носителями MessageId и ReplyTo. Средство реагирования WCF гарантирует, что URI ссылки на конечную точку обоих CreateSequence сообщений и всех сообщений запроса приложения идентичны.