Reliable Messaging Protocol versão 1.0
Este tópico aborda os detalhes da implementação do Windows Communication Foundation (WCF) para o protocolo WS-Reliable Messaging de fevereiro de 2005 (versão 1.0) necessário para a interoperação usando o transporte HTTP. O WCF segue a especificação WS-Reliable Messaging com as restrições e esclarecimentos explicados neste tópico. Observe que o protocolo WS-ReliableMessaging versão 1.0 é implementado a partir do WinFX.
O protocolo WS-Reliable Messaging de fevereiro de 2005 é implementado no WCF pelo ReliableSessionBindingElement.
Por conveniência, o tópico usa as seguintes funções:
Iniciador: o cliente que inicia a criação da sequência WS-Reliable Message
Respondente: o serviço que recebe as solicitações do iniciador
Este documento usa os prefixos e namespaces na tabela a seguir.
Prefixo | Espaço de Nomes |
---|---|
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 |
Mensagens
Sequenciar mensagens de estabelecimento
WCF implementa CreateSequence
e CreateSequenceResponse
mensagens para estabelecer uma sequência de mensagens confiável. As seguintes restrições aplicam-se:
B1101: O iniciador WCF não gera o elemento opcional Expires na
CreateSequence
mensagem ou, nos casos em que aCreateSequence
mensagem contém umOffer
elemento , o elemento opcionalExpires
noOffer
elemento .B1102: Ao acessar a
CreateSequence
mensagem, o WCFResponder
envia e recebe ambos osExpires
elementos, se existirem, mas não usa seus valores.
O WS-Reliable Messaging introduz o Offer
mecanismo para estabelecer as duas sequências correlacionadas que formam uma sessão.
R1103: Se
CreateSequence
contiver umOffer
elemento , o Reliable Messaging Respondente deve aceitar a sequência e responder comCreateSequenceResponse
que contém umwsrm:Accept
elemento , formando duas sequências de converso correlacionadas ou rejeitar aCreateSequence
solicitação.R1104:
SequenceAcknowledgement
e as mensagens do aplicativo que fluem na sequência inversa devem ser enviadas para aReplyTo
referência de ponto final doCreateSequence
.R1105:
AcksTo
eReplyTo
as referências deCreateSequence
ponto final no devem ter valores de endereço que correspondam ao octeto-wise.O Respondente WCF verifica se a parte URI do e
ReplyTo
EPRs são idênticas antes deAcksTo
criar uma sequência.R1106:
AcksTo
eReplyTo
as referências de ponto final noCreateSequence
devem ter o mesmo conjunto de parâmetros de referência.O WCF não impõe, mas assume que [parâmetros de referência] de
AcksTo
eReplyTo
sobreCreateSequence
são idênticos e usa [parâmetros de referência] da referência de ponto de extremidade para confirmações e mensagens deReplyTo
sequência inversa.R1107: Quando duas sequências converse são estabelecidas usando o
Offer
mecanismo,SequenceAcknowledgement
e as mensagens de aplicativo que fluem em sequências converse devem ser enviadas para aReplyTo
referência de ponto final doCreateSequence
.R1108: Quando duas sequências inversas são estabelecidas usando o mecanismo Offer, a
[address]
wsrm:AcksTo
propriedade do elemento filho Endpoint Reference dowsrm:Accept
elemento doCreateSequenceResponse
deve corresponder byte-wise ao URI de destino doCreateSequence
.R1109: Quando duas sequências inversas são estabelecidas usando o mecanismo, as
Offer
mensagens enviadas pelo iniciador e as confirmações para mensagens pelo respondente devem ser enviadas para a mesma Referência de Ponto Final.O WCF usa o WS-Reliable Messaging para estabelecer sessões confiáveis entre o Iniciador e o Respondente. A implementação WS-Reliable Messaging do WCF fornece sessão confiável para padrões de mensagens unidirecionais, solicitação-resposta e full duplex. O mecanismo WS-Reliable Messaging
Offer
emCreateSequence
/CreateSequenceResponse
permite estabelecer duas sequências de conversação correlacionadas e fornece um protocolo de sessão adequado para todos os pontos de extremidade de mensagem. Como o WCF fornece uma garantia de segurança para essa sessão, incluindo proteção de ponta a ponta para a integridade da sessão, é prático garantir que as mensagens destinadas à mesma parte cheguem ao mesmo destino. Isso também permite pegar carona em confirmações de sequência em mensagens do aplicativo. Portanto, as restrições R1104, R1105 e R1108 se aplicam ao WCF.
Um exemplo de uma CreateSequence
mensagem.
<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>
Um exemplo de uma CreateSequenceResponse
mensagem.
<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
Segue-se uma lista de restrições que se aplicam a sequências:
B1201:WCF gera e acessa números de sequência não superiores ao valor máximo inclusivo de
xs:long
', 9223372036854775807.B1202:WCF sempre gera uma última mensagem de corpo vazio com a ação URI de
http://schemas.xmlsoap.org/ws/2005/02/rm/LastMessage
.B1203: WCF recebe e entrega uma mensagem com um cabeçalho de sequência que contém um
LastMessage
elemento desde que a ação URI nãohttp://schemas.xmlsoap.org/ws/2005/02/rm/LastMessage
é .
Um exemplo de um cabeçalho de sequência.
<wsrm:Sequence>
<wsrm:Identifier>
urn:uuid:addabbbf-60cb-44d3-8c5b-9e0841629a36
</wsrm:Identifier>
<wsrm:MessageNumber>
10
</wsrm:MessageNumber>
<wsrm:LastMessage/>
</wsrm:Sequence>
Cabeçalho AckRequested
WCF usa AckRequested
Header como um mecanismo keep-alive. WCF não gera o elemento opcional MessageNumber
. Ao receber uma mensagem com um AckRequested
cabeçalho que contém o elemento , o MessageNumber
WCF ignora o MessageNumber
valor do elemento, conforme mostrado no exemplo a seguir.
<wsrm:AckRequested>
<wsrm:Identifier>
urn:uuid:addabbbf-60cb-44d3-8c5b-9e0841629a36
</wsrm:Identifier>
</wsrm:AckRequested>
Cabeçalho SequenceAcknowledgement
O WCF usa o mecanismo piggy-back para confirmações de sequência fornecidas no WS-Reliable Messaging.
R1401: Quando são estabelecidas duas sequências inversas utilizando o
Offer
mecanismo, oSequenceAcknowledgement
cabeçalho pode ser incluído em qualquer mensagem de aplicação transmitida ao destinatário pretendido.B1402: Quando o WCF deve gerar uma confirmação antes de receber qualquer mensagem de sequência (por exemplo, para satisfazer uma
AckRequested
mensagem), o WCF gera umSequenceAcknowledgement
cabeçalho que contém o intervalo 0-0, conforme mostrado no exemplo a seguir.<wsrm:SequenceAcknowledgement> <wsrm:Identifier> urn:uuid:addabbbf-60cb-44d3-8c5b-9e0841629a36 </wsrm:Identifier> <wsrm:AcknowledgementRange Upper="0" Lower="0"/> </wsrm:SequenceAcknowledgement>
B1403: WCF não gera
SequenceAcknowledgement
cabeçalhos que contêm umNack
elemento mas suportaNack
elementos.
Falhas WS-ReliableMessaging
A seguir está uma lista de restrições que se aplicam à implementação WCF de falhas WS-Reliable Messaging:
B1501: WCF não gera
MessageNumberRollover
falhas.B1502: O ponto de extremidade WCF pode gerar
CreateSequenceRefused
falhas conforme descrito na especificação.B1503:Quando o ponto de extremidade do serviço atinge seu limite de conexão e não pode processar novas conexões, o WCF gera um subcódigo de falha adicional
CreateSequenceRefused
,netrm:ConnectionLimitReached
, conforme mostrado no exemplo a seguir.<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-Endereçamento de falhas
Como o WS-Reliable Messaging usa WS-Addressing, a implementação do WS-Reliable Messaging do WCF pode gerar falhas no WS-Addressing. Esta seção aborda as falhas WS-Addressing que o WCF gera explicitamente na camada WS-Reliable Messaging:
B1601:WCF gera a falha Message Addressing Header Required quando uma das seguintes opções for verdadeira:
Uma mensagem está faltando um
Sequence
cabeçalho e umAction
cabeçalho.Uma
CreateSequence
mensagem está faltando umMessageId
cabeçalho.Uma
CreateSequence
mensagem está faltando umReplyTo
cabeçalho.
B1602:WCF gera a ação de falha não suportada em resposta a uma mensagem que está faltando um
Sequence
cabeçalho e tem umAction
cabeçalho que não é reconhecido na especificação WS-Reliable Messaging.B1603:WCF gera a falha Endpoint Unavailable para indicar que o endpoint não processa a sequência com base no exame dos cabeçalhos de endereçamento da
CreateSequence
mensagem.
Composição do Protocolo
Composição com WS-Addressing
O WCF suporta duas versões do WS-Addressing: WS-Addressing 2004/08 [WS-ADDR] e W3C WS-Addressing 1.0 Recommendations [WS-ADDR-CORE] e [WS-ADDR-SOAP].
Embora a especificação WS-Reliable Messaging mencione apenas o WS-Addressing 2004/08, ela não restringe a versão WS-Addressing a ser usada. A seguir está uma lista de restrições que se aplicam ao WCF:
R2101: Tanto o WS-Addressing 2004/08 quanto o WS-Addressing 1.0 podem ser usados com o WS-Reliable Messaging.
R2102:Uma única versão do WS-Addressing deve ser usada em toda uma determinada sequência WS-Reliable Messaging ou um par de sequências inversas correlacionadas usando o
wsrm:Offer
mecanismo.
Composição com SOAP
O WCF suporta o uso de SOAP 1.1 e SOAP 1.2 com WS-Reliable Messaging.
Composição com WS-Security e WS-SecureConversation
O WCF fornece proteção para sequências WS-Reliable Messaging usando Transporte seguro (HTTPS), composição com WS-Security e composição com WS-Secure Conversation. A seguir está uma lista de restrições que se aplicam ao WCF:
R2301:Para proteger a integridade de uma sequência WS-Reliable Messaging, além da integridade e confidencialidade de mensagens individuais, o WCF requer que o WS-Secure Conversation seja usado.
R2302:A sessão do AWS-Secure Conversation deve ser estabelecida antes de estabelecer a(s) sequência(s) WS-Reliable Messaging.
R2303: Se o tempo de vida da sequência WS-Reliable Messaging exceder o tempo de vida da sessão WS-Secure Conversation, o estabelecido usando WS-Secure Conversation deverá ser renovado
SecurityContextToken
usando a associação WS-Secure Conversation correspondente.B2304:WS-A sequência de mensagens confiáveis ou um par de sequências de conversação correlacionadas estão sempre vinculados a uma única sessão WS-SecureConversation.
A fonte WCF gera o
wsse:SecurityTokenReference
elemento na seção de extensibilidade do elemento daCreateSequence
mensagem.R2305: Quando composta com WS-Secure Conversation, uma
CreateSequence
mensagem deve conter owsse:SecurityTokenReference
elemento .
WS-Reliable Messaging WS-Policy Assertion
O WCF usa WS-Reliable Messaging WS-Policy Assertion wsrm:RMAssertion
para descrever os recursos de endpoints. A seguir está uma lista de restrições que se aplicam ao WCF:
B3001: WCF anexa
wsrm:RMAssertion
WS-Policy Assertion awsdl:binding
elementos. O WCF suporta anexoswsdl:binding
ewsdl:port
elementos.B3002: WCF suporta as seguintes propriedades opcionais da asserção WS-Reliable Messaging e fornece controle sobre elas no WCF
ReliableMessagingBindingElement
:wsrm:InactivityTimeout
wsrm:AcknowledgementInterval
A seguir encontra-se um exemplo.
<wsrm:RMAssertion> <wsrm:InactivityTimeout Milliseconds="600000" /> <wsrm:AcknowledgementInterval Milliseconds="200" /> </wsrm:RMAssertion>
Controle de fluxo WS-Reliable Messaging Extension
O WCF usa a extensibilidade WS-Reliable Messaging para fornecer controle adicional opcional mais rígido sobre o fluxo de mensagens de sequência.
O controle de fluxo é habilitado definindo a ReliableSessionBindingElement.FlowControlEnabled propriedade como true
. A seguir está uma lista de restrições que se aplicam ao WCF:
B4001: Quando o controle de fluxo de mensagens confiável está habilitado, o WCF gera um
netrm:BufferRemaining
elemento na extensibilidade do elemento doSequenceAcknowledgement
cabeçalho.B4002: Quando o controle de fluxo de mensagens confiável está habilitado, o WCF não requer que um
netrm:BufferRemaining
elemento esteja presente noSequenceAcknowledgement
cabeçalho, conforme mostrado no exemplo a seguir.<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 usa
netrm:BufferRemaining
para indicar quantas novas mensagens o destino de mensagens confiáveis pode armazenar em buffer.B4004: O WCF Reliable Messaging Service limita o número de mensagens transmitidas quando o aplicativo de destino Reliable Messaging não pode receber mensagens rapidamente. O destino Mensagens confiáveis armazena mensagens em buffer e o valor do elemento cai para 0.
B4005: WCF gera
netrm:BufferRemaining
valores inteiros entre 0 e 4096 inclusive, e lê valores inteiros entre 0 exs:int
o valor de 'smaxInclusive
214748364 inclusive.
Padrões de troca de mensagens
Esta seção descreve o comportamento do WCF quando o WS-Reliable Messaging é usado para diferentes padrões de troca de mensagens. Para cada Padrão de Troca de Mensagens, os dois cenários de implantação a seguir são considerados:
Iniciador não endereçável: o iniciador está protegido por firewall; O Respondente pode entregar mensagens ao Iniciador somente em respostas HTTP.
Iniciador endereçável: tanto o iniciador quanto o respondente podem receber solicitações HTTP; em outras palavras, duas conexões HTTP inversas podem ser estabelecidas.
Iniciador unidirecional e não endereçável
Enlace
O WCF fornece um padrão de troca de mensagens unidirecional usando uma sequência em um canal HTTP. O WCF usa as solicitações HTTP para transmitir todas as mensagens do RMS para o RMD e a resposta HTTP para transmitir todas as mensagens do RMD para o RMS.
CreateSequence Exchange
O Iniciador WCF gera uma CreateSequence
mensagem sem oferta. O Respondente WCF garante que o CreateSequence
não tem oferta antes de criar uma sequência. O Respondente WCF responde à CreateSequence
solicitação com uma CreateSequenceResponse
mensagem.
SequenceAgradecimento
O Iniciador do WCF processa confirmações na resposta de todas as mensagens, exceto a mensagem e as CreateSequence
mensagens de falha. O Respondente WCF sempre gera uma confirmação autônoma na resposta à sequência e AckRequested
às mensagens.
Mensagem TerminateSequence
WCF trata TerminateSequence
como uma operação unidirecional, o que significa que a resposta HTTP tem um corpo vazio e código de status HTTP 202.
Iniciador endereçável unidirecional
Enlace
O WCF fornece um padrão de troca de mensagens unidirecional usando uma sequência em um canal Http de entrada e de saída. WCF usa as solicitações HTTP para transmitir todas as mensagens. Todas as respostas HTTP têm um corpo vazio e um código de status HTTP 202.
CreateSequence Exchange
O Iniciador WCF gera uma CreateSequence
mensagem sem oferta. O Respondente WCF garante que o não tenha nenhuma oferta antes de CreateSequence
criar uma sequência. O Respondente WCF transmite a CreateSequenceResponse
mensagem em uma solicitação HTTP endereçada com a referência de ReplyTo
ponto de extremidade.
Duplex, iniciador endereçável
Enlace
O WCF fornece um padrão de troca de mensagens bidirecionais totalmente assíncrono usando duas sequências em um canal HTTP de entrada e de saída. WCF usa as solicitações HTTP para transmitir todas as mensagens. Todas as respostas HTTP têm um corpo vazio e um código de status HTTP 202.
CreateSequence Exchange
O Iniciador WCF gera uma CreateSequence
mensagem com uma oferta. O Respondente WCF garante que o CreateSequence
tenha uma oferta antes de criar uma sequência. O WCF envia a CreateSequenceResponse
solicitação on HTTP endereçada CreateSequence
à referência de ponto de extremidade do .ReplyTo
Tempo de vida da sequência
O WCF trata as duas sequências como uma sessão totalmente duplex.
Ao gerar uma falha que falha uma sequência, o WCF espera que o ponto de extremidade remoto falhe ambas as sequências. Ao ler uma falha que falha uma sequência, o WCF falha ambas as sequências.
WCF pode fechar sua sequência de saída e continuar a processar mensagens em sua sequência de entrada. Por outro lado, o WCF pode processar o fechamento da sequência de entrada e continuar a enviar mensagens em sua sequência de saída.
Solicitação-resposta, iniciador não endereçável
Enlace
O WCF fornece um padrão de troca de mensagens unidirecionais e solicitação-resposta usando duas sequências em um canal HTTP. O WCF usa as solicitações HTTP para transmitir as mensagens da sequência de solicitação e usa as respostas HTTP para transmitir as mensagens da sequência de resposta.
CreateSequence Exchange
O Iniciador WCF gera uma CreateSequence
mensagem com uma oferta. O Respondente WCF garante que o CreateSequence
tenha uma oferta antes de criar uma sequência. O Respondente WCF responde à CreateSequence
solicitação com uma CreateSequenceResponse
mensagem.
Mensagem unidirecional
Para concluir um protocolo de troca de mensagens unidirecionais com êxito, o Iniciador WCF transmite uma mensagem de sequência de solicitação na solicitação HTTP e recebe uma mensagem autônoma SequenceAcknowledgement
na resposta HTTP. O SequenceAcknowledgement
deve reconhecer a mensagem transmitida.
O Respondente WCF pode responder à solicitação com uma confirmação, uma falha ou uma resposta com um corpo vazio e código de status HTTP 202.
Mensagens bidirecionais
Para concluir um protocolo de troca de mensagens bidirecionais com êxito, o Iniciador WCF transmite uma mensagem de sequência de solicitação na solicitação HTTP e recebe uma mensagem de sequência de resposta na resposta HTTP. A resposta deve conter uma SequenceAcknowledgement
mensagem de confirmação da sequência de pedidos transmitida.
O Respondente WCF pode responder à solicitação com uma resposta de aplicativo, uma falha ou uma resposta com um corpo vazio e código de status HTTP 202.
Devido à presença de mensagens unidirecionais e ao tempo das respostas do aplicativo, o número de sequência da mensagem de sequência de solicitação e o número de sequência da mensagem de resposta não têm correlação.
Repetindo respostas
O WCF depende da correlação solicitação-resposta HTTP para correlação de protocolo de troca de mensagens bidirecional. Devido a isso, o iniciador WCF não para de tentar novamente uma mensagem de sequência de solicitação quando a mensagem de sequência de solicitação é confirmada, mas sim quando a resposta HTTP carrega uma confirmação, mensagem de usuário ou falha. O Respondente do WCF tenta novamente respostas no trecho de solicitação HTTP da solicitação à qual a resposta está correlacionada.
Troca LastMessage
O Iniciador WCF gera e transmite uma última mensagem vazia no trecho de solicitação HTTP. WCF requer uma resposta, mas ignora a mensagem de resposta real. O Respondente WCF responde à última mensagem de corpo vazio da sequência de solicitação com a última mensagem de corpo vazio da sequência de resposta.
Se o Respondente do WCF receber uma última mensagem na qual o URI da ação não http://schemas.xmlsoap.org/ws/2005/02/rm/LastMessage
é , o WCF responderá com uma última mensagem. No caso de um protocolo de troca de mensagens bidirecional, a última mensagem carrega a mensagem do aplicativo; No caso de um protocolo de troca de mensagens unidirecional, a última mensagem está vazia.
O Respondente WCF não requer uma confirmação para a última mensagem vazia da sequência de resposta.
TerminateSequence Exchange
Quando todas as solicitações tiverem recebido uma resposta válida, o Iniciador do WCF gerará e transmitirá a mensagem da sequência de TerminateSequence
solicitações no trecho da solicitação HTTP. WCF requer uma resposta, mas ignora a mensagem de resposta real. O Respondente WCF responde à mensagem da sequência de TerminateSequence
solicitação com a mensagem da sequência de TerminateSequence
resposta.
Em uma sequência de desligamento normal, ambas as TerminateSequence
mensagens carregam um alcance SequenceAcknowledgement
completo.
Solicitação/resposta, iniciador endereçável
Enlace
O WCF fornece um padrão de troca de mensagens de solicitação-resposta usando duas sequências em um canal HTTP de entrada e de saída. WCF usa as solicitações HTTP para transmitir todas as mensagens. Todas as respostas HTTP têm um corpo vazio e um código de status HTTP 202.
CreateSequence Exchange
O Iniciador WCF gera uma CreateSequence
mensagem com uma oferta. O Respondente WCF garante que o CreateSequence
tenha uma oferta antes de criar uma sequência. O WCF envia a CreateSequenceResponse
solicitação on HTTP endereçada CreateSequence
à referência de ponto de extremidade do .ReplyTo
Correlação Solicitação/Resposta
O Iniciador do WCF garante que todas as mensagens de solicitação de aplicativo tenham uma referência e MessageId
uma referência de ReplyTo
ponto de extremidade. O Iniciador WCF aplica a referência de ponto de ReplyTo
extremidade da CreateSequence
mensagem em cada mensagem de solicitação de aplicativo. O Respondente WCF requer que as mensagens de solicitação de entrada tenham a MessageId
e a ReplyTo
. O Respondente do WCF garante que o URI da referência de ponto de extremidade das mensagens CreateSequence
de solicitação do aplicativo e de todas as mensagens sejam idênticas.