Partager via


Protocole de messagerie fiable version 1.0

Cette rubrique traite des détails de l'implémentation Windows Communication Foundation (WCF) pour le protocole de messagerie WS-Reliable de février 2005 (version 1.0) nécessaire à l'interopérabilité utilisant le transport HTTP. WCF suit la spécification de messagerie WS-Reliable avec les contraintes et les éclaircissements présentés dans cette rubrique. Notez que le protocole WS-ReliableMessaging version 1.0 est implémenté à partir de .NET Framework 3.0.

Le protocole de messagerie WS-Reliable de février 2005 est implémenté dans WCF par ReliableSessionBindingElement.

Pour plus de simplicité, la rubrique utilise les rôles suivants :

  • Initiateur : client qui initialise la création de la séquence de message WS-Reliable.
  • Répondeur : service qui reçoit les demandes de l'initiateur.

Ce document utilise les préfixes et les espaces de noms répertoriés dans le tableau suivant.

Préfixe Espace de noms

wsrm

https://schemas.xmlsoap.org/ws/2005/02/rm

netrm

https://schemas.microsoft.com/ws/2006/05/rm

s

http://www.w3.org/2003/05/soap-envelope

wsa

https://schemas.xmlsoap.org/ws/2005/08/addressing

wsse

http://docs.oasis-open.org/wss/2004/01/oasis-200401-wssecurity-secext-1.0.xsd

Messagerie

Messages d'établissement de séquence

WCF implémente des messages CreateSequence et CreateSequenceResponse pour établir une séquence de message fiable. Les contraintes suivantes s'appliquent :

  • B1101 : l'initiateur WCF ne génère pas l'élément Expires facultatif dans le message CreateSequence ou, lorsque le message CreateSequence contient un élément Offer, l'élément Expires facultatif dans l'élément Offer.
  • B1102 : lors de l'accès au message CreateSequence, le Responder WCF envoie et reçoit les deux éléments Expires s'ils existent, mais n'utilise pas leurs valeurs.

La messagerie WS-Reliable introduit le mécanisme Offer pour établir deux séquences corrélées réciproques qui forment une session.

  • R1103 : si CreateSequence contient un élément Offer, le répondeur de messagerie fiable doit soit accepter la séquence et répondre avec CreateSequenceResponse contenant un élément wsrm:Accept, formant deux séquences réciproques corrélées, soit rejeter la demande CreateSequence.
  • R1104 : l'SequenceAcknowledgement et les messages d'application qui passent sur la séquence réciproque doivent être envoyés à la référence de point de terminaison ReplyTo de CreateSequence.
  • R1105 : les références de point de terminaison AcksTo et ReplyTo dans CreateSequence doivent avoir des valeurs d'adresse qui correspondent au niveau des octets.
    Le répondeur WCF vérifie que la partie URI des ERP AcksTo et ReplyTo est identique avant de créer une séquence.
  • R1106 : les références de point de terminaison AcksTo et ReplyTo dans CreateSequence doivent avoir le même jeu de paramètres de référence.
    WCF n'applique pas, mais présuppose que les [paramètres de référence] de AcksTo et ReplyTo sur CreateSequence sont identiques et utilise les [paramètres de référence] de la référence de point de terminaison ReplyTo pour les accusés de réception et les messages de séquence réciproque.
  • R1107 : lorsque deux séquences réciproques sont établies à l'aide du mécanisme Offer, l'SequenceAcknowledgement et les messages d'application qui traversent les séquences réciproques doivent être envoyés à la référence de point de terminaison ReplyTo de CreateSequence.
  • R1108 : lorsque deux séquences réciproques sont établies à l'aide du mécanisme Offer, la propriété [address] de l'élément enfant wsrm:AcksTo de la référence de point de terminaison de l'élément wsrm:Accept de la CreateSequenceResponse doit correspondre octet par octet à l'URI de destination de CreateSequence.
  • R1109 : lorsque deux séquences réciproques sont établies à l'aide du mécanisme Offer, les messages envoyés par l'initiateur et les accusés de réception des messages envoyés par le répondeur doivent être envoyés à la même référence de point de terminaison.
    WCF utilise la messagerie WS-Reliable pour établir des sessions fiables entre l'initiateur et le répondeur. L'implémentation de la messagerie WS-Reliable WCF fournit une session fiable pour les modèles de messagerie en duplex intégral, de demande-réponse et unidirectionnels. Le mécanisme de messagerie WS-Reliable Offer sur CreateSequence/CreateSequenceResponse vous permet d'établir deux séquences réciproques corrélées et fournit un protocole de session qui convient à tous les points de terminaison de message. Comme WCF fournit une garantie de sécurité pour ce type de session incluant la protection de bout en bout de l'intégrité de la session, il est pratique de s'assurer que les messages destinés au même correspondant arrivent à la même destination. Cela permet également la superposition des accusés de réception de séquence sur les messages d'application. Par conséquent, les contraintes R1104, R1105, et R1108 s'appliquent à WCF.

