Metadatos de servicio
El host del servicio WWSAPI admite WS-MetadataExchange para sus puntos de conexión. Habilite este intercambio de metadatos en el host de servicio con los pasos siguientes:
- Especifique los documentos de metadatos en la propiedad WS_SERVICE_METADATA de la WS_SERVICE_HOST.
- Especifique el nombre del servicio en la propiedad WS_SERVICE_METADATA de la WS_SERVICE_HOST.
- Especifique el puerto para los puntos de conexión individuales mediante la propiedad WS_SERVICE_ENDPOINT_PROPERTY_METADATA en el WS_SERVICE_ENDPOINT.
- Habilite una o varias estructuras de WS_SERVICE_ENDPOINT para atender las solicitudes de WS-MetadataExchange.
- Opcionalmente, especifique WS_SERVICE_ENDPOINT_PROPERTY_METADATA_EXCHANGE_URL_SUFFIX en la enumeración WS_SERVICE_ENDPOINT_PROPERTY_ID para atender las solicitudes de Ws-MetadataExchange en una dirección específica.
Especificación de documentos de metadatos o nombre del servicio en el host de servicio
El primer paso es especificar los documentos de metadatos en el host de servicio. Para ello, recopile los documentos individuales como una matriz de WS_XML_STRING*. Estas cadenas pueden ser el esquema XML, WSDL o WS-Policy documento. Esto se especifica a través de la propiedad WS_SERVICE_PROPERTY_METADATA .
Opcionalmente, una aplicación también puede especificar el nombre del servicio y el espacio de nombres como parte del WS_SERVICE_METADATA. Si el documento de metadatos no especifica el elemento de servicio para el nombre de servicio especificado, el modelo de servicio generará un elemento de servicio con los puertos WSDL correspondientes para el servicio.
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);
Tenga en cuenta que no se realizará ninguna comprobación de los documentos de metadatos individuales en los documentos. Es responsabilidad de la aplicación validar el contenido de los documentos y asegurarse de que todas las rutas de acceso de importación estén relativamente especificadas.
El espacio de nombres especificado se usa para buscar el documento en el que el host de servicio agregará el elemento de servicio.
Adición del elemento de servicio al documento WSDL
El host de servicio proporciona facilidad para que la aplicación agregue un elemento de servicio en su nombre si aún no se ha especificado uno. Para habilitar este comportamiento, una aplicación debe especificar campos serivceName y serviceNs en la estructura WS_SERVICE_METADATA . Si serviceName y serviceNs son NULL , no se agrega ningún elemento de servicio al documento WSDL. Ambos se usan para identificar el documento en el que se va a agregar serviceElement.
Si no se especifica WS_SERVICE_PROPERTY_METADATA propiedad no se especificará ningún voladizo de metadatos en el host del servicio.
Especificar el puerto en el WS_SERVICE_ENDPOINT
Para que un WS_SERVICE_ENDPOINT esté disponible como puerto dentro del elemento de servicio en el documento WSDL, la aplicación debe especificar WS_SERVICE_ENDPOINT_PROPERTY_METADATA propiedad en él.
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);
Se supone que la referencia al nombre de enlace y al espacio de nombres existe en los documentos especificados en el host de servicio como parte de WS_SERVICE_PROPERTY_METADATA. El tiempo de ejecución no lo comprueba en nombre de la aplicación.
Habilitación del mantenimiento de WS-MetadataExchange en WS_SERVICE_ENDPOINT
Para atender las solicitudes de WS-MetadataExchange, el host de servicio debe tener al menos un punto de conexión habilitado para atender las solicitudes WS-MetadataExchange. Para ello, establezca la versión adecuada para WS-MetadataExchange en el 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);
Habilitación del mantenimiento HTTP GET en WS_SERVICE_ENDPOINT
Para atender solicitudes GETHTTP, el host de servicio debe tener al menos un punto de conexión habilitado para atender las solicitudes WS-MetadataExchange. Para ello, establezca la versión adecuada para WS-MetadataExchange en el 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);
Especificación del sufijo de dirección URL para solicitudes de Ws-MetadataExchange
Opcionalmente, una aplicación solo puede habilitar la aceptación de solicitudes para WS-MetadataExchange en una ruta de acceso específica. Para ello, se especifica un sufijo para el WS_SERVICE_ENDPOINT especificado. Este sufijo se concatena tal y como está en la dirección URL real del WS_SERVICE_ENDPOINT. La cadena concatenada se usa como la dirección URL coincidente con el encabezado "to" recibido.
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);
Los siguientes elementos de API se relacionan con la metada de servicio.
Enumeración | Descripción |
---|---|
WS_METADATA_EXCHANGE_TYPE | Habilita o deshabilita el mantenimiento de WS-MetadataExchange y HTTP GET en el punto de conexión. |
Estructura | Descripción |
---|---|
WS_SERVICE_ENDPOINT_METADATA | Representa el elemento de puerto del punto de conexión. |
WS_SERVICE_METADATA | Especifica la matriz de documentos de metadatos del servicio. |
WS_SERVICE_METADATA_DOCUMENT | Especifica los documentos individuales que componen los metadatos del servicio. |