Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Los transportes orientados a secuencia como TCP y las canalizaciones con nombre funcionan en una secuencia continua de bytes entre el cliente y servidor. Este flujo se realiza mediante un Stream objeto . En una actualización de flujo, el cliente quiere agregar una capa de protocolo opcional a la pila de canales y pide al otro extremo del canal de comunicación que lo haga. La actualización del flujo consiste en reemplazar el objeto original Stream por uno actualizado.
Por ejemplo, puede crear un flujo de compresión directamente sobre el flujo de transporte. En este caso, el transporte Stream original se reemplaza por uno que encapsula la compresión Stream alrededor del original.
Puede aplicar varias actualizaciones de flujo, cada una de las cuales encapsula la anterior.
Cómo funcionan las actualizaciones de secuencia
Hay cuatro componentes para el proceso de actualización del flujo.
Un iniciador de flujo de actualización comienza el proceso: en tiempo de ejecución puede iniciar una solicitud al otro extremo de su conexión para actualizar la capa de transporte del canal.
Un aceptador de flujo de actualización lleva a cabo la actualización: en tiempo de ejecución recibe la solicitud de actualización de la otra máquina y, si es posible, acepta la actualización.
Un proveedor de actualización crea el iniciador en el cliente y el aceptador en el servidor.
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.
Tenga en cuenta que, en el caso de varias actualizaciones, el iniciador y el aceptador encapsulan las máquinas de estado para aplicar qué transiciones de actualización son válidas para cada iniciación.
Cómo implementar una actualización de secuencia
Windows Communication Foundation (WCF) proporciona cuatro abstract
clases que puedes implementar:
Para implementar una actualización de secuencia personalizada, haga lo siguiente. Este procedimiento implementa un proceso de actualización de flujo mínimo en las máquinas cliente y servidor.
Cree una clase que implemente StreamUpgradeInitiator.
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 la actualización de forma asincrónica.
Invalide el GetNextUpgrade método para comprobar si hay actualizaciones adicionales.
Cree una clase que implemente StreamUpgradeAcceptor.
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 la actualización de forma asincrónica.
Invalide el CanUpgrade método para determinar si este aceptador de actualización admite la actualización solicitada en este punto del proceso de actualización.
Cree una clase que implemente StreamUpgradeProvider. Invalide los métodos CreateUpgradeAcceptor y CreateUpgradeInitiator para devolver instancias del iniciador y el aceptador definidos en los pasos 1 y 2.
Cree una clase que implemente StreamUpgradeBindingElement.
Invalide el BuildClientStreamUpgradeProvider método en el cliente y el BuildServerStreamUpgradeProvider método en el servicio.
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.
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 flujo general.
WCF ya proporciona dos elementos de enlace para actualizar la seguridad del flujo. La configuración de la seguridad de nivel de transporte está encapsulada por 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.
En los escenarios de seguridad que no son abarcados por los dos elementos de enlace anteriores, se derivan tres clases relacionadas con la seguridad de las clases base de iniciador, aceptador y proveedor mencionadas anteriormente.
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 de 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 anterior: cree extensiones adicionales de StreamUpgradeProvider y elementos de enlace. Agregue los elementos de enlace al enlace. Los elementos de enlace adicionales se procesan 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. A continuación, debe reemplazar el parámetro de enlace de actualización existente por un nuevo parámetro de enlace de actualización compuesto.
Como alternativa, un proveedor de actualización puede admitir varias actualizaciones. Por ejemplo, puede que quiera implementar un proveedor de actualización de flujos personalizado que admita la seguridad y la compresión. Siga estos pasos:
Subclase StreamSecurityUpgradeProvider para escribir la clase de proveedor que crea el iniciador y el aceptador.
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.
Cree subclase de StreamSecurityUpgradeAcceptor que entienda los tipos de contenido personalizados en su método CanUpgrade.
La secuencia se actualizará después de cada llamada a GetNextUpgrade y CanUpgrade.