Exemple de message CreateSequence.

<s:Envelope>
  <s:Header>
    <a:Action s:mustUnderstand="1">
      https://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>

Exemple de message CreateSequenceResponse.

<s:Envelope>
  <s:Header>
    <a:Action s:mustUnderstand="1">
      https://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

Voici une liste des contraintes qui s'appliquent aux séquences :

Exemple d'en-tête Sequence.

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

En-tête AckRequested

WCF utilise l'en-tête AckRequested en tant que mécanisme de connexion persistante. WCF ne génère pas d'élément MessageNumber facultatif. À la réception d'un message avec un en-tête AckRequested contenant l'élément MessageNumber, WCF ignore la valeur de l'élément MessageNumber, comme indiqué dans l'exemple suivant.

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

En-tête SequenceAcknowledgement

WCF utilise un mécanisme de superposition pour les accusés de réception de séquence fournis dans la messagerie WS-Reliable.

  • R1401 : lorsque deux séquences réciproques sont établies à l'aide du mécanisme Offer, l'en-tête SequenceAcknowledgement peut être inclus dans tout message d'application transmis au destinataire souhaité.

  • B1402 : lorsque WCF doit générer un accusé de réception avant de recevoir un message de séquence (par exemple, pour satisfaire un message AckRequested), WCF génère un en-tête SequenceAcknowledgement qui contient la plage 0-0, comme indiqué dans l'exemple suivant.

    <wsrm:SequenceAcknowledgement>
      <wsrm:Identifier>
        urn:uuid:addabbbf-60cb-44d3-8c5b-9e0841629a36
      </wsrm:Identifier>
      <wsrm:AcknowledgementRange Upper="0" Lower="0"/>
    </wsrm:SequenceAcknowledgement>
    
  • B1403 : WCF ne génère pas d'en-têtes SequenceAcknowledgement contenant un élément Nack mais prend en charge les éléments Nack.

Erreurs de la messagerie WS-Reliable

Voici une liste des contraintes qui s'appliquent à l'implémentation WCF des erreurs de messagerie WS-Reliable.

  • B1501 : WCF ne génère pas d'erreurs MessageNumberRollover.

  • B1502 : le point de terminaison WCF peut générer des erreurs CreateSequenceRefused comme décrit dans la spécification.

  • B1503 : lorsque le point de terminaison du service atteint sa limite de connexion et ne peut pas traiter de nouvelles connexions, WCF génère un sous-code d'erreur CreateSequenceRefused supplémentaire, netrm:ConnectionLimitReached, comme indiqué dans l'exemple suivant.

    <s:Envelope>
      <s:Header>
        <wsa:Action>
          https://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>
    

Erreurs WS-Addressing

Puisque la messagerie WS-Reliable utilise WS-Addressing, son implémentation WCF peut générer des erreurs WS-Addressing. Cette section traite des erreurs WS-Addressing que WCF génère explicitement au niveau de la couche de la messagerie WS-Reliable :

  • B1601 : WCF génère l'erreur Message Addressing Header Required lorsque l'une des conditions suivantes est vraie :
    • Un message n'a pas d'en-tête Sequence ni d'en-tête Action.
    • Un message CreateSequence n'a pas d'en-tête MessageId.
    • Un message CreateSequence n'a pas d'en-tête ReplyTo.
  • B1602 : WCF génère l'erreur Action Not Supported en réponse à un message qui n'a pas d'en-tête Sequence et a un en-tête Action qui n'est pas un reconnu dans la spécification de la messagerie WS-Reliable.
  • B1603 : WCF génère l'erreur Endpoint Unavailable pour indiquer que le point de terminaison ne traite pas la séquence au terme de l'examen des en-têtes d'adressage du message CreateSequence.

