Протокол надежного обмена сообщениями, версия 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
идентичны иReplyTo
CreateSequence
используют [эталонные параметры] из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 и обеспечивает контроль над ними в WCF
ReliableMessagingBindingElement
: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:int
maxInclusive
значения 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-запрос, адресованный CreateSequence
ReplyTo
ссылке на конечную точку.
Время существования последовательности
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 отвечает на сообщение последовательности запросов с сообщением последовательности TerminateSequence
TerminateSequence
ответа.
В обычной последовательности отключения оба сообщения TerminateSequence
содержат полный набор SequenceAcknowledgement
.
Обмен сообщениями запрос-ответ, адресуемый инициатор
Привязка
WCF предоставляет шаблон обмена сообщениями с запросами с помощью двух последовательностей через входящий и исходящий HTTP-канал. WCF использует HTTP-запросы для передачи всех сообщений. Все HTTP-ответы имеют пустое тело и код состояния HTTP 202.
Обмен сообщениями CreateSequence
Инициатор WCF создает CreateSequence
сообщение с предложением. Средство реагирования WCF гарантирует, что CreateSequence
у него есть предложение перед созданием последовательности. WCF отправляет CreateSequenceResponse
HTTP-запрос, адресованный CreateSequence
ReplyTo
ссылке на конечную точку.
Корреляция запросов и ответов
Инициатор WCF гарантирует, что все сообщения запроса приложения имеют MessageId
ссылку и ссылку на конечную точку ReplyTo
. Инициатор WCF применяет ссылку CreateSequence
на конечную точку сообщения ReplyTo
по каждому сообщению запроса приложения. Для ответа WCF требуется, чтобы входящие сообщения запроса были носителями MessageId
и ReplyTo
. Средство реагирования WCF гарантирует, что URI ссылки на конечную точку обоих CreateSequence
сообщений и всех сообщений запроса приложения идентичны.