Compartilhar via


Proxy de Serviço

Um proxy de serviço é o proxy do lado do cliente para um serviço. O proxy de serviço permite que os aplicativos enviem e recebam mensagens em um canal como chamadas de método.

Os proxies de serviço são criados conforme necessário, abertos, usados para chamar um serviço e fechados quando não são mais necessários. Como alternativa, um aplicativo pode reutilizar um proxy de serviço para se conectar repetidamente ao mesmo serviço sem o gasto de tempo e os recursos necessários para inicializar um proxy de serviço mais de uma vez. O diagrama a seguir ilustra o fluxo dos estados possíveis do proxy de serviço e as chamadas de função ou eventos que levam de um estado para outro.

Diagrama mostrando os estados de proxy de serviço e as chamadas de função ou eventos que levam de um estado para outro.

Esses estados de proxy de serviço são enumerados na enumeração WS_SERVICE_PROXY_STATE .

Como ilustra o diagrama anterior e o código a seguir, um proxy de serviço é criado por uma chamada para a função WsCreateServiceProxy . Como parâmetros para essa chamada, o WWSAPI fornece as seguintes enumerações:

Ele também aceita parâmetros opcionais usando os seguintes tipos de dados:

Quando o proxy de serviço foi criado, a função WsCreateServiceProxy retorna uma referência ao proxy de serviço, WS_SERVICE_PROXY, por meio de um parâmetro out.

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

Quando o proxy de serviço foi criado, o aplicativo pode abrir o proxy de serviço para comunicação com um serviço chamando a função WsOpenServiceProxy , passando uma estrutura de endereço que contém o endereço de rede do ponto de extremidade de serviço ao qual se conectar.

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);

Quando o proxy de serviço for aberto, o aplicativo poderá usá-lo para fazer chamadas ao serviço.

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

Quando o aplicativo não precisa mais do proxy de serviço, ele fecha o proxy de serviço chamando a função WsCloseServiceProxy . Ele também libera a memória associada chamando WsFreeServiceProxy.

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

Reutilizando o Proxy de Serviço

Como alternativa, depois de chamar WsCloseServiceProxy , um aplicativo pode reutilizar o proxy de serviço chamando a função WsResetServiceProxy .

hr = WsResetServiceProxy(
    serviceProxy, 
    error);

Para obter mais informações sobre como os proxies de serviço são usados em contextos diferentes, consulte os seguintes tópicos:

Segurança

As seguintes considerações de design de aplicativo devem ser cuidadosamente observadas quando você usa a API de proxy de serviço WWSAPI:

  • O proxy de serviço não executará nenhuma validação dos dados além da validação do Perfil Básico 2.0 e da serialização XML. É responsabilidade do aplicativo validar os dados contidos nos parâmetros que ele recebe de volta como parte da chamada.
  • Configurar o número máximo de chamadas pendentes no proxy de serviço, usando o valor de enumeração WS_PROXY_PROPERTY_IDWS_PROXY_PROPERTY_MAX_PENDING_CALLS, fornece proteção contra um servidor de execução lenta. O máximo padrão é 100. Os aplicativos devem ter cuidado ao modificar os padrões.
  • O proxy de serviço não fornece garantias de segurança além daquelas especificadas na estrutura WS_SECURITY_DESCRIPTION usada para se comunicar com o servidor.
  • Tome cuidado ao modificar os padrões de mensagem e canal no proxy de serviço. Leia as considerações de segurança associadas a mensagens e canais antes de modificar qualquer uma das propriedades relacionadas.
  • O proxy de serviço criptografa todas as credenciais que mantém na memória.

Os seguintes elementos de API estão relacionados a proxies de serviço.

Callback Descrição
WS_PROXY_MESSAGE_CALLBACK Invocado quando os cabeçalhos da mensagem de entrada estão prestes a ser enviados por meio ou quando um cabeçalho de mensagem de saída é recebido.

 

Enumeração Descrição
WS_CALL_PROPERTY_ID Enumera parâmetros opcionais para configurar uma chamada em uma operação de serviço do lado do cliente.
WS_PROXY_PROPERTY_ID Enumera parâmetros opcionais para configurar o proxy de serviço.
WS_SERVICE_PROXY_STATE O estado do proxy de serviço.

 

Função Descrição
WsAbandonCall Abandona uma chamada especificada em um proxy de serviço especificado.
WsAbortServiceProxy Cancela todas as entradas e saídas pendentes em um proxy de serviço especificado.
WsCall Somente interno. Serializa argumentos em uma mensagem e a envia pelo canal.
WsCloseServiceProxy Fecha um proxy de serviço para comunicação.
WsCreateServiceProxy Cria um proxy de serviço.
WsFreeServiceProxy Libera a memória associada a um proxy de serviço.
WsGetServiceProxyProperty Recupera uma propriedade de proxy de serviço especificada.
WsOpenServiceProxy Abre um proxy de serviço para um ponto de extremidade de serviço.
WsResetServiceProxy Redefine o proxy de serviço.

 

Handle Descrição
WS_SERVICE_PROXY Um tipo opaco usado para fazer referência a um proxy de serviço.

 

Estrutura Descrição
WS_CALL_PROPERTY Especifica uma propriedade de chamada.
WS_PROXY_PROPERTY. Especifica uma propriedade proxy.