Oharra
Orrialde honetara sartzeak baimena behar du. Saioa hasteko edo direktorioak aldatzen saia zaitezke.
Orrialde honetara sartzeak baimena behar du. Direktorioak aldatzen saia zaitezke.
El ejemplo de MessageInterceptor muestra el uso del modelo de extensibilidad de canal. En concreto, muestra cómo implementar un elemento de enlace personalizado que crea generadores de canales y agentes de escucha de canal para interceptar todos los mensajes entrantes y salientes en un punto determinado de la pila en tiempo de ejecución. El ejemplo también incluye un cliente y un servidor que muestran el uso de estas factorías personalizadas.
En este ejemplo, tanto el cliente como el servicio son programas de consola (.exe). Tanto el cliente como el servicio usan una biblioteca común (.dll) que contiene el elemento de enlace personalizado y sus objetos en tiempo de ejecución asociados.
Nota:
El procedimiento de instalación y las instrucciones de compilación de este ejemplo se encuentran al final de este tema.
En el ejemplo se describe el procedimiento recomendado para crear un canal en capas personalizado en Windows Communication Foundation (WCF), mediante el marco de canal y siguiendo los procedimientos recomendados de WCF. Los pasos para crear un canal en capas personalizado son los siguientes:
Decida cuál de las formas del canal admitirá el generador de canales y el agente de escucha del canal.
Cree un generador de canales y un agente de escucha del canal que admita las formas del canal.
Agregue un elemento de enlace que añada el canal superpuesto personalizado a una pila de canales.
Agregue una sección de extensión de elemento de enlace para exponer el nuevo elemento de enlace al sistema de configuración.
Formas de canal
El primer paso para escribir un canal en capas personalizado es decidir qué formas son necesarias para el canal. Para nuestro inspector de mensajes, admitimos cualquier forma que admita la capa debajo de nosotros (por ejemplo, si la capa debajo de nosotros puede construir IOutputChannel y IDuplexSessionChannel, entonces también mostramos IOutputChannel y IDuplexSessionChannel).
Generador de canales y de agentes de escucha
El siguiente paso para escribir un canal en capas personalizado es crear una implementación de IChannelFactory para los canales de cliente y de IChannelListener para los canales de servicio.
Estas clases escogen un generador y un agente de escucha internos y delegan todas las llamadas excepto OnCreateChannel y OnAcceptChannel al generador y agente de escucha internos.
class InterceptingChannelFactory<TChannel> : ChannelFactoryBase<TChannel>
{
//...
}
class InterceptingChannelListener<TChannel> : ListenerFactoryBase<TChannel>
{
//...
}
Agregar un elemento de vinculación
El ejemplo define un elemento de enlace personalizado: InterceptingBindingElement.
InterceptingBindingElement toma un ChannelMessageInterceptor como entrada y usa este ChannelMessageInterceptor para manipular mensajes que pasan por él. Esta es la única clase que debe ser pública. La fábrica, el agente de escucha y los canales pueden ser implementaciones internas de las interfaces de tiempo de ejecución pública.
public class InterceptingBindingElement : BindingElement
{
}
Agregación de la compatibilidad de configuración
Para integrar con la configuración de enlace, la biblioteca define un controlador de la sección de configuración como una sección de extensión de elemento de enlace. Los archivos de configuración de cliente y servidor deben registrar la extensión de elemento de enlace con el sistema de configuración. Los implementadores que quieran exponer su elemento de enlace al sistema de configuración pueden derivar de esta clase.
public abstract class InterceptingElement : BindingElementExtensionElement
{
//...
}
Agregar directiva
Para integrarse con nuestro sistema de directivas, InterceptingBindingElement implementa IPolicyExportExtension para indicar que deberíamos participar en la generación de directivas. Para admitir la importación de directivas en un cliente generado, el usuario puede registrar una clase derivada de InterceptingBindingElementImporter e invalidar CreateMessageInterceptor() para generar su clase habilitada ChannelMessageInterceptor para directivas.
Ejemplo: inspector de mensajes que pueden quitarse
En este ejemplo se incluye una implementación de ejemplo de ChannelMessageInspector que quita mensajes.
class DroppingServerElement : InterceptingElement
{
protected override ChannelMessageInterceptor CreateMessageInterceptor()
{
return new DroppingServerInterceptor();
}
}
Puede acceder a él desde la configuración de la siguiente manera:
<configuration>
...
<system.serviceModel>
...
<extensions>
<bindingElementExtensions>
<add name="droppingInterceptor"
type=
"Microsoft.ServiceModel.Samples.DroppingServerElement, library"/>
</bindingElementExtensions>
</extensions>
</system.serviceModel>
</configuration>
Tanto el cliente como el servidor usan esta sección de configuración recién creada para insertar las factorías personalizadas en el nivel más bajo de sus pilas de canales en tiempo de ejecución (por encima del nivel de transporte).
<customBinding>
<binding name="sampleBinding">
<droppingInterceptor/>
<httpTransport/>
</binding>
</customBinding>
El cliente usa la MessageInterceptor biblioteca para agregar un encabezado personalizado a mensajes incluso numerados. Por otro lado, el servicio usa MessageInterceptor la biblioteca para quitar los mensajes que no tengan este encabezado especial.
Debería ver el siguiente resultado del cliente después de ejecutar primero el servicio y después el cliente.
Reporting the next 10 wind speed
100 kph
Server dropped a message.
90 kph
80 kph
Server dropped a message.
70 kph
60 kph
Server dropped a message.
50 kph
40 kph
Server dropped a message.
30 kph
20 kph
Server dropped a message.
10 kph
Press ENTER to shut down client
El cliente informa de 10 velocidades de viento diferentes al servicio, pero solo etiqueta la mitad de ellos con el encabezado especial.
En el servicio, debería ver el resultado siguiente:
Press ENTER to exit.
Dangerous wind detected! Reported speed (90) is greater than 64 kph.
Dangerous wind detected! Reported speed (70) is greater than 64 kph.
5 wind speed reports have been received.
Para configurar, compilar y ejecutar el ejemplo
Instale ASP.NET 4.0 con el comando siguiente.
%windir%\Microsoft.NET\Framework\v4.0.XXXXX\aspnet_regiis.exe /i /enableAsegúrese de que ha realizado el procedimiento de instalación única para los ejemplos de Windows Communication Foundation.
Para compilar la solución, siga las instrucciones que se indican en Compilación de los ejemplos de Windows Communication Foundation.
Para ejecutar el ejemplo en una configuración de una máquina única o entre máquinas, siga las instrucciones de Ejecución de los ejemplos de Windows Communication Foundation.
Ejecute Service.exe primero, luego ejecute Client.exe y observe ambas ventanas de consola para obtener la salida.