Conserver l’affinité entre un groupe d'abonnements et le serveur de boîtes aux lettres dans ExchangeMaintain affinity between a group of subscriptions and the Mailbox server in Exchange

Découvrez comment maintenir l’affinité entre un groupe d’abonnements et le serveur de boîtes aux lettres.Find out about maintaining the affinity between a group of subscriptions and the Mailbox server.

L’affinité est l’Association d’une séquence de messages de demande et de réponse à un serveur de boîtes aux lettres particulier.Affinity is the association of a sequence of request and response messages with a particular Mailbox server. Pour la plupart des fonctionnalités dans Exchange, l’affinité est gérée par le serveur.For most functionality in Exchange, affinity is handled by the server. Toutefois, les notifications sont des exceptions.Notifications, however, are an exception. Le client est responsable de la maintenance de l’affinité avec le serveur de boîtes aux lettres pour les abonnements aux notifications.The client is responsible for maintaining the affinity with the Mailbox server for notification subscriptions. Cette affinité active l’équilibreur de charge et les serveurs d’accès au client entre le client et le serveur pour acheminer les abonnements aux notifications et les demandes associées vers le serveur de boîtes aux lettres qui gère l’abonnement.This affinity enables the load balancer and Client Access servers between the client and the server to route notification subscriptions and related requests to the Mailbox server that maintains the subscription. Sans affinité, la demande peut être acheminée vers un autre serveur de boîtes aux lettres qui n’inclut pas les abonnements du client, ce qui peut entraîner le renvoi d’une erreur ErrorSubscriptionNotFound .Without affinity, the request might get routed to a different Mailbox server that does not include the client's subscriptions, which can cause an ErrorSubscriptionNotFound error to be returned.

Comment l’affinité est-elle conservée ?How is affinity maintained?

L’affinité dans Exchange est basée sur les cookies.Affinity in Exchange is cookie based. Le client déclenche la création du cookie en incluant des en-têtes spécifiques dans la demande d’abonnement, puis la réponse de l’abonnement contient le cookie.The client triggers the creation of the cookie by including specific headers in the subscription request, and then the subscription response contains the cookie. Le client envoie ensuite ce cookie dans les demandes suivantes pour s’assurer que la demande est routée vers le serveur de boîtes aux lettres approprié.The client then sends that cookie in subsequent requests to ensure that the request is routed to the right Mailbox server.

Plus spécifiquement, l’affinité dans Exchange est gérée par les éléments suivants :More specifically, affinity in Exchange is handled by the following:

  • X-AnchorMailbox : en-tête HTTP inclus dans la demande d’abonnement initiale.X-AnchorMailbox — An HTTP header that is included in the initial subscription request. Il identifie la première boîte aux lettres d’un groupe de boîtes aux lettres qui partagent l’affinité avec le même serveur de boîtes aux lettres.It identifies the first mailbox in a group of mailboxes that share affinity with the same Mailbox server.

  • X-PreferServerAffinity : en-tête HTTP inclus dans la demande d’abonnement initiale avec l’en-tête X-AnchorMailbox et est défini sur true pour indiquer que le client demande que l’affinité soit maintenue avec le serveur de boîtes aux lettres.X-PreferServerAffinity — An HTTP header that is included in the initial subscription request with the X-AnchorMailbox header and is set to true to indicate that the client is requesting that affinity be maintained with the Mailbox server.

  • X-BackEndOverrideCookie — cookie inclus dans la réponse d’abonnement initiale et contenant un cookie que l’équilibreur de charge et le serveur d’accès au client utilisent pour acheminer les demandes ultérieures vers le même serveur de boîtes aux lettres.X-BackEndOverrideCookie — A cookie that is included in the initial subscription response and contains a cookie that the load balancer and Client Access server use to route subsequent requests to the same Mailbox server.

Comment puis-je conserver les affinités à l’aide de l’API managée EWS ou EWS ?How do I maintain affinity by using the EWS Managed API or EWS?

