Share via


チュートリアル : SOAP 拡張機能を使用した SOAP メッセージの変更

このトピックの対象は、レガシ テクノロジに特定されています。XML Web サービスと XML Web サービス クライアントは以下を使用して作成してください。 Windows Communication Foundation.

Web サービスまたは Web クライアント上で、SOAP 拡張機能を .NET Framework の SOAP メッセージ処理パイプラインに挿入し、SOAP 要求メッセージまたは SOAP 応答メッセージがシリアル化または逆シリアル化されるときに、これらのメッセージを変更または検査できます。ここでは、SOAP 拡張機能を構築して実行する方法について、手順を追って説明します。SOAP 拡張機能の図と、メッセージ処理パイプラインで SOAP 拡張機能メソッドが呼び出される順序の詳細については、「SOAP 拡張機能を使用した SOAP メッセージの変更」を参照してください。

このチュートリアルでは、次の作業を行う方法について説明します。

  • SoapExtension の派生クラスを作成します。

  • SOAP 拡張機能の処理が完了する前と後に、将来の SOAP メッセージを表す Stream オブジェクトへの参照を保存します。

  • SOAP 拡張機能に固有のデータを初期化します。

  • SoapMessageStage の 1 つまたは複数の適切な段階で、SOAP メッセージを処理します。

特定の Web サービス メソッドで SOAP 拡張機能を実行するように構成します。

前提条件

SoapExtension の派生クラスを作成します。

SoapExtension の派生クラスは、SOAP 拡張機能を実行するクラスです。つまり、たとえば SOAP 拡張機能が暗号化 SOAP 拡張機能である場合、SoapExtension クラスの派生クラスは暗号化と、対応する復号化を実行します。

将来の SOAP メッセージを表すストリーム オブジェクトへの参照の保存

SOAP メッセージを変更するには、将来の SOAP メッセージの内容を取得するために使用するストリームへの参照を取得する必要があります。この参照を取得するには、ChainStream メソッドをオーバーライドすることが唯一の方法です。

将来の SOAP メッセージを表すストリーム オブジェクトへの参照を保存するには

  1. ChainStream メソッドをオーバーライドします。

    ChainStream メソッドのシグネチャは次のとおりです。

    public virtual Stream ChainStream(Stream stream)
    
    Public Overridable Function ChainStream(ByVal stream As Stream) As Stream
    
  2. ChainStream の実装内で、パラメーターとして渡される Stream インスタンスを割り当てます。

    Stream への参照は、SoapMessageStage の前に一度 ChainStream に渡されます。この Stream は、優先順位の低い SOAP 拡張機能の実行によって変更された後の SOAP メッセージの XML を参照します。SOAP 拡張機能の優先順位の詳細については、「Web サービス メソッドで実行する SOAP 拡張機能の構成」を参照してください。SOAP 拡張機能は、後から SOAP 拡張機能が SoapMessageStage で SOAP メッセージを調べたり変更するときに備えて、この参照をメンバー変数に割り当てます。

    ChainStream に渡される Stream は、SOAP 拡張機能が変更する Stream ではありません。

  3. ChainStream の実装内で、新しい Stream をインスタンス化し、これへの参照をプライベート メンバー変数に保存して参照を返します。

    ChainStream メソッドの一般的な実装例を次に示します。

ChainStream メソッドの一般的な実装例については、「方法 : ストリーム オブジェクトへの参照を保存するための ChainStream メソッドを実装する」を参照してください。

SOAP 拡張機能の固有データの初期化

SoapExtension の派生クラスにはデータを初期化する GetInitializerInitialize の 2 つのメソッドがあります。

ASP.NET インフラストラクチャが GetInitializer メソッドを呼び出すタイミングと、メソッドに渡されるパラメーターは、SOAP 拡張機能の構成方法によって異なります。「SOAP 拡張機能を使用した SOAP メッセージの変更」および「Web サービス メソッドで実行する SOAP 拡張機能の構成」を参照してください。

