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


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

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

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

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

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

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

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

После создания прокси-сервера службы функция WsCreateServicePr oxy возвращает ссылку на прокси-сервер службы 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);

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

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 Сбрасывает прокси-сервер службы.

 

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

 

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