Skip to main content

 

SOAP

 

OutSystems

SOAP Extensibilityのユースケースの例

このドキュメントでは、利用中のSOAP Webサービスに関する以下の拡張シナリオに対処する方法を説明します。

  • 実行時にサービスのエンドポイントを変更する。
  • WS-Addressing要素をSOAPリクエストに追加する。
  • SOAPヘッダーを追加する。
  • HTTPヘッダーを追加する。

一般的な手順

このトピックで示す拡張シナリオを実装するための一般的なワークフローは以下のとおりです。

1. OutSystemsの拡張機能の設定
Integration Studioで新しい拡張機能を作成し、必要なアクションを定義します。
2. .NETコードの実装
拡張機能のソースコードを編集するために、[Edit Source Code .NET]をクリックしてVisual Studio .NETを開きます。
プロジェクトのプロパティを編集して、プロジェクトのターゲットフレームワークを「.NET Framework 4.6.1」に設定します。
必要なアセンブリ参照を追加します。ほとんどの場合、OutSystems.SOAP.APIへの参照を追加する必要があります。
引き続きVisual Studioで、SOAP Extensibility APIから必要な機能を使用してアクションのロジックを実装します。終了したら、Visual Studioを閉じます。
Integration Studioで、拡張機能をパブリッシュします。
3.拡張機能を使用する
Service Studioで、必要なアクションへの依存関係を拡張機能から追加します。
要素ツリーでSOAP Webサービス要素を選択し、OnBeforeRequestプロパティに新しいSOAPコールバックを作成します(これは「OnBeforeRequestAdvanced」という名前になります)。
コールバックフローを開き、ユースケースに応じて目的の拡張機能のアクションをフローにドラッグします。

拡張ユースケース

実行時にサービスのエンドポイントを変更する

このシナリオでは、実行時にSOAP Webサービスのエンドポイントを変更するためのサポートを追加します。

以下の手順を実行します。

1. Integration Studioで拡張機能を作成し、エンドポイントの変更を処理するアクションを定義します。
以下の例では、Text型の「Uri」入力パラメータを持つ「ChangeEndpoint」というアクションをIntegration Studioで定義しています。

2. [Edit Source Code .NET]をクリックします。プロジェクトのターゲットフレームワークを設定し、アセンブリOutSystems.SOAP.APIおよびSystem.ServiceModelへの参照を追加します。
以下のコードを入力し、Integration Studioで作成されたMssChangeEndpoint関数プレースホルダを置き換えます。

// required 'using' statements at the beginning of the file
using System.ServiceModel;
using OutSystems.SOAP.API;

/* ...*/

// replace the 'MssChangeEndpoint' function placeholder with the following code
public void MssChangeEndpoint(string ssUri) {
    var client = SoapRequest.GetCurrentClient();
    client.Endpoint.Address = new EndpointAddress(ssUri);
}

3. Visual Studio .NETを停止し、Integration Studioに戻ります。Integration Studioで、[1-Click Publish]ツールバーアイコンをクリックするか、またはF5キーを押して、拡張機能をパブリッシュします。

4. Service Studioで、アプリケーションモジュールに拡張機能の「ChangeEndpoint」アクションへの参照を追加します。

5. SOAP WebサービスのSOAPコールバックフローで、「ChangeEndpoint」アクションをフローにドラッグし、目的のWebサービスのエンドポイント値を「Uri」入力パラメータに入力します。

6. アプリケーションモジュールをパブリッシュしてアプリケーションをテストし、エンドポイントが実行時に正しく設定されることを確認します。

WS-Addressing要素をSOAPリクエストに追加する

このシナリオでは、WS-Addressing関連の要素をリクエストのSOAPヘッダーに追加します。

以下の手順を実行します。

1. Integration Studioで拡張機能を作成し、WS-Addressingの変更を処理するアクションを定義します。
以下の例では、入力パラメータを持たない「AddWSAddressing」というアクションをIntegration Studioで定義しています。

