Создание прокси для WCF службы вручную
Самый простой способ создать прокси клиентской службы для службы Windows Communication Foundation (WCF) осуществляется на уровне модели службы с помощью средства WsUtil, как описано в разделе Создание клиента. Однако при необходимости можно также создать прокси-сервер службы вручную. Этот API включает функцию WsCreateServiceProxy для создания прокси-сервера службы, а также структур, перечислений и т. д. для задания свойств, необходимых для взаимодействия с WCF.
WCF предоставляет ряд стандартных привязок, каждый из которых предназначен для конкретного сценария использования. Привязка, которую использует служба, к которой вы пытаетесь подключиться, определяет, какие свойства канала необходимо настроить для вашего прокси-сервера, чтобы взаимодействовать со службой.
Создание прокси-сервера службы для WCF WSHttpBinding
WSHttpBinding предназначен для сценария основных веб-служб Интернета. Он использует более новую версию SOAP 1.2 и WS-Addressing версии 1.0 и обеспечивает широкий спектр параметров безопасности по общедоступным транспортам HTTP и HTTPS. WWSAPI не имеет эквивалента WSHttpBinding (или любой из стандартных привязок WCF, на самом деле), но так как его версия SOAP по умолчанию, версия WS-Addressing и формат кодирования совпадают с форматом WSHttpBinding, создание прокси-сервера для службы, использующей WSHttpBinding, является простым. Например, чтобы создать прокси-сервер службы для взаимодействия с конечной точкой 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);
Функция создает прокси службы и возвращает указатель на него в параметре serviceProxy (&прокси в предыдущем вызове функции).
Создание прокси для службы WCF с использованием BasicHttpBinding
При создании вручную прокси-сервера для службы WCF, которая использует привязку BasicHttpBinding, однако, необходимо задать версию SOAP и свойства канала WS-Addressing. Это связано с тем, что WWSAPI по умолчанию использует soap версии 1.2 и WS-Addressing 1.0. BasicHttpBinding WCF, с другой стороны, использует SOAP версии 1.1 и не использует WS-Addressing.
Чтобы задать версию 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 предоставляет механизмы для создания прокси-серверов служб для взаимодействия со службами WCF с помощью других привязок, таких как NetTcpBinding и WSFederationHttpBinding. Многие из этих привязок требуют установки дополнительных свойств канала, таких как дескрипторы безопасности. Для примеров, иллюстрирующих использование других привязок, см. раздел Примеры веб-служб Windows, в частности подразделы: Примеры TCP-слоя канала, Примеры HTTP-слоя каналаи Примеры слоя канала безопасности.