"Plain Old XML" (POX) アプリケーションは、SOAP エンベロープ内に囲まれていない XML アプリケーション データのみを含む生の HTTP メッセージを交換することによって通信します。 Windows Communication Foundation (WCF) は、POX メッセージを使用するサービスとクライアントの両方を提供できます。 サービスでは、WCF を使用して、WEB ブラウザーや POX メッセージを送受信するスクリプト言語などのクライアントにエンドポイントを公開するサービスを実装できます。 クライアントでは、WCF プログラミング モデルを使用して、POX ベースのサービスと通信するクライアントを実装できます。
注
このドキュメントは、もともと .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 固有のプロトコル情報は、次の 2 つのクラスを介して WCF プログラミング モデルで表示されます。
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パラメーターが Action として渡されることを示すために使用されます。 要求メッセージは、Toヘッダーを目的のURIに設定することで指定されます。 次に、 HttpRequestMessageProperty が作成され、 Method が HTTP 動詞 GET メソッドに設定され、送信 HTTP 要求メッセージの本文でデータを送信する必要がないことを示す SuppressEntityBody が true
に設定されます。 最後に、要求プロパティが要求メッセージの Properties コレクションに追加されるため、HTTP トランスポートが要求を送信する方法に影響を与えることができます。 その後、メッセージは、 IRequestChannelの適切なインスタンスを介して送信する準備ができています。
同様の手法をサービスで使用して、受信メッセージから HttpRequestMessageProperty を抽出し、応答を作成できます。