與 POX 應用程式的互通性

「Plain Old XML」(POX) 應用程式會透過交換未經處理的 HTTP 訊息來進行通訊,該訊息僅包含未隨附在 SOAP Envelope 內的 XML 應用程式資料。 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>

此自訂繫結包含兩個項目:

標準 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 訊息不使用 SOA 標頭傳送重要的通訊協定資訊,因此 POX 用戶端和服務經常必須管理基礎 HTTP 要求的片段以傳送或接收訊息。 透過兩個類別在 WCF 程式設計模型中提出 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 方法,以及將 SuppressEntityBody 設定為 true,以指示不應在傳出 HTTP 要求訊息的本文中傳送任何資料。 最後將要求屬性新增至要求訊息的 Properties 集合中,因此可影響 HTTP 傳輸如何傳送要求。 然後準備好透過 IRequestChannel 的適當執行個體傳送訊息。

可在服務上使用類似的技巧,以擷取來自傳入訊息的 HttpRequestMessageProperty 並建構回應。