非 Workshop クライアントと会話する

WebLogic Workshop で構築するサービスでは、会話のサポートを追加するのは簡単です。設計時に、サービスのメソッドおよびコールバックで会話プロパティのフェーズ属性を設定するだけです。実行時には、それらのプロパティは、Web サービスが交換する SOAP メッセージのヘッダに WebLogic Server によって変換されます。

ただし、WebLogic Workshop 以外のツールでビルドされたクライアントの場合、会話のサポートを追加するには異なるプロセスが必要になります。通常は、必須の SOAP ヘッダを設定および取得する独自のコードを記述することでサービスとの会話のサポートを追加します。特に、ヘッダは会話 ID およびサービスがコールバックを送信する先の URL をクライアントが送受信するための手段を提供します。それらのヘッダは、サービスのエクスポーズされたメソッドおよびコールバック(処理と呼ばれる)と関連付けられます。

注意: .NET で Web サービスを開発する(または .NET サービスと相互運用する必要がある)場合は、WebLogic Workshop サンプル プロジェクトの interop フォルダにあるサンプル ConversationClient.asmx.cs も参考にしてください。このファイルには、C# で記述された Web サービス クライアントのコードが含まれています。詳細については、.NET クライアント サンプルを参照してください。

以下に、会話に関連する 3 つの SOAP ヘッダを示します。

見てわかるように、すべてのヘッダに会話 ID が含まれています。クライアントは、最初のリクエストで会話 ID を送信します。その同じ ID が、クライアントとサービスの間で情報交換のたびにやり取りされます。このようにして、クライアントとサービスでは受信したメッセージがどの初期リクエストと関連しているのかを認識します。

ヘッダの仕組み

クライアントの最初のリクエスト(会話を開始する)は常に、会話を開始するようにマークされたメソッドに送信されます。このリクエストの SOAP メッセージには、<StartHeader> ヘッダが含まれていなければなりません。メッセージ内で、このヘッダは次のようになります。

<SOAP-ENV:Header>
    <StartHeader xmlns="http://www.openuri.org/2002/04/soap/conversation/">
        <conversationID>someUniqueIdentifier</conversationID>
        <callbackLocation>http://www.mydomain.com/myClient</callbackLocation>
    </StartHeader>
</SOAP-ENV:Header>

<StartHeader> 要素には、ヘッダ情報のみが含まれます。ここで示されているように、XML ネームスペースを使用する必要があります。

<conversationID> 要素は、技術的には省略可能です。この要素を省略すると、WebLogic Server はローカルで使用するように会話 ID を作成します。ただし、会話 ID が送信されない場合はその会話 ID が何であるのかをクライアントで知ることができません。つまり、受信した応答と元のリクエストを相関させることができません。したがって、会話 ID を省略して良いのは、Web サービスとの会話がそれ以上は続かない場合のみです。

<callbackLocation> 要素(これも省略可能)には、コールバックが送信される先の URL が含まれます。Web サービスからのコールバックを処理することが見込まれる場合にのみ、クライアントではこれを送信する必要があります。WebLogic Workshop の Web サービスでこの値が受信されると、それは WebLogic Server で後で使用できるように保存されます。

最初のリクエストの後、クライアントは Web サービスの別のメソッドを呼び出して自分サイドの会話を継続するか、または Web サービスからコールバックを受信します。Web サービスに対する 2 回目以降の各呼び出しには、<ContinueHeader> が含まれていなければなりません。つまり、会話を終了するようにマークされた Web サービス メソッドの呼び出しにも、<ContinueHeader> が含まれていなければなりません。会話が開始された後は、Web サービスがその期間を所有します(Web サービスが会話の終了とクライアントへの応答の送信を行う)。
<ContinueHeader> は、次のようになります。

<SOAP-ENV:Header>
    <ContinueHeader xmlns="http://www.openuri.org/2002/04/soap/conversation/">
        <conversationID>theUniqueIdentifierSentWithTheStartHeader</conversationID>
    </ContinueHeader>
