Compartilhar via


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:

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.