Прокси-сервер службы
Прокси-сервер службы — это клиентский прокси-сервер для службы. Прокси-сервер службы позволяет приложениям отправлять и получать сообщения через канал в качестве вызовов методов.
Прокси-серверы служб создаются по мере необходимости, открываются, используются для вызова службы и закрываются, когда они больше не нужны. Кроме того, приложение может повторно использовать прокси-сервер службы для многократного подключения к одной и той же службе без затрат времени и ресурсов, необходимых для инициализации прокси-сервера службы более одного раза. На следующей схеме показан поток возможных состояний прокси-сервера службы и вызовов функций или событий, ведущих из одного состояния в другое.
Эти состояния прокси-сервера службы перечисляются в перечислении 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);
Дополнительные сведения о том, как прокси-серверы службы используются в разных контекстах, см. в следующих разделах:
- прокси-сервер службы и сеансы
- операции службы
- операций на стороне клиента
- HttpCalculatorClientExample
Безопасность
При использовании 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. | Указывает свойство прокси-сервера. |