Compartilhar via


Criar manualmente um proxy de serviço para um serviço WCF

A maneira mais fácil de criar um proxy de serviço cliente para um serviço WCF (Windows Communication Foundation) é na camada Modelo de Serviço com a ferramenta WsUtil, conforme descrito no tópico Criando um cliente . No entanto, se necessário, você também pode criar um proxy de serviço manualmente. Essa API inclui uma função WsCreateServiceProxy para criar o proxy de serviço, bem como estruturas, enumerações e assim por diante para definir as propriedades necessárias para interoperar com o WCF.

O WCF fornece várias associações padrão, cada uma direcionada a um cenário de uso específico. Qual associação do serviço ao qual você está tentando se conectar usa, por sua vez, determina quais propriedades de canal você precisa personalizar para que o proxy de serviço se comunique com o serviço.

Criando um proxy de serviço para WSHttpBinding do WCF

WSHttpBinding é para o cenário principal de serviços Web da Internet. Ele usa as versões SOAP 1.2 e WS-Addressing versão 1.0 mais recentes e habilita uma ampla gama de configurações de segurança nos transportes HTTP e HTTPS públicos. O WWSAPI não tem um equivalente do WSHttpBinding (ou qualquer uma das associações padrão do WCF, aliás), mas como sua versão SOAP padrão, WS-Addressing versão e formato de codificação correspondem às do WSHttpBinding, criar um proxy de serviço para um serviço que usa o WSHttpBinding é simples. Por exemplo, para criar um proxy de serviço para se comunicar com um ponto de extremidade WSHttpBinding sem segurança, você pode simplesmente usar código como o snippet a seguir (declaração de variável e criação de heap e erro são omitidos). Observe que nenhuma descrição de segurança ou propriedades de canal é especificada na chamada para a função 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);

A função cria o proxy de serviço e retorna um ponteiro para ele no parâmetro serviceProxy (&proxy na chamada de função acima).

Criando um proxy de serviço para BasicHttpBinding do WCF

Quando você cria manualmente um proxy de serviço para um serviço WCF que usa uma associação BasicHttpBinding, no entanto, é necessário definir a versão SOAP e WS-Addressing propriedades do canal. Isso ocorre porque o WWSAPI usa como padrão SOAP versão 1.2 e WS-Addressing 1.0. O BasicHttpBinding do WCF, por outro lado, usa SOAP versão 1.1 e nenhum WS-Addressing.

Para definir a versão SOAP e WS-Addrssing propriedades do canal, declare uma matriz de estruturas WS_CHANNEL_PROPERTY para manter as propriedades do canal e as informações relacionadas.

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

Em seguida, passe a matriz de propriedades de canal (channelProperties) e a contagem de propriedades (channelPropertyCount) para o WsCreateServiceProxy (ou WsCreateChannel se você estiver trabalhando na camada de canal).

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

A matriz declarada para manter as propriedades é copiada em WsCreateServiceProxy e, como resultado, você pode liberar a memória para a matriz de propriedades imediatamente após chamar a função. Além disso, se você alocar a memória da pilha (como o snippet de código acima), também poderá retornar da função imediatamente após a chamada.

Outras Associações

Além disso, o WWSAPI fornece mecanismos para criar proxies de serviço para se comunicar com serviços WCF usando outras associações, como NetTcpBinding e WSFederationHttpBinding. Muitas dessas associações exigem a configuração de propriedades de canal adicionais, como descritores de segurança. Para obter exemplos que ilustram o uso de outras associações, consulte a seção Exemplos dos Serviços Web do Windows, em particular os exemplos de camada de canal TCP, exemplos de camada de canal HTTP e subseções de exemplos de camada de canal de segurança .