次の方法で共有


POX アプリケーションとの相互運用性

"Plain Old XML" (POX) アプリケーションは、SOAP エンベロープで囲まれていない XML アプリケーション データのみを含む生の HTTP メッセージの交換によって通信するアプリケーションです。 Windows Communication Foundation (WCF) では、POX メッセージを使用するサービスとクライアントの両方を提供できます。 サービスでは、POX メッセージを送受信する Web ブラウザーやスクリプト言語などのクライアントに対してエンドポイントを公開するサービスを、WCF を使用して実装できます。 クライアントでは、WCF プログラミング モデルを使用して、POX ベースのサービスと通信するクライアントを実装できます。

Note

このドキュメントは、最初は .NET Framework 3.0 用に書かれていました。 .NET Framework 3.5 には、POX アプリケーション用のサポートが組み込まれています。 詳細については、「WCF Web HTTP プログラミング モデル」を参照してください。

WCF による POX プログラミング

POX メッセージを使用して HTTP を介して通信する WCF サービスは、<customBinding> を使用します。

<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 を明示的に指定する必要があるため、クライアントの HttpTransportBindingElement プロパティを ManualAddressing に設定することで、通常、true を手動アドレス指定モードに構成する必要があります。 これにより、アプリケーション コードによってメッセージのアドレスが明示的に指定されることになり、アプリケーションで異なる HTTP URI にメッセージを送信するたびに、新しい ChannelFactory を作成する必要がなくなります。

POX メッセージでは重要なプロトコル情報の搬送に SOAP ヘッダーを使用しないため、POX クライアントおよびサービスでは、メッセージの送受信に使用される、基になる HTTP 要求の情報を操作する必要が生じる場合がよく起こります。 HTTP ヘッダーやステータス コードなど、HTTP 固有のプロトコル情報は、WCF プログラミング モデルで、次の 2 つのクラスを通じて表現されます。

  • HttpRequestMessageProperty には、HTTP メソッドと要求ヘッダーなど、HTTP 要求についての情報が含まれます。

  • HttpResponseMessageProperty には、HTTP ステータス コード、ステータスの説明、および任意の HTTP 応答ヘッダーなど、HTTP 応答についての情報が含まれます。

http://localhost:8100/customers にアドレス指定される HTTP GET 要求メッセージの作成方法を、次のコード例に示します。

Message request = Message.CreateMessage( MessageVersion.None, String.Empty );
request.Headers.To = "http://localhost:8100/customers";

HttpRequestMessageProperty property = new HttpRequestMessageProperty();
property.Method = "GET";
property.SuppressEntityBody = true;
request.Properties.Add( HttpRequestMessageProperty.Name, property );

初めに、Message を呼び出すことで、空の CreateMessage(MessageVersion, String) 要求を作成します。 None パラメーターを使用して SOAP エンベロープが不要であることを示し、Empty パラメーターをアクションとして渡します。 次に、To を目的の URI に設定することで、要求メッセージをアドレス指定します。 さらに、HttpRequestMessageProperty を作成し、Method を HTTP 動詞の GET メソッドに設定し、また SuppressEntityBodytrue に設定して、送信 HTTP 要求メッセージの本文でデータが送信されないことを示します。 最後に、要求プロパティを要求メッセージの Properties コレクションに追加して、HTTP トランスポートによる要求の送信方法に影響を与えることができるようにします。 これで IRequestChannel の適切なインスタンスを使用してメッセージを送信する用意が整いました。

サービスにおいても、受信メッセージから HttpRequestMessageProperty を抽出して応答を構築する際に同様のテクニックを使用できます。