Condividi tramite


Procedura dettagliata: Modifica di messaggi SOAP utilizzando estensioni SOAP

Le estensioni SOAP possono essere inserite nei messaggi SOAP di .NET Framework che elaborano pipeline per modificare o controllare una richiesta SOAP o un messaggio di risposta che si sta serializzando o deserializzando sul servizio Web o sul client. Questo argomento espone in modo dettagliato come compilare ed eseguire un'estensione SOAP. Per farsi un'idea di come funzionano le estensioni SOAP, così come dell'ordine in cui i metodi delle estensioni SOAP vengano chiamati nel messaggio che elabora la pipeline, vedere Modifica di messaggi SOAP utilizzando estensioni SOAP.

In particolare, vengono illustrate le seguenti operazioni:

  • Derivare una classe da SoapExtension.

  • Salvare i riferimenti agli oggetti Stream che rappresentano messaggi SOAP futuri prima e dopo che l'estensione SOAP ha eseguito l'elaborazione.

  • Inizializzare i dati specifici dell'estensione SOAP.

  • Elaborare i messaggi SOAP durante la o le fasi SoapMessageStage.

Configurare l'estensione SOAP di modo che sia in esecuzione con i metodi specifici del servizio Web.

Prerequisiti

Derivare una classe da SoapExtension.

La classe che deriva da SoapExtension è la classe responsabile della funzionalità dell'estensione SOAP. Ovvero, se l'estensione SOAP è un'estensione SOAP di crittografia, la classe che deriva dalla classe SoapExtension esegue la crittografia e la corrispondente decifrazione.

Salvare riferimenti a oggetti flusso che rappresentano messaggi SOAP futuri

Per modificare un messaggio SOAP, è necessario ottenere un riferimento al flusso che può essere utilizzato per ottenere il contenuto di messaggi SOAP futuri. Il solo modo per ottenere questo riferimento è eseguire l'override del metodo ChainStream.

Per salvare riferimenti a oggetti flusso che rappresentano messaggi SOAP futuri

  1. Eseguire l'override del metodo ChainStream.

    Il metodo ChainStream presenta in genere la firma seguente:

    public virtual Stream ChainStream(Stream stream)
    
    Public Overridable Function ChainStream(ByVal stream As Stream) As Stream
    
  2. All'interno dell'implementazione ChainStream, assegnare l'istanza Stream passata come parametro.

    Un riferimento a una proprietà Stream è passato una sola volta in un metodo ChainStream, prima di qualsiasi classeSoapMessageStage. La proprietà Stream si riferisce all'XML del messaggio SOAP dopo che estensioni SOAP di priorità più bassa (vedere Configurare l'estensione SOAP di modo che sia in esecuzione con i metodi del servizio Web per maggiori informazioni sulle priorità delle estensioni SOAP) hanno eseguito ed effettuato modifiche al messaggio SOAP. Un'estensione SOAP deve assegnare questo riferimento a una variabile membro per un successivo accesso durante la fase SoapMessageStage, quando un'estensione SOAP controlla o modifica il messaggio SOAP.

    Tuttavia, la proprietà Stream passata in un metodo ChainStreamnon è una proprietà Stream che un'estensione SOAP debba modificare.

  3. All'interno dell'implementazione di ChainStream, creare un'istanza di una nuova proprietà Stream, salvarne un riferimento in una variabile membro privata e restituire il riferimento.

    Nell'esempio seguente viene illustrata un'implementazione comune del metodo ChainStream.

Per un esempio che illustri un'implementazione comune del metodoChainStream, vedere Procedura: Implementare il metodo ChainStream per salvare riferimenti in oggetti Stream.

Inizializzare i dati specifici dell'estensione SOAP.

La classe che deriva da SoapExtension ha due metodi per l'inizializzazione di dati, GetInitializer e Initialize.

