Oracle Database アダプターを使用した WCF チャネル モデルの概要
Microsoft BizTalk Adapter for Oracle Database に対する操作を呼び出すために、コードは WCF クライアントとして機能し、送信操作をアダプターに送信します。 WCF チャネル モデルでは、コードはチャネル経由で要求メッセージを送信することによってアダプターに対する操作を呼び出します。
アダプターによって提供される POLLINGSTMT 操作を使用してポーリング ベースのデータ変更メッセージを受信するなど、受信操作を呼び出すには、コードが WCF サービスとして機能し、アダプターから受信操作を受信します。 言い換えると、コードはチャネル経由でアダプターから要求メッセージを受信します。
このセクションのトピックでは、ORACLE データベース アダプターと WCF チャネル モデルの使用の概要について説明します。
WCF チャネル モデルの概要
クライアントとサービスは、SOAP メッセージを交換して通信します。 WCF チャネル モデルは、このメッセージ交換の低レベルの抽象化です。 チャネル スタックと呼ばれる階層化プロトコル スタックを使用してメッセージを送受信できるようにするインターフェイスと型が提供されます。 スタックの各レイヤーはチャネルで構成され、各チャネルは WCF バインディングから作成されます。 最も低いレイヤーはトランスポート チャネルです。 トランスポート チャネルは、サービスとクライアントの間の基になるトランスポート メカニズムを実装し、各メッセージを System.ServiceModel.Message として上位のレイヤー (および最終的には使用するアプリケーション) に提示します。 WCF Message クラスは、SOAP メッセージの抽象化です。 WCF には、要求応答や一方向など、基本的な SOAP メッセージ交換パターンをモデル化するチャネル図形と呼ばれるいくつかのチャネル インターフェイスが用意されています。 WCF トランスポート バインドは、上位レイヤーがメッセージの送受信に使用できる 1 つ以上のチャネル図形の実装を提供します。 WCF チャネル モデルの詳細については、「チャネル モデルの 概要」を参照してください。
Oracle Database アダプターは、Oracle データベースを WCF サービスとして公開する WCF カスタム トランスポート バインドです。
Oracle データベース アダプターでサポートされているチャネル図形
アダプターは、次の WCF チャネル図形を実装します。
IRequestChannel (System.ServiceModel.Channels.IRequestChannel)。 IRequestChannel インターフェイスは、要求/応答メッセージ交換のクライアント側を実装します。 IRequestChannel を使用して、Oracle テーブルに対して SELECT クエリを実行するなど、応答を使用する操作を実行できます。
IOutputChannel (System.ServiceModel.Channels.IOutputChannel)。 この図形は、一方向メッセージ交換のクライアント側を実装します。 IOutputChannel を使用すると、OUT パラメーターのない Oracle プロシージャを呼び出すなど、応答を使用する必要のない操作を呼び出すことができます。
重要
Oracle クライアントに対するアダプターによる基になる呼び出しはすべて同期です。 これには、 IOutputChannel を介して呼び出された操作の結果である Oracle クライアントへの呼び出しが含まれます。 IOutputChannel を使用すると、アダプターは Oracle クライアントから受信した応答を破棄します。
IInputChannel (System.ServiceModel.Channels.IInputChannel)。 この図形は、一方向メッセージ交換のサービス側を実装します。 アダプターからの受信操作のメッセージを受信するには、 IInputChannel を使用します。
WCF バインディングと同様に、Oracle Database アダプターはファクトリ パターンを使用して、アプリケーション コードにチャネルを提供します。 Microsoft.Adapters.OracleDBBinding オブジェクトを使用して、次のインスタンスを作成します。
System.ServiceModel.ChannelFactory<IRequestChannel> アダプターで要求/応答操作を呼び出すために使用できる IRequestChannel チャネルを提供します。
System.ServiceModel.ChannelFactory<IOutputChannel> :アダプターで一方向操作を呼び出すために使用できる IOutputChannel チャネルを提供します。
System.ServiceModel.IChannelListener<アダプターから受信メッセージ (POLLINGSTMT 操作など) を受信するために使用できる IInputChannel チャネルを提供する IInputChannel>。
WCF チャネル モデルでの Oracle データベース アダプターのメッセージの作成
WCF では、 System.ServiceModel.Channels.Message クラスは SOAP メッセージのメモリ内表現を提供します。 Message インスタンスを作成するには、静的な Message.Create メソッドを呼び出します。
SOAP メッセージには、Oracle Database アダプターに送信する メッセージ インスタンスを作成するときに指定する必要がある重要な部分が 2 つあります。
メッセージ アクションは、SOAP メッセージ ヘッダーの一部である文字列です。 メッセージ アクションは、Oracle データベースで呼び出す必要がある操作を識別します。 /SCOTT/EMP テーブルで Select 操作を呼び出すために指定されたメッセージ アクションを次に示します。
http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Table/EMP/Select
メッセージ本文には、操作のパラメーター データが含まれています。 メッセージ本文は、要求された操作に対して Oracle Database アダプターによって予期されるメッセージ スキーマに対応する整形式 XML で構成されます。 次のメッセージ本文では、SCOTT に対する Select 操作を指定します。EMP テーブル (SELECT * FROM EMP)。
<?xml version="1.0" encoding="utf-8" ?> <Select xmlns="http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Table/EMP"> <COLUMN_NAMES>*</COLUMN_NAMES> </Select>
Oracle Database アダプターのメッセージ スキーマと操作のメッセージ アクションの詳細については、「 BizTalk Adapter for Oracle Database のメッセージとメッセージ スキーマ」を参照してください。
この Create メソッドはオーバーロードされ、メッセージ本文を提供するためのさまざまなオプションを提供します。 次のコードは、XmlReader を使用してメッセージ本文を指定して Message インスタンスを作成する方法を示しています。 このコードでは、メッセージ本文がファイルから読み取られます。
XmlReader readerIn = XmlReader.Create("SelectAllActivity.xml");
Message messageIn = Message.CreateMessage(MessageVersion.Default,
"http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Table/EMP/Select",
readerIn);
重要
Message インスタンスでメッセージ アクションを指定する必要があります。 これは通常、 Message インスタンスの作成時に行われます。
WCF チャネル モデルでの LOB データ型のストリーミング サポート
LOB データ型のエンド ツー エンド ストリーミングは、アダプターによって表示される一部の操作でサポートされます。 これらの操作では、チャネル経由で送受信するメッセージを作成して使用する方法によって、LOB データでストリーミングがサポートされているかどうかが決まります。
Oracle Database アダプターが LOB データのストリーミングをサポートする方法の詳細については、「 Oracle Database アダプターでのラージ オブジェクト データ型のストリーミング」を参照してください。
LOB データのエンド ツー エンド ストリーミングをサポートするためにコードにノード値ストリーミングを実装する方法の詳細については、「 WCF チャネル モデルを使用した Oracle データベース LOB データ型のストリーミング」を参照してください。