POX アプリケーションとの相互運用性
"Plain Old XML" (POX) アプリケーションは、SOAP エンベロープで囲まれていない XML アプリケーション データのみを含んだ生の HTTP メッセージの交換によって通信するアプリケーションです。Windows Communication Foundation (WCF) では、POX メッセージを使用するサービスとクライアントの両方を提供できます。サービスでは、POX メッセージを送受信する Web ブラウザやスクリプト言語などのクライアントに対してエンドポイントを公開するサービスを WCF を使用して実装できます。クライアントでは、WCF プログラミング モデルを使用して、POX ベースのサービスと通信するクライアントを実装できます。
このドキュメントはもともと .NET Framework 3.0 用に書かれたものです。.NET Framework 3.5 には POX アプリケーション用のサポートが組み込まれています。詳細については、 、「Web プログラミング モデル」を参照してください。 |
WCF による POX プログラミング
POX メッセージを使用して HTTP を介して通信する WCF サービスは、次の customBinding elementを使用します。
<customBinding>
<binding name="poxServerBinding">
<textMessageEncoding messageVersion="None" />
<httpTransport />
</binding>
</customBinding>
このカスタム バインディングには、次の 2 つの要素があります。
標準の WCF テキスト メッセージ エンコーダで None 値を使用するように特別に構成することにより、SOAP エンベロープにラップされずに到着する XML メッセージ ペイロードを処理できるようになります。
POX メッセージを使用して HTTP を介して通信する WCF クライアントでも、次の強制コードに示すように、同様のバインディングを使用します。
private static Binding CreatePoxBinding()
{
TextMessageEncodingBindingElement encoder =
new TextMessageEncodingBindingElement( MessageVersion.None, Encoding.UTF8 );
HttpTransportBindingElement transport = new HttpTransportBindingElement();
transport.ManualAddressing = true;
return new CustomBinding( new BindingElement[] { encoder, transport } );
}
POX クライアントでは、メッセージの送信先となる URI を明示的に指定する必要があるため、クライアントの ManualAddressing プロパティを true に設定することで、通常、HttpTransportBindingElement を手動アドレス指定モードに構成する必要があります。これにより、アプリケーション コードによってメッセージのアドレスが明示的に指定されることになり、アプリケーションで異なる HTTP URI にメッセージを送信するたびに、新しい ChannelFactory を作成する必要がなくなります。
POX メッセージでは重要なプロトコル情報の搬送に SOAP ヘッダーを使用しないため、POX クライアントおよびサービスでは、メッセージの送受信に使用される、基になる HTTP 要求の情報を操作する必要が生じる場合がよく起こります。HTTP ヘッダーやステータス コードなど、HTTP 固有のプロトコル情報は、WCF プログラミング モデルでは次の 2 つのクラスを通じて表現されます。
- HttpRequestMessageProperty には、HTTP メソッドと要求ヘッダーなど、HTTP 要求についての情報が含まれます。
- HttpResponseMessageProperty には、HTTP ステータス コード、ステータスの説明、および任意の HTTP 応答ヘッダーなど、HTTP 応答についての情報が含まれます。
https://localhost:8100/customers にアドレス指定される HTTP GET 要求メッセージの作成方法を、次のコード例に示します。
Message request = Message.CreateMessage( MessageVersion.None, String.Empty );
request.Headers.To = “https://localhost:8100/customers”;
HttpRequestMessageProperty property = new HttpRequestMessageProperty();
property.Method = “GET”;
property.SuppressEntityBody = true;
request.Properties.Add( HttpRequestMessageProperty.Name, property );
初めに、CreateMessage を呼び出すことで、空の Message 要求を作成します。None パラメータを使用して SOAP エンベロープが不要であることを示し、Empty パラメータをアクションとして渡します。次に、To を目的の URI に設定することで、要求メッセージをアドレス指定します。さらに、HttpRequestMessageProperty を作成し、Method を HTTP 動詞の GET メソッドに設定し、また SuppressEntityBody を true に設定して、送信 HTTP 要求メッセージの本文でデータが送信されないことを示します。最後に、要求プロパティを要求メッセージの Properties コレクションに追加して、HTTP トランスポートによる要求の送信方法に影響を与えることができるようにします。これで IRequestChannel の適切なインスタンスを使用してメッセージを送信する用意が整いました。
サービスにおいても、受信メッセージから HttpRequestMessageProperty を抽出して応答を構築する際に同様のテクニックを使用できます。