Il momento in cui l'infrastruttura diASP.NET chiama il metodo GetInitializer e quali parametri vengono passati al metodo, dipendono dalla configurazione dell'estensione SOAP, secondo le modalità seguenti: (Vedere Modifica dei messaggi SOAP tramite le estensioni SOAP e Configurare l'estensione SOAP di modo che sia in esecuzione con i metodi del servizio Web.)

Per inizializzare dati quando l'estensione SOAP viene configurata utilizzando un attributo

  1. Implementare il metodo GetInitializerutilizzando la firma seguente:

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

    Il metodo LogicalMethodInfo fornisce informazioni sul prototipo del metodo del servizio Web, ad esempio il numero di parametri e i tipi di dati.

  2. Se necessario, chiamare il metodo Initialize che passa l'oggetto restituito da GetInitializer. Per molte implementazioni SoapExtension, il metodo Initialize può essere lasciato vuoto.

Per inizializzare i dati quando l'estensione SOAP viene configurata in un file di configurazione

  1. Implementare il metodo GetInitializerutilizzando la firma seguente:

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

    Il parametro Type è il tipo di classe della classe che implementa il servizio Web.

  2. Se necessario, chiamare il metodo Initialize che passa l'oggetto restituito da GetInitializer. Per molte implementazioni SoapExtension, il metodo Initialize può essere lasciato vuoto.

Per un esempio su come inizializzare dati memorizzati nella cache quando viene configurata un'estensione SOAP, vedere Procedura: Inizializzare i dati memorizzati nella cache quando è configurata un'estensione SOAP.

Elaborazione di messaggi SOAP

Nella classe derivata da SoapExtension, la parte principale dell'implementazione è il metodo ProcessMessage. Questo metodo viene chiamato molte volte da ASP.NET in ognuna delle fasi definite nell'enumerazione SoapMessageStage.

Per elaborare messaggi SOAP

  • Implementare il metodo astratto ProcessMessage.

    L'implementazione seguente del metodo ProcessMessage analizza una chiamata a un servizio Web. Durante l'analisi, se SoapMessageStage indica che i parametri sono stati serializzati in XML, l'XML viene trascritto in un file.

    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
    

Configurare l'estensione SOAP di modo che sia in esecuzione con i metodi del servizio Web

Un'estensione SOAP può essere configurata per l'esecuzione utilizzando un attributo personalizzato o modificando un file di configurazione. Un attributo personalizzato viene applicato a un metodo del servizio Web. Quando viene utilizzato un file di configurazione, l'estensione SOAP viene eseguita con tutti i servizi Web XML all'interno dell'ambito del file di configurazione. Per informazioni dettagliate sulla configurazione dei file, vedere Configuring Applications.

Per configurare un'estensione SOAP utilizzando un attributo personalizzato

  1. Derivare una classe da SoapExtensionAttribute.

  2. Implementare due proprietà di SoapExtensionAttribute: ExtensionType e Priority. Un'estensione SOAP deve restituire il tipo dell'estensione SOAP nella proprietà ExtensionType. La proprietà Priority rappresenta la priorità relativa dell'estensione SOAP, come spiegato in Applicare priorità gruppo nella modifica di messaggi SOAP mediante estensioni SOAP.

  3. Applicare l'attributo personalizzato a ogni metodo del servizio Web con cui si desidera che l'estensione SOAP venga eseguita.

Per configurare un'estensione SOAP in un file di configurazione

  1. Se non è già presente, aggiungere un elemento XML soapExtensionTypes alla sezione webServices del file App.config o Web.config interessato.

  2. All'interno dell'elemento XML soapExtensionTypes aggiungere un elemento XMLadd per ogni estensione SOAP che si desidera sia in esecuzione con ogni servizio Web nell'ambito del file di configurazione.

    L'elemento XML add ha le seguenti proprietà:

    • type: specifica il tipo dell'estensione SOAP e l'assembly nel quale risiede.

    • priority: specifica la priorità relativa dell'estensione SOAP all'interno del gruppo.

    • Group: specifica il gruppo di cui fa parte l'estensione SOAP.

Vedere anche

Attività

Procedura: Implementare un'estensione SOAP
Procedura: Inizializzare i dati memorizzati nella cache quando è configurata un'estensione SOAP
Procedura: Implementare il metodo ChainStream per salvare riferimenti in oggetti Stream

Riferimenti

SoapExtension
SoapExtensionAttribute
SoapMessageStage
LogicalMethodInfo

Concetti

Modifica di messaggi SOAP utilizzando estensioni SOAP
Anatomia del ciclo di vita di un servizio Web XML
Creazione di client dei servizi Web XML

Altre risorse

Configuring Applications

Footer image

Copyright © 2007 Microsoft Corporation. Tutti i diritti riservati.