2. [Edit Source Code .NET]をクリックします。プロジェクトのターゲットフレームワークを設定し、アセンブリOutSystems.SOAP.APIおよびSystem.ServiceModelへの参照を追加します。
以下のコードを入力し、Integration Studioで作成されたMssAddWSAddressing関数プレースホルダを置き換えます。

// required 'using' statements at the beginning of the file
using System.ServiceModel;
using System.ServiceModel.Channels;
using OutSystems.SOAP.API;

/* ...*/

// replace the 'MssAddWSAddressing' function placeholder with the following code
public void MssAddWSAddressing() {
    ISOAPClient client = SoapRequest.GetCurrentClient();
    SecurityMode securityMode = SecurityMode.Transport;
    Binding binding = new WSHttpBinding(securityMode);
    client.Endpoint.Binding = binding;
}

3.Visual Studio .NETを停止し、Integration Studioに戻ります。Integration Studioで、[1-Click Publish]ツールバーアイコンをクリックするか、またはF5キーを押して、拡張機能をパブリッシュします。

4. Service Studioで、アプリケーションモジュールに拡張機能の「AddWSAddressing」アクションへの参照を追加します。

5. SOAP WebサービスのSOAPコールバックフローで、「AddWSAddressing」アクションをフローにドラッグします。

6. アプリケーションモジュールをパブリッシュしてアプリケーションをテストし、先ほど設定したWebサービスに対してOutSystemsプラットフォームから行われたWebサービスのリクエストにWS-Addressing要素があることを確認します。

SOAPヘッダーを追加する

このシナリオでは、利用中のSOAP WebサービスのすべてのリクエストのSOAPヘッダーに新しい要素を追加します。

ヒント: BeforeSendRequest関数に対して必要な調整を行って新しいヘッダーを追加する代わりに、提供されたサンプルを調整してリクエストのSOAPヘッダーを削除または変更できます。

コードの概要

そのためには、以下の処理を実行するC# コードを作成する必要があります。

  1. 定義したアクションに対応してIntegration Studioによって作成された関数プレースホルダで、実装する必要があるカスタムエンドポイント動作を登録します。

  2. 次に、WCF(Windows Communication Foundation)からIEndpointBehaviorインターフェイスを実装するエンドポイント動作クラスを作成します。
    このクラスは、(次に実装する別のカスタムクラスに基づいて)メッセージインスペクタをクライアントのランタイムに追加します。これは新しいSOAPヘッダー要素を追加する役割を果たします。

  3. SOAP WebサービスのすべてのリクエストにSOAPヘッダー要素を追加するメッセージインスペクタクラスを作成し、BeforeSendRequest関数にコードを追加します。

以下の手順を実行する方法に関する具体例を見てみましょう。

1. Integration Studioで、拡張機能を作成してアクションを定義します。このアクションは、リクエストの送信前にSOAPリクエスト要素を追加するカスタムメッセージインスペクタを登録します。
この例では、入力パラメータを持たない「RegisterSoapHeaderCallback」というアクションをIntegration Studioで定義しています。

2. [Edit Source Code .NET]をクリックします。プロジェクトのターゲットフレームワークを設定し、アセンブリOutSystems.SOAP.APIおよびSystem.ServiceModelへの参照を追加します。
以下のコードを入力し、Integration Studioで作成されたMssRegisterSoapHeaderCallback関数プレースホルダを置き換えます。

// required 'using' statements at the beginning of the file
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;
using System.ServiceModel.Dispatcher;
using OutSystems.SOAP.API;

/* ...*/

// replace the 'MssRegisterSoapHeaderCallback' function placeholder with the following code
public void MssRegisterSoapHeaderCallback() {
    SoapRequest.RegisterEndpointBehavior(new AddSoapHeaderBehavior());
}

3. WCFのインターフェイスIEndpointBehaviorを実装するカスタムクラスAddSoapHeaderBehaviorを作成し、以下のコードを含めます。

