Sdílet prostřednictvím


Exemplarische Vorgehensweise: Ändern der SOAP-Nachricht mit SOAP-Erweiterungen

SOAP-Erweiterungen können in die Verarbeitungspipeline für SOAP-Nachrichten von .NET Framework eingefügt werden, um eine SOAP-Anforderung oder eine Antwortnachricht im Webdienst oder auf dem Client zu überprüfen, während sie serialisiert oder deserialisiert wird. In diesem Thema wird schrittweise gezeigt, wie eine SOAP-Erweiterung erstellt und ausgeführt wird. Eine bildliche Darstellung der Funktionsweise von SOAP-Erweiterungen sowie der Reihenfolge, in der SOAP-Erweiterungsmethoden in der Nachrichtenverarbeitungspipeline aufgerufen werden, finden Sie unter SOAP-Nachrichtenänderung mit SOAP-Erweiterungen.

In dieser exemplarischen Vorgehensweise werden folgende Vorgänge vorgestellt:

  • Leiten Sie eine Klasse von SoapExtension ab.

  • Speichern Sie Verweise auf die Stream-Objekte, die zukünftige SOAP-Nachrichten vor und nach der Verarbeitung durch die SOAP-Erweiterung darstellen.

  • Initialisieren Sie Daten, die für die SOAP-Erweiterung spezifisch sind.

  • Verarbeiten Sie die SOAP-Nachrichten während der anwendbaren SoapMessageStage oder der Phasen.

Konfigurieren Sie die SOAP-Erweiterung für die Ausführung mit bestimmten Webdienstmethoden.

Voraussetzungen

Leiten Sie eine Klasse von SoapExtension ab.

Die von SoapExtension abgeleitete Klasse, ist die Klasse, durch die die Funktionalität der SOAP-Erweiterung ausgeführt wird. Wenn eine SOAP-Erweiterung beispielsweise zur Verschlüsselung dient, werden Verschlüsselung und Entschlüsselung von der Klasse ausgeführt, die von der SoapExtension-Klasse abgeleitet wurde.

Speichern von Verweisen auf Streamobjekte, die zukünftige SOAP-Nachrichten darstellen

Zum Ändern einer SOAP-Nachricht müssen Sie einen Verweis auf den Stream abrufen, der zum Abrufen des Inhalts zukünftiger SOAP-Nachrichten verwendet werden kann. Die einzige Möglichkeit, diesen Verweis zu erhalten, besteht im Überschreiben der ChainStream-Methode.

So speichern Sie Verweisen auf Streamobjekte, die zukünftige SOAP-Nachrichten darstellen

  1. Überschreiben Sie die ChainStream-Methode.

    Die ChainStream-Methode hat die folgende Signatur:

    public virtual Stream ChainStream(Stream stream)
    
    Public Overridable Function ChainStream(ByVal stream As Stream) As Stream
    
  2. Weisen Sie innerhalb der ChainStream-Implementierung die als Parameter übergebene Stream-Instanz zu.

    Ein Verweis auf Stream wird einmal an ChainStream übergeben und zwar vor eventuellen Vorkommen von SoapMessageStage. Dieses Stream-Objekt verweist auf den XML-Code der SOAP-Nachricht, nachdem SOAP-Erweiterungen mit niedrigerer Priorität (Details zu SOAP-Erweiterungseigenschaften finden Sie unter "Konfigurieren der SOAP-Erweiterung für die Ausführung mit Webdienstmethoden") ausgeführt und die erforderlichen Änderungen an der SOAP-Nachricht vorgenommen wurden. Wenn eine SOAP-Erweiterung eine SOAP-Nachricht überprüft oder ändert, sollte dieser Verweis von der SOAP-Erweiterung einer Membervariablen zugewiesen werden, damit später in SoapMessageStage darauf zugegriffen werden kann.

    Das Stream-Objekt, das an ChainStream übergeben wird, ist jedoch nicht das Stream-Objekt, das von der SOAP-Erweiterung geändert werden sollte.

  3. Instanziieren Sie innerhalb der ChainStream-Implementierung ein neues Stream-Objekt, speichern Sie in einer privaten Membervariablen einen Verweis darauf, und geben Sie den Verweis zurück.

    Im folgenden Beispiel wird eine gängige Implementierung der ChainStream-Methode veranschaulicht.

Ein Beispiel für eine allgemeine Implementierung der ChainStream-Methode finden Sie unter Gewusst wie: Implementieren der ChainStream-Methode zum Speichern von Verweisen auf Streamobjekte.

Initialisieren spezifischer Daten der SOAP-Erweiterung

Die von SoapExtension abgeleitete Klasse verfügt über zwei Methoden zum Initialisieren von Daten: GetInitializer und Initialize.

Zu welchem Zeitpunkt die ASP.NET-Infrastruktur die GetInitializer-Methode aufruft und welche Parameter der Methode übergeben werden, hängt von der Konfiguration der SOAP-Erweiterung ab: (Siehe "Ändern von SOAP-Nachrichten mithilfe von SOAP-Erweiterungen" und "Konfigurieren der SOAP-Erweiterung für die Ausführung mit Webdienstmethoden".)

