Mantener la afinidad entre un grupo de suscripciones y el servidor de buzones de correo de ExchangeMaintain affinity between a group of subscriptions and the Mailbox server in Exchange

Obtenga información acerca de cómo mantener la afinidad entre un grupo de suscripciones y el servidor de buzones de correo.Find out about maintaining the affinity between a group of subscriptions and the Mailbox server.

Affinity es la Asociación de una secuencia de mensajes de solicitud y respuesta con un servidor de buzones de correo determinado.Affinity is the association of a sequence of request and response messages with a particular Mailbox server. Para la mayoría de las funciones de Exchange, la afinidad la administra el servidor.For most functionality in Exchange, affinity is handled by the server. Las notificaciones, sin embargo, son una excepción.Notifications, however, are an exception. El cliente es responsable de mantener la afinidad con el servidor de buzones de correo para las suscripciones de notificación.The client is responsible for maintaining the affinity with the Mailbox server for notification subscriptions. Esta afinidad permite que el equilibrador de carga y los servidores de acceso de cliente entre el cliente y el servidor enruten las suscripciones de notificación y las solicitudes relacionadas al servidor de buzones de correo que mantiene la suscripción.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. Sin afinidad, la solicitud se puede enrutar a un servidor de buzones de correo diferente que no incluye las suscripciones del cliente, lo que puede provocar que se devuelva un error 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.

¿Cómo se mantiene la afinidad?How is affinity maintained?

La afinidad de Exchange se basa en cookies.Affinity in Exchange is cookie based. El cliente desencadena la creación de la cookie mediante la inclusión de encabezados específicos en la solicitud de suscripción y, a continuación, la respuesta de la suscripción contiene la 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. A continuación, el cliente envía esa cookie en solicitudes posteriores para asegurarse de que la solicitud se enruta al servidor de buzones de correo correcto.The client then sends that cookie in subsequent requests to ensure that the request is routed to the right Mailbox server.

Más concretamente, la afinidad de Exchange se controla mediante lo siguiente:More specifically, affinity in Exchange is handled by the following:

  • X-AnchorMailbox: un encabezado HTTP que se incluye en la solicitud de suscripción inicial.X-AnchorMailbox — An HTTP header that is included in the initial subscription request. Identifica el primer buzón de un grupo de buzones que comparten la afinidad con el mismo servidor de buzones de correo.It identifies the first mailbox in a group of mailboxes that share affinity with the same Mailbox server.

  • X-PreferServerAffinity: un encabezado HTTP que se incluye en la solicitud de suscripción inicial con el encabezado X-AnchorMailbox y se establece en true para indicar que el cliente está solicitando que se mantenga la afinidad con el servidor de buzones de correo.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: una cookie que se incluye en la respuesta de suscripción inicial y contiene una cookie que el equilibrador de carga y el servidor de acceso de cliente usan para redirigir las solicitudes posteriores al mismo servidor de buzones de correo.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.

¿Cómo puedo mantener la afinidad mediante la API administrada de EWS o EWS?How do I maintain affinity by using the EWS Managed API or EWS?

