Protocolo de mensagem confiável versão 1.1
Este tópico aborda os detalhes de implementação do Windows Communication Foundation (WCF) para o protocolo WS-ReliableMessaging de fevereiro de 2007 (versão 1.1) necessário para interoperação usando o transporte HTTP. O WCF segue a especificação WS-ReliableMessaging com as restrições e esclarecimentos explicados neste tópico. Observe que o protocolo WS-ReliableMessaging versão 1.1 é implementado a partir do .NET Framework 3.5.
O protocolo WS-ReliableMessaging de fevereiro de 2007 é implementado no WCF pelo ReliableSessionBindingElement.
Para conveniência, o tópico usa as seguintes funções:
Iniciador: o cliente que inicia a criação da sequência de mensagens WS-Reliable.
Respondente: o serviço que recebe as solicitações do iniciador.
Este documento usa os prefixos e namespaces na tabela a seguir.
Prefixo | Namespace |
---|---|
wsrm | http://docs.oasis-open.org/ws-rx/wsrm/200702 |
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 |
wsrmp | http://docs.oasis-open.org/ws-rx/wsrmp/200702 |
netrmp | http://schemas.microsoft.com/ws-rx/wsrmp/200702 |
wsp | (WS-Policy 1.2 ou WS-Policy 1.5) |
Mensagens
Criação de sequência
O WCF implementa as mensagens CreateSequence
e CreateSequenceResponse
para estabelecer uma sequência de mensagens confiável. As seguintes restrições se aplicam:
B1101: o Iniciador do WCF usa a mesma referência de ponto de extremidade que
ReplyTo
,AcksTo
eOffer/Endpoint
da mensagemCreateSequence
.R1102: as referências do ponto de extremidade
AcksTo
,ReplyTo
eOffer/Endpoint
na mensagemCreateSequence
devem ter valores de endereço com representações de cadeia de caracteres idênticas, de modo que correspondam ao octeto.- O Respondente do WCF verifica se a parte do URI das referências do ponto de extremidade
AcksTo
,ReplyTo
eEndpoint
são idênticos antes de criar uma sequência.
- O Respondente do WCF verifica se a parte do URI das referências do ponto de extremidade
R1103: as referências de ponto de extremidade
AcksTo
,ReplyTo
eOffer/Endpoint
na mensagemCreateSequence
devem ter o mesmo conjunto de parâmetros de referência.- O WCF não impõe, mas assume que os parâmetros de referência das referências de ponto de extremidade
AcksTo
,ReplyTo
eOffer/Endpoint
emCreateSequence
são idênticos e usa parâmetros de referência da referência do ponto de extremidadeReplyTo
para confirmações e mensagens de sequência inversa.
- O WCF não impõe, mas assume que os parâmetros de referência das referências de ponto de extremidade
B1104: o Iniciador do WCF não gera o elemento
Expires
ouOffer/Expires
opcional na mensagemCreateSequence
.B1105: ao acessar a mensagem
CreateSequence
, o Respondente do WCF usa o valorExpires
no elementoCreateSequence
como o valorExpires
no elementoCreateSequenceResponse
. Caso contrário, o Respondente do WCF lerá e ignorará os valoresExpires
eOffer/Expires
.B1106: ao acessar a mensagem
CreateSequenceResponse
, o Iniciador do WCF lê o valorExpires
opcional, mas não o usa.B1107: o Iniciador do WCF e o Respondente sempre geram o elemento
IncompleteSequenceBehavior
opcional nos elementosCreateSequence/Offer
eCreateSequenceResponse
.B1108: o WCF usa apenas os valores
DiscardFollowingFirstGap
eNoDiscard
no elementoIncompleteSequenceBehavior
.- WS-ReliableMessaging introduz o mecanismo
Offer
para estabelecer as duas sequências correlacionadas inversas que formam uma sessão.
- WS-ReliableMessaging introduz o mecanismo
B1109: se
CreateSequence
contiver um elementoOffer
, a única maneira de o Respondente do WCF rejeitar a sequência oferecida respondendo com umCreateSequenceResponse
sem um elementoAccept
.B1110: se um Respondente de mensagens confiáveis rejeitar a sequência oferecida, o Iniciador do WCF falhará na sequência recém-estabelecida.
B1111: se
CreateSequence
não contiver um elementoOffer
, o Respondente do WCF bidirecional rejeita a sequência oferecida respondendo com uma falhaCreateSequenceRefused
.R1112: quando duas sequências inversas são estabelecidas usando o mecanismo
Offer
, a propriedade[address]
da referência do ponto de extremidadeCreateSequenceResponse/Accept/AcksTo
deve corresponder ao URI de destino do byte por byte da mensagemCreateSequence
.R1113: quando duas sequências inversas são estabelecidas usando o mecanismo
Offer
, todas as mensagens em ambas as sequências que fluem do Iniciador para o Respondente devem ser enviadas para a mesma referência de ponto de extremidade.
O WCF usa WS-ReliableMessaging para estabelecer sessões confiáveis entre o Iniciador e o Respondente. A implementação de WS-ReliableMessaging do WCF fornece uma sessão confiável para padrões de mensagens duplex unidirecionais, de solicitação-resposta e duplex completo. O mecanismo Offer
de WS-ReliableMessaging em CreateSequence
e CreateSequenceResponse
permite estabelecer duas sequências inversas 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 a proteção de ponta a ponta para a integridade da sessão, é prático garantir que as mensagens destinadas para a mesma parte cheguem ao mesmo destino. Isso também permite o “piggy-back” de confirmações de sequência em mensagens de aplicativo. Portanto, as restrições R1102, R1112 e R1113 se aplicam ao WCF.
Um exemplo de uma mensagem CreateSequence
.
<s:Envelope>
<s:Header>
<wsa:Action s:mustUnderstand="1">http://docs.oasis-open.org/ws-rx/wsrm/200702/CreateSequence</wsa:Action>
<wsa:MessageID>urn:uuid:949cca61-8813-42ff-ab33-18d9e3fa82fa</wsa:MessageID>
<wsa:ReplyTo>
<wsa:Address>http://Business456.com/clientA</wsa:Address>
</wsa:ReplyTo>
<wsa:To s:mustUnderstand="1">http://BusinessABC.com/serviceA</wsa: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:066b4730-fc82-458a-a5c1-210be4fb4e4e</wsrm:Identifier>
<wsrm:Endpoint>
<wsa:Address>http://Business456.com/clientA</wsa:Address>
</wsrm:Endpoint>
<wsrm:IncompleteSequenceBehavior>DiscardFollowingFirstGap</wsrm:IncompleteSequenceBehavior>
</wsrm:Offer>
</wsrm:CreateSequence>
</s:Body>
</s:Envelope>
Um exemplo de uma mensagem CreateSequenceResponse
.
<s:Envelope>
<s:Header>
<wsa:Action s:mustUnderstand="1">http://docs.oasis-open.org/ws-rx/wsrm/200702/CreateSequenceResponse</wsa:Action>
<wsa:RelatesTo>urn:uuid:949cca61-8813-42ff-ab33-18d9e3fa82fa</wsa:RelatesTo>
<wsa:To s:mustUnderstand="1">http://Business456.com/clientA</wsa:To>
</s:Header>
<s:Body>
<wsrm:CreateSequenceResponse>
<wsrm:Identifier>urn:uuid:656652b8-9af2-4e94-9d07-2dc21c05ed27</wsrm:Identifier>
<wsrm:IncompleteSequenceBehavior>DiscardFollowingFirstGap</wsrm:IncompleteSequenceBehavior>
<wsrm:Accept>
<wsrm:AcksTo>
<wsa:Address>http://BusinessABC.com/serviceA</wsa:Address>
</wsrm:AcksTo>
</wsrm:Accept>
</wsrm:CreateSequenceResponse>
</s:Body>
</s:Envelope>
Fechando uma sequência
O WCF usa as mensagens CloseSequence
e CloseSequenceResponse
para um desligamento iniciado pela fonte das mensagens confiáveis. O destino das mensagens confiáveis do WCF não inicia o desligamento e a fonte das mensagens confiáveis do WCF não dá suporte a um desligamento iniciado pelo destino das mensagens confiáveis. As seguintes restrições se aplicam:
B1201: a fonte das mensagens confiáveis do WCF sempre envia uma mensagem
CloseSequence
para desligar a sequência.B1202: a fonte das mensagens confiáveis aguarda a confirmação de todo o intervalo de mensagens de sequência antes de enviar a mensagem
CloseSequence
.B1203: a fonte das mensagens confiáveis sempre inclui o elemento
LastMsgNumber
opcional, a menos que a sequência não contenha mensagens.R1204: o destino das mensagens confiáveis não deve iniciar o desligamento enviando uma mensagem
CloseSequence
.B1205: ao receber uma mensagem
CloseSequence
, a fonte das mensagens confiáveis do WCF considera a sequência incompleta e envia uma falha.
Um exemplo de uma mensagem CloseSequence
.
<s:Envelope>
<s:Header>
<wsa:Action s:mustUnderstand="1">http://docs.oasis-open.org/ws-rx/wsrm/200702/CloseSequence</wsa:Action>
<wsa:MessageID>urn:uuid:6ce1d4c3-e1c1-474f-a8c9-4210e37f7877</wsa:MessageID>
<wsa:ReplyTo>
<wsa:Address>http://Business456.com/clientA</wsa:Address>
</wsa:ReplyTo>
<wsa:To s:mustUnderstand="1">http://BusinessABC.com/serviceA</wsa:To>
</s:Header>
<s:Body>
<wsrm:CloseSequence>
<wsrm:Identifier>urn:uuid:656652b8-9af2-4e94-9d07-2dc21c05ed27</wsrm:Identifier>
<wsrm:LastMsgNumber>30</wsrm:LastMsgNumber>
</wsrm:CloseSequence>
</s:Body>
</s:Envelope>
Exemplo de mensagem CloseSequenceResponse
:
<s:Envelope>
<s:Header>
<wsrm:SequenceAcknowledgement>
<wsrm:Identifier>urn:uuid:656652b8-9af2-4e94-9d07-2dc21c05ed27</wsrm:Identifier>
<wsrm:AcknowledgementRange Lower="1" Upper="30"></wsrm:AcknowledgementRange>
<wsrm:Final></wsrm:Final>
<netrm:BufferRemaining>8</netrm:BufferRemaining>
</wsrm:SequenceAcknowledgement>
<wsa:Action s:mustUnderstand="1">http://docs.oasis-open.org/ws-rx/wsrm/200702/CloseSequenceResponse</wsa:Action>
<wsa:RelatesTo>urn:uuid:6ce1d4c3-e1c1-474f-a8c9-4210e37f7877</wsa:RelatesTo>
<wsa:To s:mustUnderstand="1">http://Business456.com/clientA</wsa:To>
</s:Header>
<s:Body>
<wsrm:CloseSequenceResponse>
<wsrm:Identifier>urn:uuid:656652b8-9af2-4e94-9d07-2dc21c05ed27</wsrm:Identifier>
</wsrm:CloseSequenceResponse>
</s:Body>
</s:Envelope>
Terminação de sequência
O WCF usa principalmente o handshake TerminateSequence/TerminateSequenceResponse
depois de concluir o handshake CloseSequence/CloseSequenceResponse
. O destino das mensagens confiáveis do WCF não inicia a terminação e a fonte das mensagens confiáveis não dá suporte a uma terminação iniciada pelo destino das mensagens confiáveis. As seguintes restrições se aplicam:
B1301: o Iniciador do WCF só envia a mensagem
TerminateSequence
após a conclusão bem-sucedida do handshakeCloseSequence/CloseSequenceResponse
.R1302: o WCF valida que o elemento
LastMsgNumber
é consistente em todas as mensagensCloseSequence
eTerminateSequence
em uma determinada sequência. Isso significa queLastMsgNumber
não está presente em todas as mensagensCloseSequence
eTerminateSequence
ou está presente e idêntico em todas as mensagensCloseSequence
eTerminateSequence
.B1303: ao receber uma mensagem
TerminateSequence
após o handshakeCloseSequence/CloseSequenceResponse
, o destino das mensagens confiáveis responde com uma mensagemTerminateSequenceResponse
. Como a fonte das mensagens confiáveis tem a confirmação final antes de enviar a mensagemTerminateSequence
, o destino das mensagens confiáveis sabe, sem dúvida, que a sequência termina e recupera recursos imediatamente.B1304: ao receber uma mensagem
TerminateSequence
antes do handshakeCloseSequence/CloseSequenceResponse
, o destino das mensagens confiáveis do WCF responde com uma mensagemTerminateSequenceResponse
. Se o destino das mensagens confiáveis determinar que não há inconsistências na sequência, o destino das mensagens confiáveis aguardará um tempo especificado pelo destino do aplicativo antes de recuperar recursos, para permitir ao cliente a chance de receber a confirmação final. Caso contrário, o destino das mensagens confiáveis recupera recursos imediatamente e indica ao destino do aplicativo que a sequência termina com dúvida ao gerar o eventoFaulted
.
Um exemplo de uma mensagem TerminateSequence
.
<s:Envelope>
<s:Header>
<wsa:Action s:mustUnderstand="1">http://docs.oasis-open.org/ws-rx/wsrm/200702/TerminateSequence</wsa:Action>
<wsa:MessageID>urn:uuid:3597a398-4f3c-40f4-9335-8f1515572fdf</wsa:MessageID>
<wsa:ReplyTo>
<wsa:Address>http://Business456.com/clientA</wsa:Address>
</wsa:ReplyTo>
<wsa:To s:mustUnderstand="1">http://BusinessABC.com/serviceA</wsa:To>
</s:Header>
<s:Body>
<wsrm:TerminateSequence>
<wsrm:Identifier>urn:uuid:656652b8-9af2-4e94-9d07-2dc21c05ed27</wsrm:Identifier>
<wsrm:LastMsgNumber>30</wsrm:LastMsgNumber>
</wsrm:TerminateSequence>
</s:Body>
</s:Envelope>
Exemplo de mensagem TerminateSequenceResponse
:
<s:Envelope>
<s:Header>
<wsrm:SequenceAcknowledgement>
<wsrm:Identifier>urn:uuid:656652b8-9af2-4e94-9d07-2dc21c05ed27</wsrm:Identifier>
<wsrm:AcknowledgementRange Lower="1" Upper="30"></wsrm:AcknowledgementRange>
<wsrm:Final></wsrm:Final>
<netrm:BufferRemaining>8</netrm:BufferRemaining>
</wsrm:SequenceAcknowledgement>
<wsa:Action s:mustUnderstand="1">http://docs.oasis-open.org/ws-rx/wsrm/200702/TerminateSequenceResponse</wsa:Action>
<wsa:RelatesTo>urn:uuid:3597a398-4f3c-40f4-9335-8f1515572fdf</wsa:RelatesTo>
<wsa:To s:mustUnderstand="1">://Business456.com/clientA</wsa:To>
</s:Header>
<s:Body>
<wsrm:TerminateSequenceResponse>
<wsrm:Identifier>urn:uuid:656652b8-9af2-4e94-9d07-2dc21c05ed27</wsrm:Identifier>
</wsrm:TerminateSequenceResponse>
</s:Body>
</s:Envelope>
Sequências
Veja a seguir uma lista de restrições que se aplicam a sequências:
- B1401: o WCF gera e acessa números de sequência não superiores ao valor inclusivo máximo de
xs:long
, 9223372036854775807.
Um exemplo de um cabeçalho Sequence
.
<wsrm:Sequence s:mustUnderstand="1">
<wsrm:Identifier>urn:uuid:656652b8-9af2-4e94-9d07-2dc21c05ed27</wsrm:Identifier>
<wsrm:MessageNumber>1</wsrm:MessageNumber>
</wsrm:Sequence>
Solicitar confirmação
O WCF usa o cabeçalho AckRequested
como um mecanismo de keep alive.
Um exemplo de um cabeçalho AckRequested
.
<wsrm:AckRequested>
<wsrm:Identifier>urn:uuid:656652b8-9af2-4e94-9d07-2dc21c05ed27</wsrm:Identifier>
</wsrm:AckRequested>
SequenceAcknowledgement
O WCF usa um mecanismo “piggy-back” para confirmações de sequência fornecidas no WS-Reliable Messaging. As seguintes restrições se aplicam:
R1601: quando duas sequências inversas são estabelecidas usando o mecanismo
Offer
, o cabeçalhoSequenceAcknowledgement
pode ser incluído em qualquer mensagem de aplicativo transmitida para o destinatário pretendido. O ponto de extremidade remoto deve ser capaz de acessar um cabeçalho com piggybackSequenceAcknowledgement
.B1602: o WCF não gera cabeçalhos
SequenceAcknowledgement
que contêm elementosNack
. O WCF valida que cada elementoNack
contém um número de sequência, mas, caso contrário, ignora o elemento e o valorNack
.
Um exemplo de um cabeçalho SequenceAcknowledgement
.
<wsrm:SequenceAcknowledgement>
<wsrm:Identifier>urn:uuid:656652b8-9af2-4e94-9d07-2dc21c05ed27</wsrm:Identifier>
<wsrm:AcknowledgementRange Lower="1" Upper="1"></wsrm:AcknowledgementRange>
</wsrm:SequenceAcknowledgement>
Falhas de WS-ReliableMessaging
A seguir temos uma lista de restrições que se aplicam à implementação do WCF de falhas do WS-ReliableMessaging. As seguintes restrições se aplicam:
B1701: o WCF não gera falhas de
MessageNumberRollover
.B1702: sobre SOAP 1.2, quando o ponto de extremidade de serviço atinge seu limite de conexão e não pode processar novas conexões, o WCF gera um subcódigo de falha de
CreateSequenceRefused
aninhado,netrm:ConnectionLimitReached
, conforme mostrado no exemplo a seguir.
<s:Envelope>
<s:Header>
<wsa:Action>http://docs.oasis-open.org/ws-rx/wsrm/200702/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">Server 'http://BusinessABC.com/serviceA' is too busy to process this request. Try again later.</s:Text>
</s:Reason>
</s:Fault>
</s:Body>
</s:Envelope>
Falhas de WS-Addressing
Como WS-ReliableMessaging usa o WS-Addressing, a implementação de WS-ReliableMessaging do WCF pode gerar e transmitir falhas de WS-Addressing. Esta seção aborda as falhas de WS-Addressing que o WCF gera e transmite explicitamente na camada de WS-ReliableMessaging:
B1801: o WCF gera e transmite a falha
Message Addressing Header Required
quando um dos seguintes é verdadeiro:Uma mensagem
CreateSequence
,CloseSequence
ouTerminateSequence
está sem um cabeçalhoMessageId
.Uma mensagem
CreateSequence
,CloseSequence
ouTerminateSequence
está sem um cabeçalhoReplyTo
.Uma mensagem
CreateSequenceResponse
,CloseSequenceResponse
ouTerminateSequenceResponse
está sem um cabeçalhoRelatesTo
.
B1802: o WCF gera e transmite a falha
Endpoint Unavailable
para indicar que não há nenhum ponto de extremidade escutando que possa processar a sequência com base no exame dos cabeçalhos de endereçamento na mensagemCreateSequence
.
Composição de protocolo
Composição com WS-Addressing
O WCF dá suporte a duas versões do WS-Addressing: WS-Addressing 2004/08 [WS-ADDR] e Recomendações do W3C WS-Addressing 1.0 [WS-ADDR-CORE] e [WS-ADDR-SOAP].
Embora a especificação de WS-ReliableMessaging mencione apenas WS-Addressing 2004/08, ela não restringe a versão do WS-Addressing a ser usada. Veja a seguir uma lista de restrições que se aplicam ao WCF:
R2101: WS-Addressing 2004/08 e WS-Addressing 1.0 podem ser usados com WS-Reliable Messaging.
R2102: uma única versão do WS-Addressing deve ser usada em uma determinada sequência de WS-ReliableMessaging ou um par de sequências inversas correlacionadas usando o mecanismo
Offer
.
Composição com SOAP
O WCF dá suporte ao 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 de WS-ReliableMessaging usando Transporte seguro (HTTPS), composição com WS-Security e composição com WS-Secure Conversation. O protocolo WS-ReliableMessaging 1.1, protocolo WS-Security 1.1 e WS-Secure Conversation 1.3 devem ser usados juntos. Veja a seguir uma lista de restrições que se aplicam ao WCF:
R2301: para proteger a integridade de uma sequência de WS-ReliableMessaging, além da integridade e confidencialidade de mensagens individuais, o WCF exige que WS-Secure Conversation seja usado.
R2302: a sessão de AWS-Secure Conversation deve ser estabelecida antes de estabelecer a(s) sequência(s) de WS-ReliableMessaging.
R2303: se o tempo de vida da sequência de WS-ReliableMessaging exceder o tempo de vida da sessão de WS-Secure Conversation, o
SecurityContextToken
estabelecido pelo uso de WS-Secure Conversation deve ser renovado usando a associação de WS-Secure Conversation Renewal correspondente.B2304: a sequência WS-ReliableMessaging ou um par de sequências inversas correlacionadas são sempre associadas a uma única sessão de WS-SecureConversation.
R2305: quando composto com WS-Secure Conversation, o respondente do WCF requer que a mensagem
CreateSequence
contenha o elementowsse:SecurityTokenReference
e o cabeçalhowsrm:UsesSequenceSTR
.
Um exemplo de um cabeçalho UsesSequenceSTR
.
<wsrm:UsesSequenceSTR></wsrm:UsesSequenceSTR>
Composição com sessões SSL/TLS
O WCF não dá suporte à composição com sessões SSL/TLS:
B2401: o WCF não gera o cabeçalho
wsrm:UsesSequenceSSL
.R2402: um Iniciador de mensagens confiáveis não deve enviar uma mensagem
CreateSequence
com um cabeçalhowsrm:UsesSequenceSSL
para um Respondente do WCF.
Composição com WS-Policy
O WCF dá suporte a duas versões do WS-Policy: WS-Policy 1.2 e WS-Policy 1.5.
Declaração de WS-Policy do WS-ReliableMessaging
O WCF usa Declaração de WS-Policy do WS-ReliableMessaging wsrm:RMAssertion
para descrever os recursos de pontos de extremidade. Veja a seguir uma lista de restrições que se aplicam ao WCF:
B3001: o WCF anexa a Declaração de WS-Policy
wsrmn:RMAssertion
a elementoswsdl:binding
. O WCF dá suporte a anexos para os elementoswsdl:binding
ewsdl:port
.B3002: o WCF nunca gera a marca
wsp:Optional
.B3003: ao acessar a Declaração de WS-Policy
wsrmp:RMAssertion
, o WCF ignora a marcawsp:Optional
e trata a política WS-RM como obrigatória.R3004: como o WCF não compõe com sessões SSL/TLS, o WCF não aceita a política que especifica
wsrmp:SequenceTransportSecurity
.B3005: o WCF sempre gera o elemento
wsrmp:DeliveryAssurance
.B3006: o WCF sempre especifica a garantia de entrega
wsrmp:ExactlyOnce
.B3007: o WCF gera e lê as seguintes propriedades da declaração de WS-ReliableMessaging e fornece controle sobre elas no WCF
ReliableSessionBindingElement
:netrmp:InactivityTimeout
netrmp:AcknowledgementInterval
Um exemplo de um
RMAssertion
.<wsrmp:RMAssertion> <wsp:Policy> <wsrmp:SequenceSTR/> <wsrmp:DeliveryAssurance> <wsp:Policy> <wsrmp:ExactlyOnce/> <wsrmp:InOrder/> </wsp:Policy> </wsrmp:DeliveryAssurance> </wsp:Policy> <netrmp:InactivityTimeout Milliseconds="600000"/> <netrmp:AcknowledgementInterval Milliseconds="200"/> </wsrmp:RMAssertion>
Extensão de WS-ReliableMessaging de controle de fluxo
O WCF usa a extensibilidade de WS-ReliableMessaging para fornecer controle mais rigoroso adicional opcional sobre o fluxo de mensagens de sequência.
O controle de fluxo é habilitado definindo a propriedade ReliableSessionBindingElement.FlowControlEnabled como true
. Veja a seguir uma lista de restrições que se aplicam ao WCF:
B4001: quando o controle de fluxo de mensagens confiáveis está habilitado, o WCF gera um elemento
netrm:BufferRemaining
na extensibilidade do elemento do cabeçalhoSequenceAcknowledgement
, conforme mostrado no exemplo a seguir.<wsrm:SequenceAcknowledgement> <wsrm:Identifier>urn:uuid:656652b8-9af2-4e94-9d07-2dc21c05ed27</wsrm:Identifier> <wsrm:AcknowledgementRange Upper="1" Lower="1"/> <netrm:BufferRemaining>8</netrm:BufferRemaining> </wsrm:SequenceAcknowledgement>
B4002: mesmo quando o controle de fluxo de mensagens confiáveis está habilitado, o WCF não requer um elemento
netrm:BufferRemaining
no cabeçalhoSequenceAcknowledgement
.B4003: o destino de mensagens confiáveis do WCF usa
netrm:BufferRemaining
para indicar quantas novas mensagens o destino pode armazenar em buffer.B4004: quando o controle de fluxo de mensagens confiáveis está habilitado, a fonte de mensagens confiáveis do WCF usa o valor de
netrm:BufferRemaining
para limitar a transmissão de mensagens.B4005: o WCF gera valores inteiros
netrm:BufferRemaining
entre 0 e 4096 inclusive e lê valores inteiros entre 0 e o valor 214748364maxInclusive
dexs:int
inclusive.
Padrões de troca de mensagens
Esta seção descreve o comportamento do WCF quando WS-ReliableMessaging é usado para diferentes padrões de troca de mensagens. Para cada padrão de troca de mensagens, os dois cenários de implantações a seguir são considerados:
Iniciador não endereçável: o iniciador está atrás do firewall; o Respondente pode entregar mensagens ao Iniciador somente em respostas HTTP.
Iniciador endereçável: solicitações HTTP podem ser enviadas ao Iniciador e ao Respondente; em outras palavras, duas conexões HTTP inversas podem ser estabelecidas.
Iniciador unidirecional não endereçável
Associação
O WCF fornece um padrão de troca de mensagens unidirecionais usando uma sequência em um canal HTTP. O WCF usa solicitações HTTP para transmitir todas as mensagens do Iniciador para o Respondente e respostas HTTP para transmitir todas as mensagens do Respondente para o Iniciador.
Troca de CreateSequence
O Iniciador do WCF transmite uma mensagem CreateSequence
sem nenhum elemento Offer
em uma solicitação HTTP e espera a mensagem CreateSequenceResponse
na resposta HTTP. O Respondente do WCF cria uma sequência e transmite a mensagem CreateSequenceResponse
sem nenhum elemento Accept
na resposta HTTP.
SequenceAcknowledgement
O Iniciador do WCF processa confirmações na resposta de todas as mensagens, exceto a mensagem CreateSequence
e as mensagens de falha. O Respondente do WCF sempre transmite uma confirmação autônoma na resposta HTTP para todas as sequências e mensagens AckRequested
.
Troca de CloseSequence
O Iniciador do WCF transmite uma mensagem CloseSequence
sem uma solicitação HTTP e espera a mensagem CreateSequenceResponse
na resposta HTTP. O Respondente do WCF transmite a mensagem CloseSequenceResponse
na resposta HTTP.
Troca TerminateSequence
O Iniciador do WCF transmite uma mensagem TerminateSequence
em uma solicitação HTTP e espera a mensagem TerminateSequenceResponse
na resposta HTTP. O Respondente do WCF transmite a mensagem TerminateSequenceResponse
na resposta HTTP.
Iniciador unidirecional endereçável
Associação
O WCF fornece um padrão de troca de mensagens unidirecionais usando uma sequência em um canal HTTP de entrada e um de saída. O 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.
Troca de CreateSequence
O Iniciador do WCF transmite uma mensagem CreateSequence
sem nenhum elemento Offer
em uma solicitação HTTP. O Respondente do WCF cria uma sequência e transmite a mensagem CreateSequenceResponse
sem nenhum elemento Accept
em uma solicitação HTTP.
Iniciador duplex endereçável
Associação
O WCF fornece um padrão de troca de mensagens bidirecional totalmente assíncrono usando duas sequências em um canal HTTP de entrada e um de saída. Esse padrão de troca de mensagens pode ser misturado com Request/Reply
, o padrão de troca de mensagens do Iniciador Addressable
de maneira limitada. O 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.
Troca de CreateSequence
O Iniciador do WCF transmite uma mensagem CreateSequence
com um elemento Offer
em uma solicitação HTTP. O Respondente do WCF garante que o CreateSequence
tenha um elemento Offer
, em seguida, cria uma sequência e transmite a mensagem CreateSequenceResponse
com um elemento Accept
.
Tempo de vida da sequência
O WCF trata as duas sequências como uma sessão totalmente duplex.
Ao gerar uma falha que causa falha em uma sequência, o WCF espera que o ponto de extremidade remoto cause falha nas duas sequências. Ao ler uma falha que causa falha em uma sequência, o WCF causa falha em ambas as sequências.
O WCF pode fechar sua sequência de saída e continuar processando mensagens em sua sequência de entrada. Por outro lado, o WCF pode processar o fechamento da sequência de entrada e continuar enviando mensagens em sua sequência de saída.
Solicitação-resposta e Iniciador unidirecional não endereçável
Associação
O WCF fornece um padrão de troca de mensagens unidirecionais e de solicitação-resposta usando duas sequências em um canal HTTP. O WCF usa solicitações HTTP para transmitir todas as mensagens do Iniciador para o Respondente e respostas HTTP para transmitir todas as mensagens do Respondente para o Iniciador.
Troca de CreateSequence
O Iniciador do WCF transmite uma mensagem CreateSequence
com um elemento Offer
em uma solicitação HTTP e espera a mensagem CreateSequenceResponse
na resposta HTTP. O Respondente do WCF cria uma sequência e transmite a mensagem CreateSequenceResponse
com um elemento Accept
na resposta HTTP.
Mensagem unidirecional
Para concluir uma troca de mensagens unidirecionais com sucesso, o Iniciador do WCF transmite uma mensagem de sequência de solicitação na solicitação HTTP e recebe uma mensagem SequenceAcknowledgement
autônoma na resposta HTTP. O SequenceAcknowledgement
deve confirmar a mensagem transmitida.
O Respondente do WCF pode responder à solicitação com uma confirmação, uma falha ou uma resposta com um corpo vazio e um código de status HTTP 202.
Mensagens bidirecionais
Para concluir um protocolo de troca de mensagens bidirecional com sucesso, o Iniciador do WCF transmite uma mensagem de sequência de solicitação na solicitação HTTP e recebe uma mensagem de sequência de respostas na resposta HTTP. A resposta deve conter um SequenceAcknowledgement
confirmando a mensagem de sequência de solicitações transmitida.
O Respondente do WCF pode responder à solicitação com uma resposta de aplicativo, uma falha ou uma resposta com um corpo vazio e um 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ências de solicitação e o número da sequência da mensagem de resposta não têm correlação.
Repetindo respostas
O WCF depende da correlação de solicitação-resposta HTTP para correlação de protocolo de troca de mensagens bidirecionais. Por isso, o Iniciador do WCF não para de repetir uma mensagem de sequência de solicitações quando a mensagem de sequência de solicitações é reconhecida, mas sim quando a resposta HTTP carrega uma SequenceAcknowledgement
, uma mensagem do aplicativo ou uma falha. O Respondente do WCF tenta novamente as respostas na resposta HTTP da solicitação à qual a resposta está correlacionada.
Troca de CloseSequence
Depois de receber todas as mensagens de sequência de resposta e confirmações para todas as mensagens de sequência de solicitações unidirecionais, o Iniciador do WCF transmite uma mensagem CloseSequence
para a sequência de solicitações em uma solicitação HTTP e espera a CloseSequenceResponse
na resposta HTTP.
Fechar a sequência de solicitações fecha implicitamente a sequência de resposta. Isso significa que o Iniciador do WCF inclui a Final SequenceAcknowledgement
da sequência de resposta na mensagem CloseSequence
e a sequência de resposta não tem uma troca CloseSequence
.
O Respondente do WCF garante que todas as respostas sejam reconhecidas e transmita a mensagem CloseSequenceResponse
na resposta HTTP.
Troca TerminateSequence
Depois de receber a mensagem CloseSequenceResponse
, o Iniciador do WCF transmite uma mensagem TerminateSequence
para a sequência de solicitações em uma solicitação HTTP e espera a TerminateSequenceResponse
na resposta HTTP.
Assim como a troca CloseSequence
, encerrar a sequência de solicitações encerra implicitamente a sequência de resposta. Isso significa que o Iniciador do WCF inclui a final SequenceAcknowledgement
da sequência de resposta na mensagem TerminateSequence
e a sequência de resposta não tem uma troca TerminateSequence
.
O Respondente do WCF transmite a mensagem TerminateSequenceResponse
na resposta HTTP.
Iniciador de solicitação/resposta endereçável
Associação
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 um de saída. Esse padrão de troca de mensagens pode ser misturado com o padrão de troca de mensagens do Iniciador Duplex, Addressable
de maneira limitada. O 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.
Troca de CreateSequence
O Iniciador do WCF transmite uma mensagem CreateSequence
com um elemento Offer
em uma solicitação HTTP. O Respondente do WCF garante que o CreateSequence
tenha um elemento Offer
, em seguida, cria uma sequência e transmite a mensagem CreateSequenceResponse
com um elemento Accept
.
Correlação de solicitação/resposta
O seguinte se aplica a todas as solicitações e respostas correlacionadas:
O WCF garante que todas as mensagens de solicitação de aplicativo possuam uma referência de ponto de extremidade
ReplyTo
e umMessageId
.O WCF aplica a referência de ponto de extremidade local como
ReplyTo
de cada mensagem de solicitação de aplicativo. A referência de ponto de extremidade local éReplyTo
da mensagemCreateSequence
para o Iniciador eTo
da mensagemCreateSequence
para o Respondente.O WCF garante que as mensagens de solicitação de entrada têm um
MessageId
e umReplyTo
.O WCF garante que o URI da referência do ponto de extremidade
ReplyTo
de todas as mensagens de solicitação de aplicativo corresponda à referência do ponto de extremidade local, conforme definido anteriormente.O WCF garante que todas as respostas têm os cabeçalhos
RelatesTo
eTo
corretos seguindo as regras de correlação de solicitação/respostawsa
.