手動建立 WCF 服務的服務 Proxy
若要為 Windows Communication Foundation (WCF) 服務建立用戶端服務 Proxy 最簡單的方式,是使用 WsUtil 工具在服務模型層,如建立用戶端主題中所述。 不過,如有必要,您也可以手動建立服務 Proxy。 此 API 包含 WsCreateServiceProxy 函式,可用來建立服務 Proxy 以及結構、列舉等,以設定與 WCF 互操作所需的屬性。
WCF 提供一些標準系結,每個系結都是以特定使用案例為目標。 您嘗試連線到的服務會接著決定您需要自定義哪些通道屬性,讓服務 Proxy 與服務通訊。
建立 WCF WSHttpBinding 的服務 Proxy
WSHttpBinding 適用於主線因特網 Web 服務案例。 它會使用較新的 SOAP 1.2 版和 WS-Addressing 1.0 版,並透過公用 HTTP 和 HTTPS 傳輸啟用廣泛的安全性設定。 WWSAPI 沒有 WSHttpBinding 的對等專案(或任何 WCF 標準系結,但因為其預設 SOAP 版本、WS 尋址版本和編碼格式符合 WSHttpBinding 中的版本,因此為使用 WSHttpBinding 的服務建立服務 Proxy 很簡單。 例如,若要建立服務 Proxy 來與沒有安全性的 WSHttpBinding 端點通訊,您可以直接使用類似下列代碼段的程式碼(變數宣告和堆積和建立錯誤)。 請注意,WsCreateServiceProxy 函式的呼叫中未指定通道屬性或安全性描述。
// Create the proxy
hr = WsCreateServiceProxy(
WS_CHANNEL_TYPE_REQUEST,
WS_HTTP_CHANNEL_BINDING,
NULL, // security description
NULL, // proxy properties
0, // proxy property count
NULL, // channel properties
0, // channel property count
&proxy,
error);
函式會建立服務 Proxy,並在 serviceProxy 參數中傳回它的指標(和上述函數調用中的 proxy)。
建立 WCF BasicHttpBinding 的服務 Proxy
不過,當您手動為使用 BasicHttpBinding 系結的 WCF 服務建立服務 Proxy 時,必須設定通道的 SOAP 版本和 WS 位址屬性。 這是因為 WWSAPI 預設為 SOAP 1.2 版和 WS 位址 1.0。 另一方面,WCF 的 BasicHttpBinding 會使用 SOAP 1.1 版,而沒有 WS 位址處理。
若要設定通道的 SOAP 版本和 WS-Addrssing 屬性,請宣告WS_CHANNEL_PROPERTY結構的陣列,以保存通道屬性和相關信息。
WS_CHANNEL_PROPERTY channelProperties[4]; // Array to hold up to 4 channel properties
ULONG channelPropertyCount = 0; // Count of properties set
WS_ENVELOPE_VERSION soapVersion = WS_ENVELOPE_VERSION_SOAP_1_1; // Set required SOAP version
channelProperties[channelPropertyCount].id = WS_CHANNEL_PROPERTY_ENVELOPE_VERSION; // Type of first channel property
channelProperties[channelPropertyCount].value = &soapVersion; // Address of the SOAP version value
channelProperties[channelPropertyCount].valueSize = sizeof(soapVersion); // Size of the value
channelPropertyCount++; // Increment property count
WS_ADDRESSING_VERSION addressingVersion = WS_ADDRESSING_VERSION_TRANSPORT; // Set required WS-Addressing value
channelProperties[channelPropertyCount].id = WS_CHANNEL_PROPERTY_ADDRESSING_VERSION; // Type of second channel property
channelProperties[channelPropertyCount].value = &addressingVersion ; // Address of the WS-Addressing value
channelProperties[channelPropertyCount].valueSize = sizeof(addressingVersion ); // Size of the value
channelPropertyCount++; // Increment property count
// add more channel properties here
然後將通道屬性的陣列 (channelProperties) 和屬性計數 (channelPropertyCount) 傳遞至 WsCreateServiceProxy (或 WsCreateChannel 如果您在通道層工作)。
// Create the proxy
hr = WsCreateServiceProxy(
WS_CHANNEL_TYPE_REQUEST,
WS_HTTP_CHANNEL_BINDING,
NULL, // security description
NULL, // proxy properties
0, // proxy property count
channelProperties, // channel properties
channelPropertyCount, // channel property count
&proxy,
error);
您宣告要保存屬性的陣列會在 WsCreateServiceProxy 中複製,因此,您可以在呼叫 函式之後立即釋放屬性陣列的記憶體。 此外,如果您從堆疊配置記憶體(如上述代碼段),您也可以在呼叫之後立即從函式傳回。
其他系結
此外,WWSAPI 提供機制來建立服務 Proxy,以使用其他系結與 WCF 服務通訊,例如 NetTcpBinding 和 WSFederationHttpBinding。 其中許多系結都需要設定其他通道屬性,例如安全性描述元。 如需說明使用其他系結的範例,請參閱 Windows Web 服務範例一節,特別是 TCP 通道層範例、HTTP 通道層範例和安全性通道層範例小節。