Actualizaciones personalizadas de secuencias

Los transportes orientados a secuencia como TCP y las canalizaciones con nombre funcionan en una secuencia continua de bytes entre el cliente y servidor. Esta secuencia se realiza mediante un objeto Stream. En una actualización de secuencia, el cliente desea agregar una capa de protocolo opcional a la pila del canal y pide al otro lado del canal de comunicación que lo haga. La actualización de secuencia consiste en reemplazar el objeto Stream original con uno actualizado.

Por ejemplo, puede crear directamente una secuencia de compresión encima de la secuencia de transporte. En este caso, el transporte Stream original se reemplaza con uno que encapsula la compresión Stream alrededor del original.

Puede aplicar varias actualizaciones de secuencia, cada una que encapsule a la precedente.

Cómo funcionan las actualizaciones de secuencia

Hay cuatro componentes en el proceso de actualización de secuencia.

  1. El proceso se inicia desde un Iniciador de secuencia de actualización: para actualizar la capa de transporte del canal en tiempo de ejecución, se puede iniciar una solicitud desde el iniciador al otro extremo de la conexión que se establece para este.

  2. El proceso de actualización se lleva a cabo mediante un Aceptador de secuencia de actualización: en el aceptador, se recibe la solicitud de actualización en tiempo de ejecución desde el otro equipo y, si es posible, se acepta el proceso de actualización.

  3. Mediante un Proveedor de actualización, se lleva a cabo la creación del Iniciador en el cliente y del Aceptador en el servidor.

  4. Se agrega un Elemento de enlace de actualización de secuencia a los enlaces del servicio y el cliente y, después se crea el proveedor en tiempo de ejecución.

Observe que en el caso de varias actualizaciones, el iniciador y aceptador encapsulan las máquinas de estado para exigir qué transiciones de actualización son válidas para cada iniciación.

Cómo implementar una actualización de secuencia

En el motor Windows Communication Foundation (WCF) se proporcionan cuatro clases abstract que se pueden implementar:

Para implementar una actualización de secuencia personalizada, haga lo siguiente. Este procedimiento implementa un proceso de actualización de secuencia mínimo en los equipos del servidor y del cliente.

  1. Cree una clase que implemente StreamUpgradeInitiator.

    1. Invalide el método InitiateUpgrade para tomar la secuencia que se va a actualizar y devuelva la secuencia actualizada. Este método funciona sincrónicamente; hay métodos análogos para iniciar de forma asincrónica la actualización.

    2. Invalide el método GetNextUpgrade para comprobar las actualizaciones adicionales.

  2. Cree una clase que implemente StreamUpgradeAcceptor.

    1. Invalide el método AcceptUpgrade para tomar la secuencia que se va a actualizar y devuelva la secuencia actualizada. Este método funciona sincrónicamente; hay métodos análogos para aceptar de forma asincrónica la actualización.

    2. Invalide el método CanUpgrade para determinar si este aceptador de actualización admite la actualización solicitada en el proceso de actualización.

  3. Cree una clase que implemente StreamUpgradeProvider. Invalide los métodos CreateUpgradeAcceptor y CreateUpgradeInitiator para devolver las instancias del aceptador e iniciador definidas en los pasos 2 y 1.

  4. Cree una clase que implemente StreamUpgradeBindingElement.

    1. Invalide el método BuildClientStreamUpgradeProvider en el cliente y el método BuildServerStreamUpgradeProvider en el servicio.

    2. Invalide el método BuildChannelFactory en el cliente y el método BuildChannelListener en el servicio para agregar la actualización Elemento de enlace a BindingParameters.

  5. Agregue el nuevo elemento de enlace de actualización de secuencia a los enlaces en los equipos del cliente y del servidor.

Actualizaciones de seguridad

Agregar una actualización de seguridad es una versión especializada del proceso de actualización de secuencia general.

En el motor WCF ya se proporcionan dos elementos de enlace que pueden usarse para actualizar la seguridad de la secuencia. La configuración de la seguridad de nivel de transporte la encapsula WindowsStreamSecurityBindingElement y SslStreamSecurityBindingElement, que se pueden configurar y agregar a un enlace personalizado. Estos elementos de enlace extienden la clase StreamUpgradeBindingElement que crea los proveedores de actualización de secuencia del cliente y el servidor. Estos elementos de enlace tienen métodos que crean las clases de proveedor de actualización de secuencia de seguridad especializadas, que no son public, por lo que para estos dos casos solamente se necesita agregar el elemento de enlace a este enlace.

Para los escenarios de seguridad que no se incluyan en los dos elementos de enlace anteriores, tres clases abstract relacionadas con seguridad se derivan de las clases base de iniciador, aceptador y proveedor anteriores:

  1. System.ServiceModel.Channels.StreamSecurityUpgradeInitiator

  2. System.ServiceModel.Channels.StreamSecurityUpgradeAcceptor

  3. System.ServiceModel.Channels.StreamSecurityUpgradeProvider

El proceso de implementar una actualización de secuencia de seguridad es igual que antes, con la diferencia de que derivaría de estas tres clases. Invalide las propiedades adicionales en estas clases para proporcionar información de seguridad al tiempo de ejecución.

Varias actualizaciones

Para crear solicitudes de actualización adicionales, repita el proceso arriba mencionado: cree extensiones adicionales de StreamUpgradeProvider y elementos de enlace. Agregue los elementos de enlace al enlace. Se procesan los elementos de enlace adicionales secuencialmente, empezando por el primer elemento de enlace agregado al enlace. En BuildChannelFactory y BuildChannelListener cada proveedor de actualización puede determinar cómo disponerse en capas en cualquiera de los parámetros de enlace de actualización ya existentes. Debería reemplazar a continuación el parámetro de enlace de actualización existente con un nuevo parámetro de enlace de actualización compuesta.

Alternativamente, un proveedor de actualización puede admitir varias actualizaciones. Por ejemplo, podría desear implementar un proveedor de actualización de secuencia personalizado que admita seguridad y compresión. Siga estos pasos:

  1. StreamSecurityUpgradeProvider subclase para escribir la clase de proveedor que crea el iniciador y el aceptador.

  2. Cree subclase de StreamSecurityUpgradeInitiator asegurándose de invalidar el método GetNextUpgrade para devolver los tipos de contenido para la secuencia de compresión y la secuencia segura en orden.

  3. Cree subclase de StreamSecurityUpgradeAcceptor que entienda los tipos de contenido personalizados en su método CanUpgrade.

  4. La secuencia se actualizará después de cada llamada a GetNextUpgrade y CanUpgrade.

Consulte también