Composition du protocole

Composition avec WS-Addressing

WCF prend en charge deux versions de WS-Addressing : WS-Addressing 2004/08 [WS-ADDR] et W3C WS-Addressing 1.0 Recommendations [WS-ADDR-CORE] et [WS-ADDR-SOAP]

Bien que la spécification de la messagerie WS-Reliable mentionne WS-Addressing 2004/08 uniquement, cela ne constitue pas une restriction en ce qui concerne la version WS-Addressing à utiliser. Voici une liste des contraintes qui s'appliquent à WCF :

  • R2101 : aussi bien WS-Addressing 2004/08 que WS-Addressing 1.0 peuvent être utilisés avec la messagerie WS-Reliable.
  • R2102 : **** une version unique de WS-Addressing doit être utilisée dans la totalité d'une séquence de messagerie WS-Reliable donnée ou dans une paire de séquences réciproques corrélées à l'aide du mécanisme wsrm:Offer.

Composition avec SOAP

WCF prend en charge l'utilisation de SOAP 1.1 et de SOAP 1.2 avec la messagerie WS-Reliable.

Composition avec WS-Security et WS-SecureConversation

WCF fournit une protection pour les séquences de messagerie WS-Reliable en utilisant le transport sécurisé (HTTPS), la composition avec WS-Security et la composition avec WS-Secure Conversation. Voici une liste des contraintes qui s'appliquent à WCF :

  • R2301 : pour protéger l'intégrité d'une séquence de messagerie WS-Reliable en plus de l'intégrité et de la confidentialité des messages individuels, WCF requiert l'utilisation de WS-Secure Conversation.
  • R2302 : une session WS-Secure Conversation doit être établie avant d'établir la ou les séquences de messagerie WS-Reliable.
  • R2303 : si la durée de vie de la séquence de messagerie WS-Reliable dépasse celle de la session WS-Secure Conversation, le SecurityContextToken établi à l'aide de WS-Secure Conversation doit être renouvelé par le biais de la liaison WS-Secure Conversation Renewal correspondante.
  • B2304 : **** la séquence de messagerie WS-Reliable ou une paire de séquences réciproques corrélées est toujours liée à une session WS-SecureConversation unique.
    La source WCF génère l'élément wsse:SecurityTokenReference dans la section d'extensibilité d'élément du message CreateSequence.
  • R2305 : lorsqu'il est composé avec WS-Secure Conversation, un message CreateSequence doit contenir l'élément wsse:SecurityTokenReference.

Assertion WS-Policy de la messagerie WS-Reliable

WCF utilise l'assertion WS-Policy de la messagerie WS-Reliable wsrm:RMAssertion pour décrire des fonctions de points de terminaison. Voici une liste des contraintes qui s'appliquent à WCF :

  • B3001 : WCF joint wsrm:RMAssertion WS-Policy Assertion aux éléments wsdl:binding. WCF prend en charge les connexions aux éléments wsdl:binding et wsdl:port.

  • B3002 : WCF prend en charge les propriétés facultatives suivantes de l'assertion de messagerie WS-Reliable et assure leur contrôle sur l'ReliableMessagingBindingElement de WCF :

    • wsrm:InactivityTimeout
    • wsrm:AcknowledgementInterval

    Un exemple est présenté ci-dessous.

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

Extension de messagerie WS-Reliable pour le contrôle de flux

WCF utilise l'extensibilité de la messagerie WS-Reliable pour renforcer le contrôle facultatif sur le flux des messages de séquence.

Le contrôle de flux est activé en affectant à la propriété FlowControlEnabled bool de ReliableSessionBindingElement la valeur true. Voici une liste des contraintes qui s'appliquent à WCF :

  • B4001 : lorsque le contrôle du flux de la messagerie fiable est activé, WCF génère un élément netrm:BufferRemaining dans l'extensibilité d'élément de l'en-tête SequenceAcknowledgement.

  • B4002 : lorsque le contrôle du flux de la messagerie fiable est activé, WCF ne requiert pas qu'un élément netrm:BufferRemaining soit présent dans l'en-tête SequenceAcknowledgement, comme indiqué dans l'exemple suivant.

    <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 utilise netrm:BufferRemaining pour indiquer combien de nouveaux messages la destination de la messagerie fiable peut mettre en mémoire tampon.

  • B4004 : le service de messagerie fiable de WCF limite le nombre de messages transmis lorsque la destination de la messagerie fiable ne peut pas recevoir les messages rapidement. La destination de la messagerie fiable met en mémoire tampon les messages et la valeur de l'élément tombe à 0.

  • B4005 : WCF génère des valeurs entières netrm:BufferRemaining dans une plage inclusive de 0 à 4096 et lit des valeurs entières dans une plage inclusive de 0 à la valeur maxInclusive 214748364 de xs:int.