So initialisieren Sie Daten, wenn die SOAP-Erweiterung mithilfe eines Attributs konfiguriert wird

  1. Implementieren Sie die GetInitializer-Methode mit der folgenden Signatur:

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

    Die LogicalMethodInfo-Klasse stellt Prototypdetails zur Webdienstmethode bereit, z. B. die Anzahl der Parameter und deren Datentypen.

  2. Rufen Sie gegebenenfalls die Initialize-Methode auf, und übergeben Sie dabei das von GetInitializer zurückgegebene Objekt. Für viele SoapExtension-Implementierungen kann die Initialize-Methode leer bleiben.

So initialisieren Sie Daten, wenn die SOAP-Erweiterung in einer Konfigurationsdatei konfiguriert wird

  1. Implementieren Sie die GetInitializer-Methode mit der folgenden Signatur:

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

    Der Type-Parameter ist der Typ der Klasse, die den Webdienst implementiert.

  2. Rufen Sie gegebenenfalls die Initialize-Methode auf, und übergeben Sie dabei das von GetInitializer zurückgegebene Objekt. Für viele SoapExtension-Implementierungen kann die Initialize-Methode leer bleiben.

Ein Beispiel für das Initialisieren zwischengespeicherter Daten, wenn eine SOAP-Erweiterung konfiguriert ist, finden Sie unter Gewusst wie: Initialisieren zwischengespeicherter Daten wenn eine SOAP-Erweiterung konfiguriert ist.

Verarbeiten der SOAP-Nachrichten

In der von SoapExtension abgeleiteten Klasse stellt die ProcessMessage-Methode das Kernstück der Implementierung dar. Diese Methode wird in jeder der durch die SoapMessageStage-Enumeration definierten Phasen mehrmals von ASP.NET aufgerufen.

So verarbeiten Sie SOAP-Nachrichten

  • Implementieren Sie die abstrakte ProcessMessage-Methode.

    Die folgende Implementierung der ProcessMessage-Methode verfolgt den Ablauf eines Aufrufs für einen Webdienst. Wenn während der Ablaufverfolgung SoapMessageStage angibt, dass die Parameters in XML serialisiert wurden, wird der XML-Code in eine Datei geschrieben.

    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
    

Konfigurieren der SOAP-Erweiterung für die Ausführung mit Webdienstmethoden

Eine SOAP-Erweiterung kann so konfiguriert werden, dass sie mithilfe eines benutzerdefinierten Attributs oder durch Änderung einer Konfigurationsdatei ausgeführt wird. Ein benutzerdefiniertes Attribut wird auf eine Webdienstmethode angewendet. Wenn eine Konfigurationsdatei verwendet wird, wird die SOAP-Erweiterung mit allen Webdiensten ausgeführt, die im Gültigkeitsbereich der Konfigurationsdatei liegen. Nähere Informationen zur Funktionsweise der Konfigurationsdateien finden Sie unter Configuring Applications.

So konfigurieren Sie eine SOAP-Erweiterung mithilfe eines benutzerdefinierten Attributs

  1. Leiten Sie eine Klasse von SoapExtensionAttribute ab.

  2. Implementieren Sie zwei Eigenschaften von SoapExtensionAttribute: ExtensionType und Priority. Der Typ der SOAP-Erweiterung sollte von einer SOAP-Erweiterung in der ExtensionType-Eigenschaft zurückgegeben werden. Die Priority-Eigenschaft stellt die relative Priorität der SOAP-Erweiterung gemäß der Erläuterung in "Anwenden der Prioritätsgruppe" in "Ändern von SOAP-Nachrichten mithilfe von SOAP-Erweiterungen" dar.

  3. Wenden Sie das benutzerdefinierte Attribut auf jede Webdienstmethode an, mit der die SOAP-Erweiterung ausgeführt werden soll.

So konfigurieren Sie eine SOAP-Erweiterung in einer Konfigurationsdatei

  1. Fügen Sie gegebenenfalls dem Abschnitt webServices der entsprechenden Datei App.config oder Web.config ein soapExtensionTypes-XML-Element hinzu.

  2. Fügen Sie innerhalb des soapExtensionTypes-XML-Elements für jede SOAP-Erweiterung, die mit den einzelnen Webdiensten im Gültigkeitsbereich der Konfigurationsdatei ausgeführt werden soll, ein add-XML-Element hinzu.

    Das add-XML-Element verfügt über die folgenden Eigenschaften.

    • type: Gibt den Typ der SOAP-Erweiterung und die Assembly an, in der sie sich befindet.

    • priority: Gibt die relative Priorität der SOAP-Erweiterung innerhalb ihrer Gruppe an.

    • Group: Gibt die Gruppe, der die SOAP-Erweiterung als Member angehört, an.

Siehe auch

Aufgaben

Gewusst wie: Implementieren einer SOAP-Erweiterung
Gewusst wie: Initialisieren zwischengespeicherter Daten wenn eine SOAP-Erweiterung konfiguriert ist
Gewusst wie: Implementieren der ChainStream-Methode zum Speichern von Verweisen auf Streamobjekte

Referenz

SoapExtension
SoapExtensionAttribute
SoapMessageStage
LogicalMethodInfo

Konzepte

SOAP-Nachrichtenänderung mit SOAP-Erweiterungen
Aufbau der Lebensdauer von XML-Webdiensten
Erstellen von XML-Webdienstclients

Weitere Ressourcen

Configuring Applications

Footer image

Copyright © 2007 by Microsoft Corporation. Alle Rechte vorbehalten.