SOAP 拡張機能が属性を使用して構成されている場合にデータを初期化するには

  1. 次のシグネチャを使って、GetInitializer メソッドを実装します。

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

    LogicalMethodInfo では、パラメーターの数やデータ型などの Web サービス メソッドに関するプロトタイプの詳細が示されます。

  2. 必要に応じて、Initialize メソッドを呼び出し、GetInitializer から返されるオブジェクトを渡します。多くの SoapExtension の実装では、Initialize メソッドを空のままにすることができます。

SOAP 拡張機能が構成ファイルで構成されている場合にデータを初期化するには

  1. 次のシグネチャを使って、GetInitializer メソッドを実装します。

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

    Type パラメーターは、Web サービスを実装するクラスの型です。

  2. 必要に応じて、Initialize メソッドを呼び出し、GetInitializer から返されるオブジェクトを渡します。多くの SoapExtension の実装では、Initialize メソッドを空のままにすることができます。

SOAP 拡張機能の構成時にキャッシュされたデータを初期化する方法の例については、「方法 : SOAP 拡張機能の構成時にキャッシュされたデータを初期化する」を参照してください。

SOAP メッセージの処理

SoapExtension の派生クラスでは、実装の中核部分は ProcessMessage メソッドです。このメソッドは、SoapMessageStage 列挙体で定義された段階ごとに、ASP.NET により数回呼び出されます。

SOAP メッセージを処理するには

  • 抽象メソッドである ProcessMessage を実装します。

    次の ProcessMessage メソッドの実装は、Web サービスの呼び出しをトレースします。トレース中に、SoapMessageStage の値から、パラメーターは XML にシリアル化された後だと判断される場合は、XML をファイルに書き込みます。

    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
    

Web サービス メソッドで実行する SOAP 拡張機能の構成

SOAP 拡張機能は、カスタム属性を使用して実行するように構成したり、構成ファイルを変更することで実行するように構成できます。カスタム属性は Web サービス メソッドに適用されます。構成ファイルを使用する場合は、構成ファイルのスコープ内のすべての Web サービスで SOAP 拡張機能が実行されます。構成ファイルのしくみの詳細については、「Configuring Applications」を参照してください。

カスタム属性を使用して SOAP 拡張機能を構成するには

  1. SoapExtensionAttribute の派生クラスを作成します。

  2. SoapExtensionAttribute の 2 つのプロパティである ExtensionTypePriority を実装します。SOAP 拡張機能は、ExtensionType プロパティで SOAP 拡張機能の型を返します。Priority プロパティは、SOAP 拡張機能の相対的な優先順位を表します。詳細については、「SOAP 拡張機能を使用した SOAP メッセージの変更」の「優先順位グループの適用」を参照してください。

  3. SOAP 拡張機能を実行する各 Web サービス メソッドにカスタム属性を適用します。

構成ファイルで SOAP 拡張機能を構成するには

  1. soapExtensionTypes XML 要素が存在しない場合は、適切な App.config ファイルまたは Web.config ファイルの webServices セクションにこの要素を追加します。

  2. soapExtensionTypes XML 要素内で、構成ファイルのスコープ内のすべての Web サービスで実行する各 SOAP 拡張機能に add XML 要素を追加します。

    add XML 要素には、次のプロパティがあります。

    • type: SOAP 拡張機能の型およびその型が含まれるアセンブリを指定します。

    • priority: SOAP 拡張機能のグループ内での相対的な優先順位を指定します。

    • Group: SOAP 拡張機能がメンバーとなるグループを指定します。

参照

処理手順

方法 : SOAP 拡張機能を実装する
方法 : SOAP 拡張機能の構成時にキャッシュされたデータを初期化する
方法 : ストリーム オブジェクトへの参照を保存するための ChainStream メソッドを実装する

リファレンス

SoapExtension
SoapExtensionAttribute
SoapMessageStage
LogicalMethodInfo

概念

SOAP 拡張機能を使用した SOAP メッセージの変更
XML Web サービスの有効期間の構造
XML Web サービス クライアントの作成

その他のリソース

Configuring Applications