class AddSoapHeaderBehavior : IEndpointBehavior {

    void IEndpointBehavior.ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime) {
        clientRuntime.ClientMessageInspectors.Add(new AddSoapHeaderMessageInspector());
        // you can add more message inspectors here:
        // clientRuntime.ClientMessageInspectors.Add(new [...]);
    }

    void IEndpointBehavior.AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) {
        // do nothing
    }

    void IEndpointBehavior.ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) {
        // do nothing
    }

    void IEndpointBehavior.Validate(ServiceEndpoint endpoint) {
        // do nothing
    }
}

注記: このユースケースの場合、コードを追加する必要があるのはApplyClientBehavior関数だけです。

4. WCFのインターフェイスIClientMessageInspectorを実装するカスタムクラスAddSoapHeaderMessageInspectorを作成し、以下のコードを含めます。

class AddSoapHeaderMessageInspector : IClientMessageInspector {

    object IClientMessageInspector.BeforeSendRequest(ref Message request, IClientChannel channel) {
        // before sending a request, add a new SOAP header, specifying its name, namespace and value
        request.Headers.Add(MessageHeader.CreateHeader("Custom", "http://schemas.com", "header value"));
        return request;
    }

    void IClientMessageInspector.AfterReceiveReply(ref Message reply, object correlationState) {
        // here you would handle the web service response
    }
}

このクラスでは、ユースケースに応じて、リクエストを処理する関数(BeforeSendRequest)または応答を処理する関数(AfterReceiveReply)のいずれか、あるいはそれらの両方の関数にコードを追加できます。
SOAPリクエストヘッダーに要素を追加するため、BeforeSendRequest関数にコードを追加します。

5. Visual Studio .NETを停止し、Integration Studioに戻ります。Integration Studioで、[1-Click Publish]ツールバーアイコンをクリックするか、またはF5キーを押して、拡張機能をパブリッシュします。

6. Service Studioで、アプリケーションモジュールに拡張機能の「RegisterSoapHeaderCallback」アクションへの参照を追加します。

7. SOAP WebサービスのSOAPコールバックフローで、「RegisterSoapHeaderCallback」アクションをフローにドラッグします。

8. アプリケーションモジュールをパブリッシュしてアプリケーションをテストし、以下のSOAPリクエストのサンプルのように、追加した要素「Custom」がWebサービスのリクエストのSOAPヘッダーに含まれていることを確認します。

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope">
    <s:Header>
        <Custom xmlns="http://schemas.com">header value</Custom>
    </s:Header>
    <s:Body>
        ...
    </s:Body>
</s:Envelope>

HTTPヘッダーを追加する

このシナリオでは、特定の利用中のSOAP Webサービスのすべてのリクエストに新しいHTTPヘッダーを追加します。

ヒント: BeforeSendRequest関数に対して必要な調整を行って新しいヘッダーを追加する代わりに、提供されたサンプルを調整してリクエストのHTTPヘッダーを削除または変更することができます。

コードの概要

そのためには、以下の処理を実行するC# コードを作成する必要があります。

  1. 定義したアクションに対応してIntegration Studioによって作成された関数プレースホルダで、実装する必要があるカスタムエンドポイント動作を登録します。

  2. 次に、WCF(Windows Communication Foundation)からIEndpointBehaviorインターフェイスを実装するエンドポイント動作クラスを作成します。
    このクラスは、(次に実装する別のカスタムクラスに基づいて)メッセージインスペクタをクライアントのランタイムに追加します。これは新しいHTTPヘッダーをリクエストに追加する役割を果たします。

  3. HTTPヘッダーを追加するメッセージインスペクタクラスを作成し、BeforeSendRequest関数にコードを追加します。

以下の手順を実行する方法に関する具体例を見てみましょう。

1. Integration Studioで、拡張機能を作成してアクションを定義します。このアクションは、リクエストの送信前にSOAPリクエスト要素を追加するカスタムメッセージインスペクタを登録します。
この例では、入力パラメータを持たない「RegisterHttpHeaderCallback」というアクションをIntegration Studioで定義しています。