Puede usar los mismos pasos para mantener la afinidad para varias suscripciones de buzones y sus servidores de buzones de correo, independientemente de si usa las notificaciones de streaming, pull o Push, y de si su objetivo es un servidor local de Exchange o 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. Para cada buzón, llame a detección automática y obtenga la configuración de usuario de GroupingInformation y ExternalEwsUrl.For each mailbox, call Autodiscover and get the GroupingInformation and ExternalEwsUrl user settings. Para la detección automática de SOAP, use el elemento Setting y, para la detección automática de Pox, use el elemento GroupingInformation .For SOAP Autodiscover, you use the Setting element, and for POX Autodiscover, you use the GroupingInformation element.

  2. Mediante la configuración GroupingInformation y ExternalEwsUrl de las respuestas de detección automática, ubique los buzones con el mismo valor concatenado de ExternalEwsUrl y GroupingInformation en el mismo grupo.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 algún grupo tiene más de 200 buzones, separe los grupos más para que cada grupo no tenga más de 200 buzones.If any groups have more than 200 mailboxes, break the groups down further so that each group has no more than 200 mailboxes.

  3. Cree y use un objeto ExchangeService para el resto del procedimiento.Create and use one ExchangeService object for the rest of the procedure. Cuando se usa el mismo objeto ExchangeService , las cookies y los encabezados (cuando se establecen) se mantienen automáticamente.When you use the same ExchangeService object, cookies and headers (when they are set) are automatically maintained. Tenga en cuenta que si no desea agrupar las suscripciones de transmisión en una sola conexión, puede crear un objeto ExchangeService diferente para cada usuario suplantado.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. Envíe una solicitud de suscripción para el usuario cuyo nombre de usuario aparezca primero cuando todos los usuarios del grupo estén ordenados alfabéticamente (nos referiremos a este usuario como el usuario de buzón de correo anclado).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). Haga lo siguiente:Do the following:

  • Incluya el encabezado X-AnchorMailbox con un valor establecido en la dirección SMTP del usuario buzón de correo anclado.Include the X-AnchorMailbox header with a value set to the SMTP address of the anchor mailbox user.

  • Incluya el encabezado X-PreferServerAffinity con un valor establecido en true.Include the X-PreferServerAffinity header with a value set to true.

  • Use el rol ApplicationImpersonation (el tipo ExchangeImpersonation ).Use the ApplicationImpersonation role (the ExchangeImpersonation type).

  1. En la respuesta de la suscripción, obtenga el valor X-BackEndOverrideCookie.In the subscription response, get the X-BackEndOverrideCookie value. Incluya este valor en cada una de las siguientes solicitudes de suscripción para los usuarios de este grupo.Include this value in each of the subsequent subscription requests for users in this group.

  2. Para cada usuario adicional del grupo, envíe una solicitud de suscripción y haga lo siguiente:For each additional user in the group, send a subscription request and do the following:

  • Incluya el encabezado X-AnchorMailbox con un valor establecido en la dirección SMTP del usuario buzón de correo de delimitador para el grupo.Include the X-AnchorMailbox header with a value set to the SMTP address of the anchor mailbox user for the group.

  • Incluya el encabezado X-PreferServerAffinity con un valor establecido en true.Include the X-PreferServerAffinity header with a value set to true.

  • Incluya el X-BackEndOverrideCookie que se devolvió en la respuesta de la suscripción del usuario del buzón de correo anclado.Include the X-BackEndOverrideCookie that was returned in the anchor mailbox user's subscription response.

  • Use el rol ApplicationImpersonation (el tipo ExchangeImpersonation ).Use the ApplicationImpersonation role (the ExchangeImpersonation type).

    Tenga en cuenta que el servidor usa los valores X-PreferServerAffinity y X-BackendOverrideCookie para realizar el enrutamiento al servidor de buzones de correo.Note that the server uses the X-PreferServerAffinity and X-BackendOverrideCookie values together to perform the routing to the mailbox server. El encabezado X-AnchorMailbox también es necesario, pero el servidor lo omite si los dos valores son válidos.The X-AnchorMailbox header is also required, but is ignored by the server if the other two values are valid. Si X-AnchorMailbox y X-PreferServerAffinity están en una solicitud y no se incluye X-BackendOverrideCookie, el valor X-AnchorMailbox se usa para enrutar las solicitudes.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.

    Debido a que los valores X-PreferServerAffinity y X-BackendOverrideCookie realizan el enrutamiento, si el buzón de correo del delimitador se mueve alguna vez a otro grupo o servidor, la lógica no cambia porque el BackendOverrideCookie X redirige la solicitud al servidor correcto para el grupo.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. Envíe una sola solicitud GetStreamingEvents o GetEvents para el grupo y haga lo siguiente:Send a single GetStreamingEvents or GetEvents requests for the group, and do the following:
  • Incluya los valores de SubscriptionId devueltos en cada una de las respuestas de suscripción individuales para los buzones del grupo.Include the SubscriptionId values returned in each of the individual subscription responses for mailboxes in the group.

  • Si hay más de 200 suscripciones para el grupo, cree varias solicitudes.If more than 200 subscriptions exist for the group, create multiple requests. El número máximo de valores de SubscriptionId que se deben incluir en una solicitud es de 200.The maximum number of SubscriptionId values to include in a request is 200.

  • Si necesita más conexiones de las que hay disponibles para el buzón de correo de destino, use la cuenta de servicio para suplantar el buzón de correo de delimitador del grupo; de lo contrario, no use la suplantación.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. Lo ideal es que desee suplantar un buzón de correo único por cada solicitud GetStreamingEvents o GetEvents , de modo que nunca se detecten límites de limitación.Ideally, you want to impersonate a unique mailbox per GetStreamingEvents or GetEvents request so that you never encounter throttling limits.

  • Use ApplicationImpersonation si necesita más conexiones de las que hay disponibles para el buzón de correo de destino; de lo contrario, no use ApplicationImpersonation.Use ApplicationImpersonation if you need more connections than are available to the target mailbox; otherwise, do not use ApplicationImpersonation.

  • Incluya el encabezado X-PreferServerAffinity y establézcalo en true.Include the X-PreferServerAffinity header and set it to true. Este valor se incluye automáticamente si usa el objeto ExchangeService que creó en el paso 2.This value is automatically included if you are using the ExchangeService object that you created in step 2.

  • Incluya el X-BackEndOverrideCookie para el grupo (el BackEndOverrideCookie que se ha devuelto en la respuesta de suscripción del usuario del buzón de correo anclado).Include the X-BackEndOverrideCookie for the group (the X-BackEndOverrideCookie that was returned in the anchor mailbox user's subscription response). Este valor se incluye automáticamente si usa el objeto ExchangeService que creó en el paso 2.This value is automatically included if you are using the ExchangeService object that you created in step 2.

  1. Pasar los eventos devueltos a un subproceso independiente para su procesamiento.Pass the returned events to a separate thread for processing.

¿Qué valores de limitación se deben tener en cuenta?What throttling values do I need to take into consideration?

Al planear la implementación de la notificación, querrá tener en cuenta dos valores: el número de conexiones y el número de suscripciones.As you plan your notification implementation, you'll want to take two values into consideration: the number of connections, and the number of subscriptions. En la siguiente tabla se enumeran los valores predeterminados para cada configuración de limitación y cómo se usa la configuración.The following table lists the default values for each throttling setting and how the settings are used. Para cada valor, el presupuesto se asigna al buzón de correo de destino.For each value, the budget is allocated to the target mailbox. Por este motivo, el uso de la suplantación para obtener conexiones adicionales es un paso necesario en muchos escenarios.For this reason, using impersonation to gain additional connections is a required step in many scenarios.

Tabla 1. Valores de limitación predeterminadosTable 1. Default throttling values

Área de consideraciónArea of consideration Configuración de limitaciónThrottling setting Valor predeterminadoDefault value DescripciónDescription
Conexiones de transmisiónStreaming connections
Límite predeterminado de conexiones francesasDefault hanging connection limit
10 para Exchange Online10 for Exchange Online
3 para Exchange 20133 for Exchange 2013
Número máximo de conexiones simultáneas de transmisión por secuencias que una cuenta puede tener abiertas en el servidor al mismo tiempo.The maximum number of concurrent streaming connections that an account can have open on the server at one time. Para trabajar dentro de este límite, use una cuenta de servicio con el rol ApplicationImpersonation asignado para los buzones de correo de destino y suplante el primer usuario de cada grupo de identificador de suscripción al obtener eventos transmitidos.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.
Conexiones de inserción o extracciónPull or push connections
EWSMaxConcurrencyEWSMaxConcurrency
,2727
Número máximo de conexiones de extracción o inserción simultáneas (solicitudes que se han recibido pero que todavía no se han respondido) que una cuenta puede tener abierta en el servidor al mismo tiempo.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.
SuscripcionesSubscriptions
EWSMaxSubscriptionsEWSMaxSubscriptions
20 para Exchange Online20 for Exchange Online
5000 para Exchange 20135000 for Exchange 2013
El número máximo de suscripciones no expiradas que puede tener una cuenta al mismo tiempo.The maximum number of nonexpired subscriptions that an account can have at one time. Este valor se reduce cuando se crea la suscripción en el servidor.This value is decremented when the subscription is created on the server.

En el siguiente ejemplo se muestra cómo se administran los presupuestos entre cualquier buzón de correo de destino y la cuenta de servicio que tiene asignada la función ApplicationImpersonation para los buzones de correo de destino.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) suplanta a muchos usuarios (M1, m2, m3, etc.) y crea suscripciones para cada buzón.ServiceAccount1 (sa1) impersonates many users (m1, m2, m3, and so on) and creates subscriptions for each mailbox. Tenga en cuenta que, al crear las suscripciones, el propietario de la suscripción es SA1, por lo que cuando SA1 abre una conexión con las suscripciones, EWS exige que las suscripciones sean propiedad de 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 puede abrir la conexión de las maneras siguientes:Sa1 can open the connection in the following ways:

  1. Sin suplantación, de modo que la conexión se carga contra SA1.Without impersonation, so the connection is charged against sa1.

  2. Mediante la suplantación de cualquiera de los usuarios (M1 por ejemplo) para que la conexión se cargue con una copia del presupuesto de 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 puede abrir diez conexiones mediante Exchange Online y todas las cuentas de servicio que suplantan a M1 pueden abrir diez conexiones mediante el presupuesto copiado).(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 se alcanza el límite de conexión, estarán disponibles las siguientes soluciones:If the connection limit is hit, the following workarounds are available:

    • Si se usa la opción 1, el administrador puede crear varias cuentas de servicio para suplantar a otros usuarios.If option 1 is used, the administrator can create multiple service accounts to impersonate additional users.

    • Si se usa la opción 2, el código puede suplantar a otro usuario, por ejemplo, m2.If option 2 is used, the code can impersonate another user — m2 for example.

Ejemplo: mantener la afinidad entre un grupo de suscripciones y el servidor de buzones de correoExample: Maintaining affinity between a group of subscriptions and the Mailbox server

Bien, vamos a verlo en acción.Okay, let's see it in action. El siguiente ejemplo de código muestra cómo agrupar usuarios y usar los encabezados X-AnchorMailbox y X-PreferServerAffinity y la cookie X-BackendOverrideCookie para mantener la afinidad con el servidor de buzones de correo.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. Como los encabezados y la cookie son de importancia primordial en el artículo de afinidad, este ejemplo se centra en las solicitudes y respuestas XML de 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. Para usar la API administrada de EWS para crear el cuerpo de las solicitudes y respuestas de suscripción, consulte transmisiones por secuencias sobre eventos de buzón de correo con EWS en Exchange y extraer notificaciones sobre eventos de buzón de correo mediante EWS en 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. En esta sección se incluyen pasos adicionales específicos para mantener la afinidad y agregar los encabezados a las solicitudes.This section includes additional steps particular to maintaining affinity and adding the headers to your requests.

Este ejemplo tiene cuatro usuarios: alfred@contoso.com, alisa@contoso.com, ronnie@contoso.com y sadie@contoso.com.This example has four users: alfred@contoso.com, alisa@contoso.com, ronnie@contoso.com, and sadie@contoso.com. La siguiente figura muestra la configuración de detección automática de GroupingInformation y ExternalEwsUrl para los usuarios.The following figure shows the GroupingInformation and ExternalEwsUrl Autodiscover settings for the users.

Figura 1. Configuración de detección automática usada para agrupar buzonesFigure 1. Autodiscover settings used to group mailboxes

Tabla que muestra los valores de GroupingInformation y ExternalEwsUrl para cada uno de los usuarios.

Mediante la configuración de las respuestas de detección automática, los buzones se agrupan por el valor concatenado de la configuración GroupingInformation y ExternalEwsUrl.Using the settings from the Autodiscover responses, the mailboxes are grouped by the concatenated value of the GroupingInformation and ExternalEwsUrl settings. En este ejemplo, Alfred y Sadie tienen los mismos valores, por lo que se encuentran en un grupo y alisa y Ronnie comparten los mismos valores, por lo que se encuentran en otro grupo.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.

Figura 2. Creación de grupos de buzonesFigure 2. Creating mailbox groups

Tabla que muestra cómo se crean los grupos de buzones usando la configuración de Detección automática.

A efectos de este ejemplo, nos centraremos en el grupo A. Usaría los mismos pasos para el grupo B, pero usaré un valor X-AnchorMailbox diferente para ese grupo.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.

Con ApplicationImpersonation, cree la solicitud de suscripción para el buzón delimitado (Alfred@contoso.com), con el encabezado x-AnchorMailbox establecido en su dirección de correo electrónico y un valor de encabezado 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. Si se establecen estos dos valores de encabezado, se activará el servidor para crear un X-BackEndOverrideCookie para la respuesta.Setting these two header values will trigger the server to create an X-BackEndOverrideCookie for the response.

Si está usando la API administrada de EWS, use el método HttpHeaderspara agregar los dos encabezados a la solicitud de suscripción, como se muestra a continuación.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");

Por lo tanto, la solicitud de suscripción de Alfred tiene este aspecto.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>

El siguiente mensaje XML es la respuesta a la solicitud de suscripción de Alfred e incluye la X-BackEndOverrideCookie.The following XML message is the response to Alfred's subscription request, and it includes the X-BackEndOverrideCookie. Vuelva a enviar esta cookie para todas las solicitudes posteriores para los usuarios de este grupo.Resend this cookie for all subsequent requests for users in this group. Observe que la respuesta también contiene cookies adicionales, como la cookie exchangecookie usada por Exchange 2010.Notice that the response also contains additional cookies, such as the exchangecookie cookie used by Exchange 2010. Exchange Online, Exchange online como parte de Office 365 y las versiones de Exchange a partir de Exchange 2013, ignore exchangecookie si se incluye en solicitudes de suscripción posteriores.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>

Si se usa el X-BackEndOverrideCookie de la respuesta de Alfred y el encabezado X-AnchorMailbox, se crea la solicitud de suscripción para Sadie, el otro miembro de la solicitud de suscripción del grupo A. Sadie tiene este aspecto.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 respuesta de la suscripción de Sadie tiene este aspecto.Sadie's subscription response looks like this. Tenga en cuenta que no incluye el X-BackEndOverrideCookie.Note that it does not include the X-BackEndOverrideCookie. El cliente es responsable de almacenar en caché ese valor para las solicitudes futuras.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>

Mediante el uso de los valores de SubscriptionId de las respuestas de suscripción, se ha creado una solicitud de operación GetStreamingEvents para todas las suscripciones del grupo.Using the SubscriptionId values from the subscription responses, a GetStreamingEvents operation request was created for all the subscriptions in the group. Como hay menos de 200 suscripciones en este grupo, todas se envían en una solicitud.Because there are less than 200 subscriptions in this group, they are all sent in one request. El encabezado X-PreferServerAffinity se establece en true y se incluye el X-BackEndOverrideCookie.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>

A continuación, los eventos devueltos se pasan a un subproceso independiente para su procesamiento.The returned events are then passed to a separate thread for processing.

¿Cómo ha cambiado la afinidad?How has affinity changed?

En Exchange 2010, las suscripciones se mantienen en el servidor de acceso de cliente, tal como se muestra en la figura 3.In Exchange 2010, subscriptions are maintained on the Client Access server, as shown in Figure 3. En versiones de Exchange posteriores a Exchange 2010, las suscripciones se mantienen en el servidor de buzones de correo, tal como se muestra en la figura 4.In versions of Exchange later than Exchange 2010, subscriptions are maintained on the Mailbox server, as shown in Figure 4.

Figura 3. Proceso para mantener la afinidad en Exchange 2010Figure 3. Process for maintaining affinity in Exchange 2010

Ilustración que muestra cómo se mantiene la tabla de suscripciones activas en el servidor de acceso de cliente en Exchange 2010.

Figura 4. Proceso para mantener la afinidad en Exchange Online y Exchange 2013Figure 4. Process for maintaining affinity in Exchange Online and Exchange 2013

Ilustración que muestra cómo el equilibrador de carga y el servidor de acceso de cliente enrutan las solicitudes al servidor de buzones que mantiene la tabla de suscripciones activas en Exchange Server y Exchange Online.

En Exchange 2010, el cliente solo conoce la dirección del equilibrador de carga y el exchangecookie devuelto por el servidor asegura que la solicitud se enruta al servidor de acceso de cliente correcto.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. Sin embargo, en versiones posteriores, el equilibrador de carga y los roles de servidor acceso de clientes tienen que enrutar las solicitudes adecuadamente antes de que lleguen al servidor de buzones de correo.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. Para ello, se necesita información adicional, que es la razón por la que se introdujeron los nuevos encabezados y la cookie.To do that, additional information is required, which is why the new headers and cookie were introduced. Las suscripciones de notificación de artículo, los eventos de buzón y EWS en Exchange explican cómo se mantienen las suscripciones en Exchange 2013.The article Notification subscriptions, mailbox events, and EWS in Exchange explains how subscriptions are maintained in Exchange 2013.

Es posible que observe que el exchangecookie que usa Exchange 2010 sigue devuelto por versiones posteriores.You might notice that the exchangecookie that Exchange 2010 uses is still returned by later versions. No hay ningún daño en incluir esta cookie en las solicitudes, pero las versiones más recientes de Exchange la omiten.There's no harm in including this cookie in requests, but later versions of Exchange ignore it.

Vea tambiénSee also