Modèles d'échange de messages

Cette section décrit le comportement de WCF lorsque la messagerie WS-Reliable est utilisée pour différents modèles d'échange de messages. Pour chaque modèle d'échange de messages, les deux scénarios de déploiements suivants sont considérés :

  • Initiateur non adressable : l'initiateur est derrière un pare-feu ; le répondeur peut remettre des messages à celui-ci uniquement sur les réponses HTTP.
  • Initiateur adressable : l'initiateur et le répondeur peuvent tous les deux recevoir des demandes HTTP ; en d'autres termes, deux connexions HTTP réciproques peuvent être établies.

Initiateur unidirectionnel, non adressable

Liaison

WCF fournit un modèle d'échange de messages unidirectionnel qui utilise une séquence sur un canal HTTP. WCF utilise les demandes HTTP pour transmettre tous les messages du RMS au RMD et la réponse HTTP pour transmettre tous les messages du RMD au RMS.

Échange CreateSequence

L'initiateur WCF génère un message CreateSequence sans offre. Le répondeur WCF s'assure que CreateSequence n'a aucune offre avant de créer une séquence. Le répondeur WCF répond à la demande CreateSequence avec un message CreateSequenceResponse.

SequenceAcknowledgement

L'initiateur WCF traite les accusés de réception sur la réponse de tous les messages sauf le message CreateSequence et les messages d'erreur. Le répondeur WCF génère toujours un accusé de réception autonome dans la réponse aux messages de séquence et AckRequested.

Message TerminateSequence

WCF traite TerminateSequence comme une opération unidirectionnelle, en d'autres termes, la réponse HTTP a un corps vide et le code d'état HTTP 202.

Initiateur unidirectionnel, adressable

Binding

WCF fournit un modèle d'échange de messages unidirectionnel qui utilise une séquence sur un canal HTTP entrant et sortant. Il utilise les demandes HTTP pour transmettre tous les messages. Toutes les réponses HTTP ont un corps vide et le code d'état HTTP 202.

Échange CreateSequence

L'initiateur WCF génère un message CreateSequence sans offre. Le répondeur WCF s'assure que CreateSequence n'a aucune offre avant de créer une séquence. Le répondeur WCF transmet le message CreateSequenceResponse sur une demande HTTP adressée avec la référence de point de terminaison ReplyTo.

Initiateur duplex, adressable

Binding

WCF fournit un modèle d'échange de messages complètement bidirectionnel et asynchrone qui utilise deux séquences sur un canal http entrant et sortant. WCF utilise les demandes HTTP pour transmettre tous les messages. Toutes les réponses HTTP ont un corps vide et le code d'état HTTP 202.

Échange CreateSequence

L'initiateur WCF génère un message CreateSequence avec une offre. Le répondeur WCF s'assure que CreateSequence a une offre avant de créer une séquence. WCF envoie CreateSequenceResponse sur la demande HTTP adressée à la référence de point de terminaison ReplyTo de CreateSequence.

Durée de vie de séquence

WCF traite les deux séquences comme une session duplex complète.

WCF s'attend à ce que le point de terminaison distant trouve une erreur dans les deux séquences pour générer une erreur qui fait échouer une séquence. À la lecture d'une erreur qui fait échouer une séquence, WCF fait échouer les deux séquences.

WCF peut fermer sa séquence sortante et continuer à traiter des messages sur sa séquence entrante. Inversement, WCF peut traiter la fermeture de la séquence entrante et continuer à envoyer des messages sur sa séquence sortante.

Initiateur demande-réponse, non adressable

Binding

WCF fournit un modèle d'échange de messages de demande-réponse unidirectionnel qui utilise deux séquences sur un canal HTTP. WCF utilise les demandes HTTP pour transmettre les messages de la séquence de demande et utilise les réponses HTTP pour transmettre les messages de la séquence de réponse.

Échange CreateSequence

