Поделиться через


Создание прокси-сервера службы вручную для службы WCF

Самый простой способ создать прокси-сервер клиентской службы для службы Windows Communication Foundation (WCF) находится на уровне модели службы с помощью средства WsUtil, как описано в разделе "Создание клиента ". Однако при необходимости можно также создать прокси-сервер службы вручную. Этот API включает функцию WsCreateServiceProxy для создания прокси-сервера службы, а также структур, перечислений и т. д. для задания свойств, необходимых для взаимодействия с WCF.

WCF предоставляет ряд стандартных привязок, каждый из которых предназначен для конкретного сценария использования. Привязка службы, которую вы пытаетесь подключить к используемой, в свою очередь, определяет, какие свойства канала необходимо настроить для взаимодействия с службой прокси-сервер службы.

Создание прокси-сервера службы для WSHttpBinding WCF

WSHttpBinding предназначен для сценария основных веб-служб Интернета. Он использует более новую версию SOAP 1.2 и WS-Адресацию версии 1.0 и обеспечивает широкий спектр параметров безопасности через общедоступные транспорты HTTP и HTTPS. WWSAPI не имеет эквивалента WSHttpBinding (или любой из стандартных привязок WCF, в этом случае), но так как ее версия SOAP по умолчанию, версия WS-Адресация и формат кодирования совпадают с форматом 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 (&proxy в вызове функции выше).

Создание прокси-сервера службы для BasicHttpBinding WCF

При создании прокси-сервера службы вручную для службы WCF, использующего привязку BasicHttpBinding, однако необходимо задать версию SOAP и свойства WS-Адресации канала. Это связано с тем, что WWSAPI по умолчанию использует soap версии 1.2 и WS-Addressing 1.0. BasicHttpBinding WCF, с другой стороны, использует 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 предоставляет механизмы для создания прокси-серверов служб для взаимодействия со службами WCF с помощью других привязок, таких как NetTcpBinding и WSFederationHttpBinding. Многие из этих привязок требуют установки дополнительных свойств канала, таких как дескрипторы безопасности. Примеры, которые иллюстрируют использование других привязок, см. в разделах Примеры веб-служб Windows, в частности примеры уровней TCP, примеры уровней HTTP и примеры уровня канала безопасности.