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


Прокси-сервер службы

Прокси-сервер службы — это прокси-сервер на стороне клиента для службы. Прокси-сервер службы позволяет приложениям отправлять и получать сообщения через канал в виде вызовов методов.

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

Схема, показывающая состояния прокси службы и вызовы функций или события, которые ведут из одного состояния в другое.

Эти состояния прокси службы перечисляются в перечислении WS_SERVICE_PROXY_STATE .

Как показано на предыдущей схеме и следующем коде, прокси-сервер службы создается путем вызова функции WsCreateServiceProxy . В качестве параметров для этого вызова WWSAPI предоставляет следующие перечисления:

Он также принимает необязательные параметры, используя следующие типы данных:

После создания прокси-сервера службы функция WsCreateServiceProxy возвращает ссылку на прокси-сервер службы , WS_SERVICE_PROXY, с помощью параметра out.

WS_SERVICE_PROXY* serviceProxy = NULL;
hr = WsCreateServiceProxy (
    WS_TCP_CHANNEL_BINDING, 
    WS_CHANNEL_TYPE_DUPLEX_SESSION, 
    NULL, 
    NULL, 
    0, 
    NULL,
    0,
    &serviceProxy, 
    error);

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

WS_ENDPOINT_ADDRESS address = {0};
address.uri.chars = "net.tcp://localhost/example";
address.uri.length = wcslen("net.tcp://localhost/example";);
hr = WsOpenServiceProxy(serviceProxy, &address, NULL, error);

После открытия прокси-сервера службы приложение может использовать его для выполнения вызовов к службе.

hr = Add(
    serviceProxy, 
    1, 
    2, 
    &result, 
    NULL, 
    0, 
    NULL, 
    error);

Когда приложению больше не нужен прокси-сервер службы, он закрывается путем вызова функции WsCloseServiceProxy . Он также освобождает связанную память, вызывая WsFreeServiceProxy.

hr = WsCloseServiceProxy(
    serviceProxy, 
    NULL, 
    error);
hr = WsFreeServiceProxy(
    serviceProxy, 
    error);

Повторное использование прокси-сервера службы

Кроме того, после вызова WsCloseServiceProxy приложение может повторно использовать прокси-сервер службы, вызвав функцию WsResetServiceProxy .

hr = WsResetServiceProxy(
    serviceProxy, 
    error);

Дополнительные сведения об использовании прокси-серверов службы в разных контекстах см. в следующих разделах:

Безопасность

При использовании API прокси-сервера службы WWSAPI следует внимательно учитывать следующие рекомендации по проектированию приложений:

  • Прокси-сервер службы не будет выполнять проверку данных за пределами базовой проверки профиля 2.0 и XML-сериализации. Приложение отвечает за проверку данных, содержащихся в параметрах, которые оно получает в ходе вызова.
  • Настройка максимального числа ожидающих вызовов на прокси-сервере службы с помощью значения перечисления WS_PROXY_PROPERTY_IDWS_PROXY_PROPERTY_MAX_PENDING_CALLS обеспечивает защиту от медленно работающего сервера. Максимальное значение по умолчанию — 100. Приложения должны быть осторожны при изменении значений по умолчанию.
  • Прокси-сервер службы не предоставляет никаких гарантий безопасности, кроме тех, которые указаны в WS_SECURITY_DESCRIPTION структуре, используемой для взаимодействия с сервером.
  • Следите за изменением значений по умолчанию для сообщений и каналов на прокси-сервере службы. Ознакомьтесь с рекомендациями по безопасности, связанными с сообщениями и каналами, прежде чем изменять какие-либо связанные свойства.
  • Прокси-сервер службы шифрует все учетные данные, которые хранятся в памяти.

Следующие элементы API относятся к прокси-службам.

Обратный вызов Описание
WS_PROXY_MESSAGE_CALLBACK Вызывается при отправке заголовков входного сообщения или при получении заголовков выходного сообщения.

 

Перечисление Описание
WS_CALL_PROPERTY_ID Перечисляет необязательные параметры для настройки вызова операции службы на стороне клиента.
WS_PROXY_PROPERTY_ID Перечисляет необязательные параметры для настройки прокси-сервера службы.
WS_SERVICE_PROXY_STATE Состояние прокси-сервера службы.

 

Функция Описание
WsAbandonCall Отменяет указанный вызов на указанном прокси-сервере службы.
WsAbortServiceProxy Отменяет все ожидающие входные и выходные данные на указанном прокси-сервере службы.
WsCall Только для внутреннего использования. Сериализует аргументы в сообщение и отправляет его по каналу.
WsCloseServiceProxy Закрывает прокси-сервер службы для обмена данными.
WsCreateServiceProxy Создает прокси-сервер службы.
WsFreeServiceProxy Освобождает память, связанную с прокси-сервером службы.
WsGetServiceProxyProperty Извлекает указанное свойство прокси-сервера службы.
WsOpenServiceProxy Открывает прокси-сервер службы для конечной точки службы.
WsResetServiceProxy Сбрасывает прокси-сервер службы.

 

Handle Описание
WS_SERVICE_PROXY Непрозрачный тип, используемый для ссылки на прокси-сервер службы.

 

Структура Описание
WS_CALL_PROPERTY Задает свойство вызова.
WS_PROXY_PROPERTY. Указывает свойство прокси-сервера.