L'initiateur WCF génère un message CreateSequence avec une offre. Le répondeur WCF s'assure que CreateSequence a une offre avant de créer une séquence. Le répondeur WCF répond à la demande CreateSequence avec un message CreateSequenceResponse.

Message unidirectionnel

Pour compléter le protocole d'échange de messages unidirectionnel, l'initiateur WCF transmet un message de séquence de demande sur la demande HTTP et reçoit un message SequenceAcknowledgement autonome sur la réponse HTTP. SequenceAcknowledgement doit accepter le message transmis.

Le répondeur WCF peut répondre à la demande avec un accusé de réception, une erreur ou une réponse avec un corps vide et le code d'état HTTP 202.

Messages bidirectionnels

Pour compléter un protocole d'échange de messages bidirectionnel, l'initiateur WCF transmet un message de séquence de demande sur la demande HTTP et reçoit un message de séquence de réponse sur la réponse HTTP. La réponse doit contenir un SequenceAcknowledgement qui accuse réception du message de séquence de demande transmis.

Le répondeur WCF peut répondre à la demande avec une réponse d'application, une erreur ou une réponse avec un corps vide et le code d'état HTTP 202.

En raison de la présence de messages unidirectionnels et du délai d'attente des réponses d'application, le numéro de séquence du message de séquence de demande et le numéro de séquence du message de réponse n'ont aucune corrélation.

Nouvelles tentatives de réponses

WCF repose sur la corrélation demande-réponse HTTP pour la corrélation de protocole d'échange de messages bidirectionnel. Pour cette raison, l'initiateur WCF n'arrête pas les tentatives pour un message de séquence de demande lorsqu'il y a un accusé de réception pour celui-ci mais arrête les tentatives lorsque la réponse HTTP contient un accusé de réception, un message utilisateur ou une erreur. Le répondeur WCF refait des tentatives de réponse sur le tronçon HTTP de la demande à laquelle la réponse est corrélée.

Échange LastMessage

L'initiateur WCF génère et transmet un dernier message vide sur le tronçon de la demande HTTP. Il requiert une réponse mais ignore le message de réponse réel. Le répondeur WCF répond au dernier message vide de la séquence de demande avec le dernier message vide de la séquence de réponse.

Si le répondeur WCF reçoit un dernier message dans lequel l'URI action n'est pas https://schemas.xmlsoap.org/ws/2005/02/rm/LastMessage, il répond avec un dernier message. Dans le cas d'un protocole d'échange de messages bidirectionnel, le dernier message contient le message d'application ; dans le cas d'un protocole d'échange de messages unidirectionnel, le dernier message est vide.

Le répondeur WCF ne requiert pas d'accusé de réception pour le dernier message vide de la séquence de réponse.

Échange TerminateSequence

Lorsque toutes les demandes ont reçu une réponse valide, l'initiateur WCF génère et transmet le message de séquence de demande TerminateSequence sur le tronçon de demande HTTP. WCF requiert une réponse mais ignore le message de réponse réel. Le répondeur WCF répond au message TerminateSequence de la séquence de demande avec le message TerminateSequence de la séquence de réponse.

Dans une séquence d'arrêt normale, les deux messages TerminateSequence incluent un SequenceAcknowledgement complet.

Initiateur demande/réponse, adressable

Binding

WCF fournit un modèle d'échange de messages de demande-réponse qui utilise deux séquences sur un canal HTTP entrant et sortant. WCF utilise les demandes HTTP pour transmettre tous les messages. Toutes les réponses HTTP ont un corps vide et le code d'état HTTP 202.

Échange CreateSequence

L'initiateur WCF génère un message CreateSequence avec une offre. Le répondeur WCF s'assure que CreateSequence a une offre avant de créer une séquence. WCF envoie la CreateSequenceResponse sur la requête HTTP à la référence de point de terminaison ReplyTo de CreateSequence.

Corrélation demande/réponse

L'initiateur WCF s'assure que tous les messages de demande d'application portent un MessageId et une référence de point de terminaison ReplyTo. L'initiateur WCF applique la référence de point de terminaison ReplyTo du message CreateSequence sur chaque message de demande d'application. Le répondeur WCF requiert que les messages de requête entrants portent un MessageId et une référence de point de terminaison ReplyTo. Le répondeur WCF s'assure que l'URI de la référence de point de terminaison de CreateSequence et de tous les messages de demande d'application est identique.