Compartir a través de


Tutorial: Modificar el mensaje SOAP con extensiones SOAP

Las extensiones SOAP se pueden insertar en la canalización de procesamiento de mensajes SOAP de .NET Framework para modificar o inspeccionar una solicitud SOAP o un mensaje de respuesta mientras se serializa o deserializa, en el servicio web o en el cliente. En este tema paso a paso se muestra cómo generar y ejecutar una extensión SOAP. Para obtener una idea de cómo funcionan las extensiones SOAP, y el orden en que se llama a los métodos de extensión SOAP en la canalización de procesamiento de mensajes, consulte Modificación de mensajes SOAP con extensiones SOAP.

En este tutorial aprenderá a:

  • Derivar una clase de SoapExtension.

  • Guardar las referencias a los objetos Stream que representan a futuros mensajes SOAP antes y después de que la extensión SOAP haya llevado a cabo su procesamiento.

  • Inicializar los datos específicos de la extensión SOAP.

  • Procesar los mensajes SOAP durante las fases o los SoapMessageStage aplicables.

Configurar la extensión SOAP para ejecutar con métodos de servicios web específicos.

Requisitos previos

Derivar una clase de SoapExtension.

La clase que se deriva de SoapExtension es la clase que ejecuta la funcionalidad de la extensión SOAP. Es decir, si la extensión SOAP es una extensión SOAP de cifrado, a continuación, la clase que se deriva de la clase SoapExtension ejecuta el cifrado y el descifrado correspondiente.

Guardar las referencias a objetos de secuencia que representan futuros mensajes SOAP

Para modificar un mensaje SOAP, necesita obtener una referencia a la secuencia que se puede usar para obtener el contenido de futuros mensajes SOAP. Su única oportunidad de obtener esta referencia es invalidar el método ChainStream.

Para guardar las referencias a objetos de secuencia que representan futuros mensajes SOAP

  1. Invalide el método ChainStream.

    El método ChainStream tiene la siguiente firma:

    public virtual Stream ChainStream(Stream stream)
    
    Public Overridable Function ChainStream(ByVal stream As Stream) As Stream
    
  2. Dentro de la implementación de ChainStream, asigne la instancia Stream pasada como un parámetro.

    Una referencia a Stream se pasa en ChainStream una sola vez, antes de cualquier SoapMessageStage. Stream hace referencia al XML del mensaje SOAP después de que las extensiones SOAP de menor prioridad hayan ejecutado y realizado sus cambios en el mensaje SOAP (consulte Configurar la extensión SOAP para ejecutarla con métodos de servicios web para obtener detalles sobre las prioridades de la extensión SOAP). Una extensión SOAP debería asignar esta referencia a una variable miembro para el acceso posterior durante SoapMessageStage, cuando una extensión SOAP inspecciona o modifica el mensaje SOAP.

    Stream pasado en ChainStream, sin embargo, no es la Stream que una extensión SOAP debería modificar.

  3. Dentro de la implementación ChainStream, cree instancias de un nuevo Stream, guarde una referencia a él en una variable miembro privada y devuelva la referencia.

    En el siguiente ejemplo de código se muestra una implementación común del método ChainStream.

Para ver un ejemplo de una implementación común del método ChainStream, consulte Cómo: Implementar el método ChainStream para guardar referencias en objetos de secuencia.

Inicializar los datos específicos de la extensión SOAP

La clase que se deriva de SoapExtension tiene dos métodos para inicializar datos: GetInitializer y Initialize.

El momento en el que la infraestructura de ASP.NET llama al método GetInitializer y qué parámetros se pasan al método dependen de la configuración de la extensión SOAP. (Consulte Modificación de mensajes SOAP con extensiones SOAP y Configurar la extensión SOAP para ejecutar con métodos de servicios web específicos.

Para inicializar los datos cuando la extensión SOAP se configura usando un atributo

  1. Implemente el método GetInitializer usando la siguiente firma:

    public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute)
    
    Public Overloads Overrides Function GetInitializer(methodInfo As _
       LogicalMethodInfo, attribute As SoapExtensionAttribute) As Object
    

    LogicalMethodInfo proporciona detalles del prototipo sobre el método de servicios web, como el número de parámetros y sus tipos de datos.

  2. Si es necesario, llame al método Initialize, pasando el objeto devuelto por GetInitializer. Para muchas implementaciones de SoapExtension, el método Initialize puede quedar vacío.

