Metadados do serviço
O host de serviço WWSAPI suporta WS-MetadataExchange para seus endpoints. Você habilita essa troca de metadados no host de serviço com as seguintes etapas:
- Especifique documentos de metadados na propriedade WS_SERVICE_METADATA no WS_SERVICE_HOST.
- Especifique o nome do serviço na propriedade WS_SERVICE_METADATA no WS_SERVICE_HOST.
- Especifique a porta para pontos de extremidade individuais usando a propriedade WS_SERVICE_ENDPOINT_PROPERTY_METADATA no WS_SERVICE_ENDPOINT.
- Habilite uma ou mais estruturas WS_SERVICE_ENDPOINT para atender às solicitações de WS-MetadataExchange.
- Opcionalmente, especifique WS_SERVICE_ENDPOINT_PROPERTY_METADATA_EXCHANGE_URL_SUFFIX na enumeração WS_SERVICE_ENDPOINT_PROPERTY_ID para atender Ws-MetadataExchange solicitações em um endereço específico.
Especificando documentos de metadados / nome do serviço no host de serviço
A primeira etapa é especificar os documentos de metadados no host de serviço. Faça isso reunindo os documentos individuais como uma matriz de WS_XML_STRING*'s. Essas cadeias de caracteres podem ser esquema XML, WSDL ou documento WS-Policy. Isso é especificado através da propriedade WS_SERVICE_PROPERTY_METADATA.
Opcionalmente, um aplicativo também pode especificar o nome do serviço e o namespace como parte do WS_SERVICE_METADATA. Se o documento de metadados não especificar o elemento de serviço para o nome de serviço fornecido, o modelo de serviço gerará um elemento de serviço com as portas WSDL correspondentes para o serviço.
WS_SERVICE_METADATA_DOCUMENT document = {0};
WS_STRING documentName = WS_STRING_VALUE(L"a.wsdl");
document.name = &documentName;
document.content = &wsdlDocument
WS_SERVICE_METADATA_DOCUMENT** metadataDocuments [] = {&document};
WS_SERVICE_METADATA serviceMetadata = {0};
// Specify Metadata documents
serviceMetadata.count = WsCountOf(metadataDocuments);
serviceMetadata.documents = &metadataDocuments;
// Specify service name
serviceMetadata.serviceName = &serviceName;
serviceMetadata.serviceNs = &serviceNamespace;
WS_SERVICE_PROPERTY serviceProperties[1] = {0};
serviceProperties[0].id = WS_SERVICE_PROPERTY_METADATA;
serviceProperties[0].value = &serviceMetadata;
serviceProperties[0].ValueSize = sizeof(serviceMetadata);
Observe que nenhuma verificação dos documentos de metadados individuais será realizada nos documentos. É da responsabilidade da aplicação validar o conteúdo dos documentos e garantir que todos os caminhos de importação são relativamente especificados.
O namespace especificado é usado para localizar o documento no qual o elemento de serviço será adicionado pelo host de serviço.
Adição de elemento de serviço ao documento WSDL
O host de serviço fornece facilidade para o aplicativo adicionar um elemento de serviço em seu nome, se ainda não estiver especificado. Para habilitar esse comportamento, um aplicativo deve especificar os campos serivceName e serviceNs na estrutura WS_SERVICE_METADATA. Se serviceName e serviceNs forem NULL nenhum elemento de serviço será adicionado ao documento WSDL. Ambos são usados para identificar o documento no qual o serviceElement será adicionado.
Se WS_SERVICE_PROPERTY_METADATA propriedade não for especificada, nenhuma troca de metadados ocorrerá no host de serviço.
Especificando a porta no WS_SERVICE_ENDPOINT
Para que um WS_SERVICE_ENDPOINT esteja disponível como uma porta dentro do elemento de serviço no documento WSDL, o aplicativo deve especificar WS_SERVICE_ENDPOINT_PROPERTY_METADATA propriedade nele.
WS_SERVICE_ENDPOINT_METADATA endpointPort = {0}
endpointPort.name = &portName;
endpointPort.bindingName = &bindingName;
endpointPort.bindingNs = &bindingNs;
WS_SERVICE_ENDPOINT_PROPERTY serviceProperties[1] = {0};
serviceProperties[0].id = WS_SERVICE_ENDPOINT_PROPERTY_METADATA;
serviceProperties[0].value = &endpointPort;
serviceProperties[0].valueSize = sizeof(endpointPort);
Supõe-se que a referência ao nome de associação e namespace existe nos documentos especificados no host de serviço como parte de WS_SERVICE_PROPERTY_METADATA. O tempo de execução não verifica isso em nome do aplicativo.
Habilite a manutenção de WS-MetadataExchange no WS_SERVICE_ENDPOINT
Para atender às solicitações de WS-MetadataExchange, o host de serviço deve ter pelo menos um ponto de extremidade habilitado para atender WS-MetadataExchange solicitações. Isso é feito definindo a versão apropriada para WS-MetadataExchange no WS_SERVICE_ENDPOINT.
WS_METADATA_EXCHANGE_TYPE metadataExchangeType = WS_METADATA_EXCHANGE_TYPE_MEX;
WS_SERVICE_ENDPOINT_PROPERTY serviceProperties[1] = {0};
serviceProperties[0].id = WS_SERVICE_ENDPOINT_PROPERTY_METADATA_EXCHANGE_TYPE;
serviceProperties[0].value = &metadataExchangeType;
serviceProperties[0].ValueSize = sizeof(metadataExchangeType);
Habilitar o serviço HTTP GET no WS_SERVICE_ENDPOINT
Para atender solicitações HTTP GET, o host de serviço deve ter pelo menos um ponto de extremidade habilitado para atender WS-MetadataExchange solicitações. Isso é feito definindo a versão apropriada para WS-MetadataExchange no WS_SERVICE_ENDPOINT.
WS_METADATA_EXCHANGE_TYPE metadataExchangeType = WS_METADATA_EXCHANGE_TYPE_HTTP_GET;
WS_SERVICE_ENDPOINT_PROPERTY serviceProperties[1] = {0};
serviceProperties[0].id = WS_SERVICE_ENDPOINT_PROPERTY_METADATA_EXCHANGE_TYPE;
serviceProperties[0].value = &metadataExchangeType;
serviceProperties[0].ValueSize = sizeof(metadataExchangeType);
Especificando o sufixo de URL para solicitações de Ws-MetadataExchange
Opcionalmente, um aplicativo pode habilitar apenas a aceitação de solicitações de WS-MetadataExchange em um caminho específico. Isso é feito especificando um sufixo para a WS_SERVICE_ENDPOINT dada. Este sufixo é concatenado as-is ao URL real do WS_SERVICE_ENDPOINT. A cadeia de caracteres concatenada é usada como o URL correspondente ao cabeçalho 'para' recebido.
const WS_STRING suffix = WS_STRING_VALUE(L"mex");
WS_SERVICE_ENDPOINT_PROPERTY serviceProperties[1] = {};
serviceProperties[0].id = WS_SERVICE_ENDPOINT_PROPERTY_METADATA_EXCHANGE_URL_SUFFIX;
serviceProperties[0].value = &suffix;
serviceProperties[0].valueSize = sizeof(suffix);
Os seguintes elementos da API estão relacionados à metada de serviço.
Enumeração | Descrição |
---|---|
WS_METADATA_EXCHANGE_TYPE | Habilita ou desabilita o serviço WS-MetadataExchange e HTTP GET no ponto de extremidade. |
Estrutura | Descrição |
---|---|
WS_SERVICE_ENDPOINT_METADATA | Representa o elemento port para o ponto de extremidade. |
WS_SERVICE_METADATA | Especifica a matriz de documentos de metadados de serviço. |
WS_SERVICE_METADATA_DOCUMENT | Especifica os documentos individuais que compõem os metadados do serviço. |