Vous pouvez utiliser les mêmes étapes pour conserver l’affinité pour les abonnements à plusieurs boîtes aux lettres et leurs serveurs de boîtes aux lettres, que vous utilisiez des notifications de diffusion en continu, d’extraction ou de transmission, et que vous cibliez ou non un serveur Exchange local ou Exchange Online.You can use the same steps to maintain affinity for multiple mailbox subscriptions and their Mailbox servers, regardless of whether you are using streaming, pull, or push notifications, and regardless of whether you're targeting an Exchange on-premises server or Exchange Online.

  1. Pour chaque boîte aux lettres, appelez Autodiscover et obtenez les paramètres utilisateur GroupingInformation et ExternalEwsUrl.For each mailbox, call Autodiscover and get the GroupingInformation and ExternalEwsUrl user settings. Pour la découverte automatique SOAP, vous utilisez l’élément Setting et pour la découverte automatique POX, vous utilisez l’élément GroupingInformation .For SOAP Autodiscover, you use the Setting element, and for POX Autodiscover, you use the GroupingInformation element.

  2. En utilisant les paramètres GroupingInformation et ExternalEwsUrl des réponses de découverte automatique, placez les boîtes aux lettres avec la même valeur concaténée ExternalEwsUrl et GroupingInformation dans le même groupe.Using the GroupingInformation and ExternalEwsUrl settings from the Autodiscover responses, place mailboxes with the same ExternalEwsUrl and GroupingInformation concatenated value in the same group. Si des groupes possèdent plus de 200 boîtes aux lettres, Rompez-les davantage afin que chaque groupe ne contienne pas plus de 200 boîtes aux lettres.If any groups have more than 200 mailboxes, break the groups down further so that each group has no more than 200 mailboxes.

  3. Créez et utilisez un objet ExchangeService pour le reste de la procédure.Create and use one ExchangeService object for the rest of the procedure. Lorsque vous utilisez le même objet ExchangeService , les cookies et les en-têtes (lorsqu’ils sont définis) sont automatiquement gérés.When you use the same ExchangeService object, cookies and headers (when they are set) are automatically maintained. Notez que si vous n’avez pas l’intention de regrouper des abonnements de diffusion en continu dans une seule connexion, vous pouvez créer un objet ExchangeService différent pour chaque utilisateur emprunté.Note that if you do not intend to group streaming subscriptions into a single connection, you are free to create a different ExchangeService object for each impersonated user.

  4. Envoyer une demande d’abonnement pour l’utilisateur dont le nom d’utilisateur apparaît en premier lorsque tous les utilisateurs du groupe sont triés par ordre alphabétique (nous faisons référence à cet utilisateur comme l’utilisateur de la boîte aux lettres d’ancrage).Send a subscription request for the user whose user name appears first when all users in the group are sorted alphabetically (we'll refer to this user as the anchor mailbox user). Procédez comme suit :Do the following:

  • Incluez l’en-tête X-AnchorMailbox avec une valeur définie sur l’adresse SMTP de l’utilisateur de la boîte aux lettres d’ancrage.Include the X-AnchorMailbox header with a value set to the SMTP address of the anchor mailbox user.

  • Incluez l’en-tête X-PreferServerAffinity avec une valeur définie sur true.Include the X-PreferServerAffinity header with a value set to true.

  • Utilisez le rôle ApplicationImpersonation (type ExchangeImpersonation ).Use the ApplicationImpersonation role (the ExchangeImpersonation type).

  1. Dans la réponse de l’abonnement, obtenez la valeur X-BackEndOverrideCookie.In the subscription response, get the X-BackEndOverrideCookie value. Incluez cette valeur dans chacune des demandes d’abonnements suivantes pour les utilisateurs de ce groupe.Include this value in each of the subsequent subscription requests for users in this group.

  2. Pour chaque utilisateur supplémentaire dans le groupe, envoyez une demande d’abonnement et procédez comme suit :For each additional user in the group, send a subscription request and do the following:

  • Incluez l’en-tête X-AnchorMailbox avec une valeur définie sur l’adresse SMTP de l’utilisateur de la boîte aux lettres d’ancrage du groupe.Include the X-AnchorMailbox header with a value set to the SMTP address of the anchor mailbox user for the group.

  • Incluez l’en-tête X-PreferServerAffinity avec une valeur définie sur true.Include the X-PreferServerAffinity header with a value set to true.

  • Incluez la X-BackEndOverrideCookie qui a été renvoyée dans la réponse de l’utilisateur de la boîte aux lettres d’ancrage.Include the X-BackEndOverrideCookie that was returned in the anchor mailbox user's subscription response.

  • Utilisez le rôle ApplicationImpersonation (type ExchangeImpersonation ).Use the ApplicationImpersonation role (the ExchangeImpersonation type).

    Notez que le serveur utilise les valeurs X-PreferServerAffinity et X-BackendOverrideCookie pour effectuer le routage vers le serveur de boîtes aux lettres.Note that the server uses the X-PreferServerAffinity and X-BackendOverrideCookie values together to perform the routing to the mailbox server. L’en-tête X-AnchorMailbox est également requis, mais est ignoré par le serveur si les deux autres valeurs sont valides.The X-AnchorMailbox header is also required, but is ignored by the server if the other two values are valid. Si X-AnchorMailbox et X-PreferServerAffinity sont dans une requête et que X-BackendOverrideCookie n’est pas inclus, la valeur X-AnchorMailbox est utilisée pour acheminer les demandes.If X-AnchorMailbox and X-PreferServerAffinity are in a request and X-BackendOverrideCookie is not included, the X-AnchorMailbox value is used to route the requests.

    Étant donné que les valeurs X-PreferServerAffinity et X-BackendOverrideCookie effectuent le routage, si la boîte aux lettres d’ancrage ne passe pas à un autre groupe ou serveur, la logique ne change pas, car X-BackendOverrideCookie achemine la demande vers le serveur approprié pour le groupe.Because the X-PreferServerAffinity and X-BackendOverrideCookie values perform the routing, if the anchor mailbox ever moves to another group or server, the logic does not change because the X-BackendOverrideCookie will route the request to the correct server for the group.

  1. Envoyez une seule demande GetStreamingEvents ou GetEvents pour le groupe, puis procédez comme suit :Send a single GetStreamingEvents or GetEvents requests for the group, and do the following:
  • Incluez les valeurs SubscriptionId renvoyées dans chacune des réponses d’abonnement individuelles pour les boîtes aux lettres du groupe.Include the SubscriptionId values returned in each of the individual subscription responses for mailboxes in the group.

  • Si plus de 200 abonnements existent pour le groupe, créez plusieurs demandes.If more than 200 subscriptions exist for the group, create multiple requests. Le nombre maximal de valeurs SubscriptionId à inclure dans une demande est de 200.The maximum number of SubscriptionId values to include in a request is 200.

  • Si vous avez besoin de plus de connexions que celles disponibles pour la boîte aux lettres cible, utilisez le compte de service pour emprunter l’identité de la boîte aux lettres d’ancrage du groupe ; Sinon, n’utilisez pas l’emprunt d’identité.If you need more connections than are available to the target mailbox, use the service account to impersonate the anchor mailbox for the group; otherwise, do not use impersonation. Idéalement, vous souhaitez emprunter l’identité d’une boîte aux lettres unique par demande GetStreamingEvents ou GetEvents afin de ne pas rencontrer de limites de limitation.Ideally, you want to impersonate a unique mailbox per GetStreamingEvents or GetEvents request so that you never encounter throttling limits.

  • Utilisez ApplicationImpersonation si vous avez besoin de plus de connexions que celles disponibles pour la boîte aux lettres cible; Sinon, n’utilisez pas ApplicationImpersonation.Use ApplicationImpersonation if you need more connections than are available to the target mailbox; otherwise, do not use ApplicationImpersonation.

  • Incluez l’en-tête X-PreferServerAffinity et définissez-le sur true.Include the X-PreferServerAffinity header and set it to true. Cette valeur est incluse automatiquement si vous utilisez l’objet ExchangeService que vous avez créé à l’étape 2.This value is automatically included if you are using the ExchangeService object that you created in step 2.

  • Incluez X-BackEndOverrideCookie pour le groupe (X-BackEndOverrideCookie qui a été renvoyé dans la réponse d’abonnement de l’utilisateur de la boîte aux lettres d’ancrage).Include the X-BackEndOverrideCookie for the group (the X-BackEndOverrideCookie that was returned in the anchor mailbox user's subscription response). Cette valeur est incluse automatiquement si vous utilisez l’objet ExchangeService que vous avez créé à l’étape 2.This value is automatically included if you are using the ExchangeService object that you created in step 2.

  1. Transmettez les événements renvoyés à un thread distinct pour traitement.Pass the returned events to a separate thread for processing.

Quelles valeurs de limitation dois-je prendre en considération ?What throttling values do I need to take into consideration?

Lorsque vous planifiez l’implémentation de vos notifications, vous devez prendre deux valeurs en considération : le nombre de connexions et le nombre d’abonnements.As you plan your notification implementation, you'll want to take two values into consideration: the number of connections, and the number of subscriptions. Le tableau suivant répertorie les valeurs par défaut pour chaque paramètre de limitation et la façon dont les paramètres sont utilisés.The following table lists the default values for each throttling setting and how the settings are used. Pour chaque valeur, le budget est alloué à la boîte aux lettres cible.For each value, the budget is allocated to the target mailbox. Pour cette raison, l’utilisation de l’emprunt d’identité pour obtenir des connexions supplémentaires est une étape requise dans de nombreux scénarios.For this reason, using impersonation to gain additional connections is a required step in many scenarios.

Tableau 1. Valeurs de limitation par défautTable 1. Default throttling values

Domaine de réflexionArea of consideration Paramètre de limitationThrottling setting Valeur par défautDefault value DescriptionDescription
Connexions de diffusion en continuStreaming connections
Limite de blocage par défautDefault hanging connection limit
10 pour Exchange Online10 for Exchange Online
3 pour Exchange 20133 for Exchange 2013
Nombre maximal de connexions de diffusion en continu simultanées qu’un compte peut ouvrir simultanément sur le serveur.The maximum number of concurrent streaming connections that an account can have open on the server at one time. Pour travailler dans cette limite, utilisez un compte de service avec le rôle ApplicationImpersonation attribué pour les boîtes aux lettres cibles et empruntez l’identité du premier utilisateur dans chaque groupe d’ID d’abonnement lors de l’obtention d’événements en flux.To work within this limit, use a service account with the ApplicationImpersonation role assigned for the target mailboxes, and impersonate the first user in each subscription ID group when getting streamed events.
Connexions d’extraction ou de transmission par émissionPull or push connections
EWSMaxConcurrencyEWSMaxConcurrency
vingt27
Nombre maximal de connexions d’extraction ou de transmission simultanées (demandes reçues mais pas encore satisfaites) qu’un compte peut ouvrir simultanément sur le serveur.The maximum number of concurrent pull or push connections (requests that have been received but not yet responded to) that an account can have open on the server at one time.
AbonnementsSubscriptions
EWSMaxSubscriptionsEWSMaxSubscriptions
20 pour Exchange Online20 for Exchange Online
5000 pour Exchange 20135000 for Exchange 2013
Nombre maximal d’abonnements non expirés qu’un compte peut avoir à la fois.The maximum number of nonexpired subscriptions that an account can have at one time. Cette valeur est décrémentée lors de la création de l’abonnement sur le serveur.This value is decremented when the subscription is created on the server.

L’exemple suivant montre comment les budgets sont gérés entre n’importe quelle boîte aux lettres cible et le compte de service auquel le rôle ApplicationImpersonation est attribué pour les boîtes aux lettres cibles.The following example shows how budgets are handled between any target mailbox and the service account that has the ApplicationImpersonation role assigned for the target mailboxes.

  • ServiceAccount1 (SA1) emprunte un grand nombre d’utilisateurs (M1, m2, m3, etc.) et crée des abonnements pour chaque boîte aux lettres.ServiceAccount1 (sa1) impersonates many users (m1, m2, m3, and so on) and creates subscriptions for each mailbox. Notez que lorsque les abonnements sont créés, le propriétaire de l’abonnement est SA1, donc lorsque SA1 ouvre une connexion avec les abonnements, EWS applique que les abonnements appartiennent à SA1.Note that when the subscriptions are created, the subscription owner is sa1, so when sa1 opens a connection with the subscriptions, EWS enforces that the subscriptions are owned by sa1.

  • SA1 peut ouvrir la connexion de l’une des manières suivantes :Sa1 can open the connection in the following ways:

  1. Sans emprunt d’identité, la connexion est donc facturée par rapport à SA1.Without impersonation, so the connection is charged against sa1.

  2. En empruntant l’identité de l’un des utilisateurs (M1, par exemple) de sorte que la connexion soit facturée par rapport à une copie du budget m1's.By impersonating any of the users — m1 for example — so that the connection is charged against a copy of m1's budget. (M1 elle-même peut ouvrir dix connexions à l’aide d’Exchange Online, et tous les comptes de service qui empruntent l’identité M1 peuvent ouvrir dix connexions à l’aide du budget copié.)(M1 itself can open ten connections by using Exchange Online, and all service accounts impersonating m1 can open ten connections by using the copied budget.)

  • Si la limite de connexion est atteinte, les solutions de contournement suivantes sont disponibles :If the connection limit is hit, the following workarounds are available:

    • Si l’option 1 est utilisée, l’administrateur peut créer plusieurs comptes de service pour emprunter l’identité d’utilisateurs supplémentaires.If option 1 is used, the administrator can create multiple service accounts to impersonate additional users.

    • Si l’option 2 est utilisée, le code peut emprunter l’identité d’un autre utilisateur (m2 par exemple).If option 2 is used, the code can impersonate another user — m2 for example.

Exemple : conservation de l’affinité entre un groupe d’abonnements et le serveur de boîtes aux lettresExample: Maintaining affinity between a group of subscriptions and the Mailbox server

OK, voyons-le en action.Okay, let's see it in action. L’exemple de code suivant montre comment regrouper des utilisateurs et utiliser les en-têtes X-AnchorMailbox et X-PreferServerAffinity et le cookie X-BackendOverrideCookie pour maintenir l’affinité avec le serveur de boîtes aux lettres.The following code example shows you how to group users and use the X-AnchorMailbox and X-PreferServerAffinity headers and the X-BackendOverrideCookie cookie to maintain affinity with the Mailbox server. Étant donné que les en-têtes et le cookie ont une importance essentielle dans la histoire de l’affinité, cet exemple se concentre sur les requêtes et les réponses XML EWS.Because the headers and the cookie are of primary importance in the affinity story, this example focuses on the EWS XML requests and responses. Pour utiliser l’API managée EWS afin de créer le corps des demandes et des réponses d’abonnement, consultez la rubrique transmettre des notifications sur les événements de boîte aux lettres à l’aide d’EWS dans Exchange et les notifications pull sur les événements de boîte aux lettres à l’aide d’EWS dans Exchange.To use the EWS Managed API to create the body of the subscription requests and responses, see Stream notifications about mailbox events by using EWS in Exchange and Pull notifications about mailbox events by using EWS in Exchange. Cette section comprend des étapes supplémentaires en particulier pour conserver l’affinité et ajouter les en-têtes à vos demandes.This section includes additional steps particular to maintaining affinity and adding the headers to your requests.

Cet exemple est doté de quatre utilisateurs : alfred@contoso.com, alisa@contoso.com, ronnie@contoso.com et sadie@contoso.com.This example has four users: alfred@contoso.com, alisa@contoso.com, ronnie@contoso.com, and sadie@contoso.com. La figure suivante illustre les paramètres de découverte automatique GroupingInformation et ExternalEwsUrl pour les utilisateurs.The following figure shows the GroupingInformation and ExternalEwsUrl Autodiscover settings for the users.

Figure 1. Paramètres de découverte automatique utilisés pour regrouper des boîtes aux lettresFigure 1. Autodiscover settings used to group mailboxes

Table illustrant les valeurs GroupingInformation et ExternalEwsUrl pour chacun des utilisateurs.

À l’aide des paramètres des réponses de découverte automatique, les boîtes aux lettres sont regroupées par la valeur concaténée des paramètres GroupingInformation et ExternalEwsUrl.Using the settings from the Autodiscover responses, the mailboxes are grouped by the concatenated value of the GroupingInformation and ExternalEwsUrl settings. Dans cet exemple, Alfred et Sadie ont les mêmes valeurs, de sorte qu’elles se trouvent dans un groupe et que Alisa et Ronnie partagent les mêmes valeurs, ils sont donc dans un autre groupe.In this example, Alfred and Sadie have the same values, so they are in one group, and Alisa and Ronnie share the same values, so they are in another group.

Figure 2. Création de groupes de boîtes aux lettresFigure 2. Creating mailbox groups

Tableau illustrant la création des groupes de boîtes aux lettres à l’aide des paramètres de découverte automatique.

Dans le cadre de cet exemple, nous allons nous concentrer sur le groupe A. Nous allons utiliser les mêmes étapes pour le groupe B, mais utiliser une valeur X-AnchorMailbox différente pour ce groupe.For the purpose of this example, we'll focus on Group A. We would use the same steps for group B, but use a different X-AnchorMailbox value for that group.

À l’aide de ApplicationImpersonation, créez la demande d’abonnement pour la boîte aux lettres d’ancrage (Alfred@contoso.com), avec l’en-tête x-AnchorMailbox défini sur l’adresse de messagerie et une valeur d’en-tête x-PreferServerAffinity de true.Using ApplicationImpersonation, create the subscription request for the anchor mailbox (alfred@contoso.com), with the X-AnchorMailbox header set to the their email address and an X-PreferServerAffinity header value of true. La définition de ces deux valeurs d’en-tête déclenche le serveur pour créer une X-BackEndOverrideCookie pour la réponse.Setting these two header values will trigger the server to create an X-BackEndOverrideCookie for the response.

Si vous utilisez l’API managée EWS, utilisez la méthodeAdd HttpHeaderspour ajouter les deux en-têtes à votre demande d’abonnement, comme illustré.If you're using the EWS Managed API, use the HttpHeadersAdd method to add the two headers to your subscription request, as shown.

service.HttpHeaders.Add("X-AnchorMailbox", Mailbox.SMTPAddress);
service.HttpHeaders.Add("X-PreferServerAffinity", "true");

Ainsi, la demande d’abonnement à Alfred se présente comme suit.So Alfred's subscription request looks like this.

POST https://outlook.office365.com/EWS/Exchange.asmx HTTP/1.1
Content-Type: text/xml; charset=utf-8
Accept: text/xml
User-Agent: ExchangeServicesClient/15.00.0516.014
X-AnchorMailbox: alfred@contoso.com
X-PreferServerAffinity: true
Host: outlook.office365.com
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types" xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <t:RequestServerVersion Version="Exchange2013" />
    <t:ExchangeImpersonation>
      <t:ConnectingSID>
        <t:SmtpAddress>alfred@contoso.com</t:SmtpAddress>
      </t:ConnectingSID>
    </t:ExchangeImpersonation>
  </soap:Header>
  <soap:Body>
    <m:Subscribe>
      <m:StreamingSubscriptionRequest>
        <t:FolderIds>
          <t:DistinguishedFolderId Id="inbox" />
        </t:FolderIds>
        <t:EventTypes>
          <t:EventType>NewMailEvent</t:EventType>
        </t:EventTypes>
      </m:StreamingSubscriptionRequest>
    </m:Subscribe>
  </soap:Body>
</soap:Envelope>

Le message XML suivant est la réponse à la demande d’abonnement à Alfred, qui inclut X-BackEndOverrideCookie.The following XML message is the response to Alfred's subscription request, and it includes the X-BackEndOverrideCookie. Renvoyez ce cookie pour toutes les demandes suivantes pour les utilisateurs de ce groupe.Resend this cookie for all subsequent requests for users in this group. Notez que la réponse contient également des cookies supplémentaires, tels que le cookie exchangecookie utilisé par Exchange 2010.Notice that the response also contains additional cookies, such as the exchangecookie cookie used by Exchange 2010. Exchange Online, Exchange Online dans le cadre d’Office 365 et versions d’Exchange à partir d’Exchange 2013, ignorez exchangecookie s’il est inclus dans les demandes d’abonnement ultérieures.Exchange Online, Exchange Online as part of Office 365, and versions of Exchange starting with Exchange 2013, ignore exchangecookie if it is included in subsequent subscription requests.

HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Set-Cookie: exchangecookie=ddb8c383aef34c7694132aa679744feb; expires=Thu, 25-Sep-2014 18:42:45 GMT; path=/;
    HttpOnly
Set-Cookie: X-BackEndOverrideCookie=CO1PR06MB222.namprd06.prod.outlook.com~1941996295; path=/; secure; HttpOnly
Set-Cookie: X-BackEndCookie=alfred@contoso.com=Ox8XKzcXLxg==; 
    expires=Wed, 25-Sep-2013 18:52:49 GMT; path=/EWS; secure; HttpOnly
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="https://schemas.xmlsoap.org/soap/envelope/">
  <s:Header>
    <h:ServerVersionInfo MajorVersion="15"
                         MinorVersion="0"
                         MajorBuildNumber="775"
                         MinorBuildNumber="7"
                         Version="V2_4"
                         xmlns:h="https://schemas.microsoft.com/exchange/services/2006/types"
                         xmlns="https://schemas.microsoft.com/exchange/services/2006/types"
                         xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
  </s:Header>
  <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <m:SubscribeResponse xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages"
                         xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types">
      <m:ResponseMessages>
        <m:SubscribeResponseMessage ResponseClass="Success">
          <m:ResponseCode>NoError</m:ResponseCode>
          <m:SubscriptionId>JgBjbzFwcjA2bWIyMjIubmFtcHJkMDYucHJvZC5vdXRsb29rLmNvbRAAAAAUeGk+7JFdSaFM8/NI/gQQpVdgZX6H0Ag=</m:SubscriptionId>
        </m:SubscribeResponseMessage>
      </m:ResponseMessages>
    </m:SubscribeResponse>
  </s:Body>
</s:Envelope>

À l’aide de X-BackEndOverrideCookie à partir de la réponse de Alfred et de l’en-tête X-AnchorMailbox, la demande d’abonnement est créée pour Sadie, l’autre membre de la demande d’abonnement de groupe A. Sadie ressemble à ceci.Using the X-BackEndOverrideCookie from Alfred's response and the X-AnchorMailbox header, the subscription request is created for Sadie, the other member of Group A. Sadie's subscription request looks like this.

POST https://outlook.office365.com/EWS/Exchange.asmx HTTP/1.1
Content-Type: text/xml; charset=utf-8
Accept: text/xml
User-Agent: ExchangeServicesClient/15.00.0516.014
X-AnchorMailbox: alfred@contoso.com
X-PreferServerAffinity: true
Host: outlook.office365.com
Cookie: X-BackEndOverrideCookie=CO1PR06MB222.namprd06.prod.outlook.com~1941996295
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types" xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <t:RequestServerVersion Version="Exchange2013" />
    <t:ExchangeImpersonation>
      <t:ConnectingSID>
        <t:SmtpAddress>sadie@contoso.com </t:SmtpAddress>
      </t:ConnectingSID>
    </t:ExchangeImpersonation>
  </soap:Header>
  <soap:Body>
    <m:Subscribe>
      <m:StreamingSubscriptionRequest>
        <t:FolderIds>
          <t:DistinguishedFolderId Id="inbox" />
        </t:FolderIds>
        <t:EventTypes>
          <t:EventType>NewMailEvent</t:EventType>
        </t:EventTypes>
      </m:StreamingSubscriptionRequest>
    </m:Subscribe>
  </soap:Body>
</soap:Envelope>

La réponse d’abonnement de Sadie ressemble à ceci.Sadie's subscription response looks like this. Notez qu’il n’inclut pas X-BackEndOverrideCookie.Note that it does not include the X-BackEndOverrideCookie. Le client est responsable de la mise en cache de cette valeur pour les demandes ultérieures.The client is responsible for caching that value for future requests.

HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Set-Cookie: exchangecookie=640ea858f69d47ff8cce8b44c337f6d9; path=/
Set-Cookie: X-BackEndCookie=alfred@contoso.com=Ox8XKzcXLxg==; 
   expires= Wed, 25-Sep-2013 18:53:06 GMT; path=/EWS; secure; HttpOnly
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="https://schemas.xmlsoap.org/soap/envelope/">
  <s:Header>
    <h:ServerVersionInfo MajorVersion="15"
                         MinorVersion="0"
                         MajorBuildNumber="775"
                         MinorBuildNumber="7"
                         Version="V2_4"
                         xmlns:h="https://schemas.microsoft.com/exchange/services/2006/types"
                         xmlns="https://schemas.microsoft.com/exchange/services/2006/types"
                         xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
  </s:Header>
  <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <m:SubscribeResponse xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages"
                         xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types">
      <m:ResponseMessages>
        <m:SubscribeResponseMessage ResponseClass="Success">
          <m:ResponseCode>NoError</m:ResponseCode>
          <m:SubscriptionId>JgBjbzFwcjA2bWIyMjIubmFtcHJkMDYucHJvZC5vdXRsb29rLmNvbRAAAAB4EQOy2pfrQJfM3hzs/nZJIZssan6H0Ag=</m:SubscriptionId>
        </m:SubscribeResponseMessage>
      </m:ResponseMessages>
    </m:SubscribeResponse>
  </s:Body>
</s:Envelope>

À l’aide des valeurs SubscriptionId des réponses d’abonnement, une demande d’opération GetStreamingEvents a été créée pour tous les abonnements dans le groupe.Using the SubscriptionId values from the subscription responses, a GetStreamingEvents operation request was created for all the subscriptions in the group. Étant donné qu’il y a moins de 200 abonnements dans ce groupe, ils sont tous envoyés dans une demande.Because there are less than 200 subscriptions in this group, they are all sent in one request. L’en-tête X-PreferServerAffinity est défini sur true et l’X-BackEndOverrideCookie est inclus.The X-PreferServerAffinity header is set to true and the X-BackEndOverrideCookie is included.

POST https://outlook.office365.com/EWS/Exchange.asmx HTTP/1.1
Content-Type: text/xml; charset=utf-8
Accept: text/xml
User-Agent: ExchangeServicesClient/15.00.0516.014
X-AnchorMailbox: alfred@contoso.com
X-PreferServerAffinity: true
Host: outlook.office365.com
Cookie: X-BackEndOverrideCookie=CO1PR06MB222.namprd06.prod.outlook.com~1941996295
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types" xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <t:RequestServerVersion Version="Exchange2013" />
    <t:ExchangeImpersonation>
      <t:ConnectingSID>
        <t:SmtpAddress>sadie@contoso.com</t:SmtpAddress>
      </t:ConnectingSID>
    </t:ExchangeImpersonation>
  </soap:Header>
  <soap:Body>
    <m:GetStreamingEvents>
      <m:SubscriptionIds>
        <t:SubscriptionId>JgBjbzFwcjA2bWIyMjIubmFtcHJkMDYucHJvZC5vdXRsb29rLmNvbRAAAAB4EQOy2pfrQJfM3hzs/nZJIZssan6H0Ag=</t:SubscriptionId>
        <t:SubscriptionId>JgBjbzFwcjA2bWIyMjIubmFtcHJkMDYucHJvZC5vdXRsb29rLmNvbRAAAAAUeGk+7JFdSaFM8/NI/gQQpVdgZX6H0Ag=</t:SubscriptionId>
      </m:SubscriptionIds>
      <m:ConnectionTimeout>10</m:ConnectionTimeout>
    </m:GetStreamingEvents>
  </soap:Body>
</soap:Envelope>

Les événements renvoyés sont ensuite transmis à un thread distinct pour traitement.The returned events are then passed to a separate thread for processing.

Quelles sont les modifications apportées à l’affinité ?How has affinity changed?

Dans Exchange 2010, les abonnements sont conservés sur le serveur d’accès au client, comme illustré dans la figure 3.In Exchange 2010, subscriptions are maintained on the Client Access server, as shown in Figure 3. Dans les versions d’Exchange ultérieures à Exchange 2010, les abonnements sont conservés sur le serveur de boîtes aux lettres, comme le montre la figure 4.In versions of Exchange later than Exchange 2010, subscriptions are maintained on the Mailbox server, as shown in Figure 4.

Figure 3. Processus de conservation de l’affinité dans Exchange 2010Figure 3. Process for maintaining affinity in Exchange 2010

Illustration présentant la façon dont la table d’abonnements actifs est conservée sur le serveur d’accès au client dans Exchange 2010.

Figure 4. Processus de conservation de l’affinité dans Exchange Online et Exchange 2013Figure 4. Process for maintaining affinity in Exchange Online and Exchange 2013

Illustration présentant la façon dont l’équilibrage de charge et le serveur d’accès au client acheminent les demandes vers le serveur de boîtes aux lettres qui conserve la table des abonnements actifs dans Exchange Server et Exchange Online.

Dans Exchange 2010, le client connaît uniquement l’adresse de l’équilibreur de charge et le exchangecookie renvoyé par le serveur s’assure que la demande est routée vers le serveur d’accès au client approprié.In Exchange 2010, the client only knows the address of the load balancer, and the exchangecookie that is returned by the server ensures that the request is routed to the right Client Access server. Toutefois, dans les versions ultérieures, les rôles du serveur d’accès au client et de l’équilibreur de charge doivent tous deux acheminer les demandes de manière appropriée avant qu’ils n’obtiennent le serveur de boîtes aux lettres.However, in later versions, the load balancer and the Client Access server roles both have to route the requests appropriately before they get to the Mailbox server. Pour ce faire, des informations supplémentaires sont requises, c’est pourquoi les nouveaux en-têtes et les cookies ont été introduits.To do that, additional information is required, which is why the new headers and cookie were introduced. L’article abonnements aux notifications, les événements de boîte aux lettres et EWS dans Exchange explique comment les abonnements sont gérés dans Exchange 2013.The article Notification subscriptions, mailbox events, and EWS in Exchange explains how subscriptions are maintained in Exchange 2013.

Vous pouvez remarquer que le exchangecookie utilisé par Exchange 2010 est toujours renvoyé par les versions ultérieures.You might notice that the exchangecookie that Exchange 2010 uses is still returned by later versions. Il n’y a aucun dommage à inclure ce cookie dans les requêtes, mais les versions ultérieures d’Exchange l’ignorent.There's no harm in including this cookie in requests, but later versions of Exchange ignore it.

Voir aussiSee also