Para inicializar los datos cuando la extensión SOAP se configura en un archivo de configuración

  1. Implemente el método GetInitializer con la siguiente firma:

    public override object GetInitializer(Type WebServiceType)
    
    Public Overloads Overrides Function GetInitializer(WebServiceType As Type) As Object
    

    El parámetro Type es el tipo de la clase de la que implementa el servicio web.

  2. Si es necesario, llame al método Initialize, pasándole el objeto devuelto por GetInitializer. Para muchas implementaciones de SoapExtension, el método Initialize puede quedar vacío.

Para ver un ejemplo de cómo inicializar los datos almacenados en memoria caché cuando se configura una extensión SOAP, vea Cómo: Inicializar datos almacenados en memoria caché cuando se configura una extensión SOAP.

Procesar los mensajes SOAP

En la clase derivada de SoapExtension, la parte básica de la implementación es el método ProcessMessage. ASP.NET llama varias veces a este método en cada una de las fases definidas en la enumeración SoapMessageStage.

Para procesar mensajes SOAP

  • Implemente el método ProcessMessage abstracto.

    La siguiente implementación del método ProcessMessage realiza el seguimiento de una llamada a un servicio web. Durante el seguimiento, si SoapMessageStage indica los parámetros se han serializado en XML, el código XML se escribe en un archivo.

    public override void ProcessMessage(SoapMessage message) 
    {
       switch (message.Stage) 
       {
       case SoapMessageStage.BeforeSerialize:
           break;
       case SoapMessageStage.AfterSerialize:
           // Write the SOAP message out to a file.
           WriteOutput( message );
           break;
       case SoapMessageStage.BeforeDeserialize:
           // Write the SOAP message out to a file.
           WriteInput( message );
           break;
       case SoapMessageStage.AfterDeserialize:
           break;
       default:
           throw new Exception("invalid stage");
       }
    }
    
    Public Overrides Sub ProcessMessage(message As SoapMessage)
        Select Case message.Stage
          Case SoapMessageStage.BeforeSerialize
          Case SoapMessageStage.AfterSerialize
            ' Write the SOAP message out to a file.
            WriteOutput(message)
          Case SoapMessageStage.BeforeDeserialize
            ' Write the SOAP messae out to a file.
            WriteInput(message)
          Case SoapMessageStage.AfterDeserialize
          Case Else
            Throw New Exception("invalid stage")
        End Select
    End Sub
    

Configurar la extensión SOAP para ejecutarla con métodos de servicios web específicos.

Una extensión SOAP se puede configurar para ejecutarse, utilizando un atributo personalizado o modificando un archivo de configuración. Se aplica un atributo personalizado a un método de servicios web. Cuando se usa un archivo de configuración, las extensiones SOAP se ejecutan con todos los servicios web dentro del ámbito del archivo de configuración. Para obtener detalles sobre cómo funcionan los archivos de configuración, vea Configuring Applications.

Para configurar una extensión SOAP usando un atributo personalizado

  1. Derivar una clase de SoapExtensionAttribute.

  2. Implemente dos propiedades de SoapExtensionAttribute: ExtensionType y Priority. Una extensión SOAP debería devolver el tipo de la extensión SOAP en la propiedad ExtensionType. La propiedad Priority representa la prioridad relativa de la extensión SOAP, como se explica en Aplicar el grupo de prioridades en la modificación de mensajes SOAP usando extensiones SOAP.

  3. Aplique el atributo personalizado a cada método de servicios web con el que desea ejecutar la extensión SOAP.

Para configurar una extensión SOAP en un archivo de configuración

  1. Si aún no existe, agregue un elemento XML soapExtensionTypes a la sección webServices del archivo App.config o archivo Web.config adecuado.

  2. Dentro del elemento XML soapExtensionTypes, agregue un elemento XML add para cada extensión SOAP que desea ejecutar con cada servicio web dentro del ámbito del archivo de configuración.

    El elemento XML add tiene las siguientes propiedades.

    • type: especifica el tipo de la extensión SOAP y el ensamblado en el que reside.

    • priority: especifica la prioridad relativa de la extensión SOAP dentro de su grupo.

    • Group: especifica el grupo del que es miembro una extensión SOAP.

Consulte también

Tareas

Cómo: Implementar una extensión SOAP
Cómo: Inicializar datos almacenados en memoria caché cuando se configura una extensión SOAP
Cómo: Implementar el método ChainStream para guardar referencias en objetos de secuencia

Referencia

SoapExtension
SoapExtensionAttribute
SoapMessageStage
LogicalMethodInfo

Conceptos

Modificación de mensajes SOAP con extensiones SOAP
Anatomía de la duración de un servicio web XML
Generar clientes de servicios web XML

Otros recursos

Configuring Applications

Copyright © 2007 Microsoft Corporation. Reservados todos los derechos.