Metadados de serviço
O host do serviço WWSAPI dá suporte a WS-MetadataExchange para seus pontos de extremidade. Habilite 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 de 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 do serviço. Faça isso coletando os documentos individuais como uma matriz de WS_XML_STRING*s. Essas cadeias de caracteres podem ser esquema XML, WSDL ou WS-Policy documento. Isso é especificado por meio 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á executada nos documentos. É responsabilidade do aplicativo validar o conteúdo dos documentos e garantir que todos os caminhos de importação sejam 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 do elemento de serviço ao documento WSDL
O host de serviço fornece uma 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 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, nenhum exhange 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 da associação e ao namespace exista nos documentos especificados no host de serviço como parte de WS_SERVICE_PROPERTY_METADATA. O runtime não verifica isso em nome do aplicativo.
Habilitar a manutenção de WS-MetadataExchange em WS_SERVICE_ENDPOINT
Para atender WS-MetadataExchange solicitações, 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 a manutenção HTTP GET no WS_SERVICE_ENDPOINT
Para solicitações GET de serviceHTTP, 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 para WS-MetadataExchange em um caminho específico. Isso é feito especificando um sufixo para o WS_SERVICE_ENDPOINT fornecido. Esse sufixo é concatenado no estado em que se encontra para a URL real do WS_SERVICE_ENDPOINT. A cadeia de caracteres concatenada é usada como a URL correspondente ao cabeçalho 'to' 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 elementos de API a seguir estão relacionados aos metadados de serviço.
Enumeração | Descrição |
---|---|
WS_METADATA_EXCHANGE_TYPE | Habilita ou desabilita a manutenção WS-MetadataExchange e HTTP GET no ponto de extremidade. |
Estrutura | Descrição |
---|---|
WS_SERVICE_ENDPOINT_METADATA | Representa o elemento de porta 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. |