2. [Edit Source Code .NET]をクリックします。プロジェクトのターゲットフレームワークを設定し、アセンブリOutSystems.SOAP.APIおよびSystem.ServiceModelへの参照を追加します。
以下のコードを入力し、Integration Studioで作成されたMssRegisterHttpHeaderCallback関数プレースホルダを置き換えます。

// required 'using' statements at the beginning of the file
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;
using System.ServiceModel.Dispatcher;
using OutSystems.SOAP.API;

/* ...*/

// replace the 'MssRegisterHttpHeaderCallback' function placeholder with the following code
public void MssRegisterHttpHeaderCallback() {
    SoapRequest.RegisterEndpointBehavior(new AddHttpRequestHeaderBehavior());
}

3. WCFのインターフェイスIEndpointBehaviorを実装するカスタムクラスAddSoapHeaderBehaviorを作成し、以下のコードを含めます。

class AddHttpRequestHeaderBehavior : IEndpointBehavior {

    void IEndpointBehavior.ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime) {
        clientRuntime.ClientMessageInspectors.Add(new AddHttpRequestHeaderMessageInspector());
        // you can add more message inspectors here:
        // clientRuntime.ClientMessageInspectors.Add(new [...]);
    }

    void IEndpointBehavior.AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) {
        // do nothing
    }

    void IEndpointBehavior.ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) {
        // do nothing
    }

    void IEndpointBehavior.Validate(ServiceEndpoint endpoint) {
        // do nothing
    }
}

注記: このユースケースの場合、コードを追加する必要があるのはApplyClientBehavior関数だけです。

4. WCFのインターフェイスIClientMessageInspectorを実装するカスタムクラスAddHttpRequestHeaderMessageInspectorを作成し、以下のコードを含めます。

class AddHttpRequestHeaderMessageInspector : IClientMessageInspector {

    object IClientMessageInspector.BeforeSendRequest(ref Message request, IClientChannel channel) {
        string headerName = "MyCustomHeader1";
        string headerValue = "400";

        // before sending a request, add a new HTTP header, specifying its name and value
        if (request.Properties.TryGetValue(HttpRequestMessageProperty.Name, out object httpRequestMessageObject)) {
            HttpRequestMessageProperty httpRequestMessage = httpRequestMessageObject as HttpRequestMessageProperty;
            httpRequestMessage.Headers.Add(headerName, headerValue);
        } else {
            HttpRequestMessageProperty httpRequestMessage = new HttpRequestMessageProperty();
            httpRequestMessage.Headers.Add(headerName, headerValue);
            request.Properties.Add(HttpRequestMessageProperty.Name, httpRequestMessage);
        }
        return null;
    }

    void IClientMessageInspector.AfterReceiveReply(ref Message reply, object correlationState) {
        // here you would handle the web service response
    }
}

このクラスでは、ユースケースに応じて、リクエストを処理する関数(BeforeSendRequest)または応答を処理する関数(AfterReceiveReply)のいずれか、あるいはそれらの両方の関数にコードを追加できます。
SOAPリクエストヘッダーに要素を追加するため、BeforeSendRequest関数にコードを追加します。

5. Visual Studio .NETを停止し、Integration Studioに戻ります。Integration Studioで、[1-Click Publish]ツールバーアイコンをクリックするか、またはF5キーを押して、拡張機能をパブリッシュします。

6. Service Studioで、アプリケーションモジュールに拡張機能の「RegisterHttpHeaderCallback」アクションへの参照を追加します。

7. SOAP WebサービスのSOAPコールバックフローで、「RegisterHttpHeaderCallback」アクションをフローにドラッグします。

8. アプリケーションモジュールをパブリッシュしてアプリケーションをテストし、HTTPヘッダーがWebサービスのリクエストに追加されていることを確認します。

  • Was this article helpful?