</SOAP-ENV:Header>

この呼び出しと最初の呼び出しを正しく相関させるためには、ここで使用する <conversationID> が <StartHeader> で送信された ID と同じでなければなりません。

最後に、クライアントは Web サービスからのコールバックを処理するように設計できます。つまり、クライアント ソフトウェアには WebLogic Workshop Web サービスのコールバックによって送信されたメッセージを受信できる処理が含まれます。それがどのように実装されるかは、クライアントをビルドするために使用された技術によって異なります。ただし通常は、コールバックで送信されるメッセージにはそのコールバックのパラメータ値が含まれます。
コールバックのメッセージには、<CallbackHeader> も含まれます。<CallbackHeader> には、当然のごとく会話 ID が含まれます。

<SOAP-ENV:Header>
    <CallbackHeader xmlns="http://www.openuri.org/2002/04/soap/conversation/">
        <conversationID>theUniqueIdentifierSentWithTheStartHeader</conversationID>
    </CallbackHeader>
</SOAP-ENV:Header>

「finish」ヘッダがないことに気付きましたか。会話は、Web サービスがそれを終了したときに終了します。終了は、「finish」に設定された会話フェーズでマークされた処理(メソッドまたはコールバック)の実行を通じて行うことができます。Web サービスでは、JwsContext インタフェースの finish メソッドを呼び出すこともできます(例外の発生時など)。クライアントは、Web サービスの WSDL ファイルを使用して、どの処理が会話を終了するように設計されているのかを知ります。

会話対応 Web サービスの WSDL ファイルの参照

WebLogic Workshop サービスから生成された WSDL ファイルを参照することで、そのサービスのクライアントであるソフトウェアの開発者はサービスのどの処理が会話を開始、続行、または終了するのかを確認できます。また、各処理で必要な SOAP ヘッダもわかります。

次に示すのは、WebLogic Workshop サンプル プロジェクトの Conversation.jws Web サービスから生成された WSDL からの引用です。この例は次のように表記されています。

この引用を参照すると、以下のことがわかります。

  <binding name="ConversationSoap" type="s0:ConversationSoap">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" />
    <operation name="startRequest">
      <soap:operation soapAction="http://www.openuri.org/startRequest" style="document" />
 
     <cw:transition phase="start" />
      <input>
        <soap:body use="literal" />
        <soap:header wsdl:required="true" message="s0:StartHeader_literal" part="StartHeader" use="literal" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" />
      </input>
      <output>
        <soap:body use="literal" />
      </output>
    </operation>
    <operation name="getRequestStatus">
      <soap:operation soapAction="http://www.openuri.org/getRequestStatus" style="document" />
      <cw:transition phase="continue" />
      <input>
        <soap:body use="literal" />
        <soap:header wsdl:required="true" message="s0:ContinueHeader_literal" part="ContinueHeader" use="literal" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" />
      </input>
      <output>
        <soap:body use="literal" />
      </output>
    </operation>
    <operation name="terminateRequest">
      <soap:operation soapAction="http://www.openuri.org/terminateRequest" style="document" />
      <cw:transition phase="finish" />
      <input>
        <soap:body use="literal" />
        <soap:header wsdl:required="true" message="s0:ContinueHeader_literal" part="ContinueHeader" use="literal" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" />
      </input>
      <output>
        <soap:body use="literal" />
      </output>
    </operation>
    <operation name="onResultReady">
      <soap:operation soapAction="http://www.openuri.org/onResultReady" style="document" />
      <cw:transition phase="finish" />
      <input>
        <soap:body use="literal" />
      </input>
      <output>
        <soap:body use="literal" />
        <soap:header wsdl:required="true" message="s0:CallbackHeader_literal" part="CallbackHeader" use="literal" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" />
      </output>
    </operation>
  </binding>

関連トピック

会話の存続期間

概要 : 会話

非 WebLogic Workshop クライアントの開発者に会話への参加方法を示すには