서비스 메타데이터

WWSAPI 서비스 호스트는 엔드포인트에 대한 WS-MetadataExchange 지원합니다. 다음 단계를 수행하여 서비스 호스트에서 이러한 메타데이터 교환을 사용하도록 설정합니다.

서비스 호스트에서 메타데이터 문서/서비스 이름 지정

첫 번째 단계는 서비스 호스트에서 메타데이터 문서를 지정하는 것입니다. 개별 문서를 WS_XML_STRING*의 배열로 수집하여 이 작업을 수행합니다. 이러한 문자열은 XML 스키마, WSDL 또는 WS-Policy 문서일 수 있습니다. WS_SERVICE_PROPERTY_METADATA 속성을 통해 지정됩니다.

필요에 따라 애플리케이션은 서비스 이름과 네임스페이스를 WS_SERVICE_METADATA 일부로 지정할 수도 있습니다. 메타데이터 문서에서 지정된 서비스 이름에 대한 서비스 요소를 지정하지 않으면 서비스 모델은 서비스에 해당하는 WSDL 포트를 사용하여 서비스 요소를 생성합니다.

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

개별 메타데이터 문서의 확인은 문서에 대해 수행되지 않습니다. 문서의 내용에 대한 유효성을 검사하고 모든 가져오기 경로가 상대적으로 지정되었는지 확인하는 것은 애플리케이션의 책임입니다.

지정된 네임스페이스는 서비스 호스트에서 서비스 요소를 추가할 문서를 찾는 데 사용됩니다.

WSDL 문서에 서비스 요소 추가

서비스 호스트는 아직 지정되지 않은 경우 애플리케이션이 대신 서비스 요소를 추가할 수 있는 기능을 제공합니다. 이 동작을 사용하도록 설정하려면 애플리케이션이 WS_SERVICE_METADATA 구조에 serivceName 및 serviceNs 필드를 지정해야 합니다. serviceName 및 serviceN이 모두 NULL 인 경우 WSDL 문서에 서비스 요소가 추가되지 않습니다. 둘 다 serviceElement가 추가될 문서를 식별하는 데 사용됩니다.

WS_SERVICE_PROPERTY_METADATA 속성을 지정하지 않으면 서비스 호스트에서 메타데이터 exhange가 수행되지 않습니다.

WS_SERVICE_ENDPOINT 포트 지정

WS_SERVICE_ENDPOINT WSDL 문서의 서비스 요소 내에서 포트로 사용할 수 있도록 하려면 애플리케이션에서 WS_SERVICE_ENDPOINT_PROPERTY_METADATA 속성을 지정해야 합니다.

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

바인딩 이름 및 네임스페이스에 대한 참조가 WS_SERVICE_PROPERTY_METADATA 일부로 서비스 호스트에 지정된 문서에 있다고 가정합니다. 런타임은 애플리케이션을 대신하여 이를 확인하지 않습니다.

WS_SERVICE_ENDPOINT WS-MetadataExchange 서비스 사용

WS-MetadataExchange 요청을 처리하려면 서비스 호스트에 WS-MetadataExchange 요청을 서비스하기 위해 하나 이상의 엔드포인트를 사용하도록 설정해야 합니다. 이 작업은 WS_SERVICE_ENDPOINT WS-MetadataExchange 적절한 버전을 설정하여 수행됩니다.

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

WS_SERVICE_ENDPOINT HTTP GET 서비스 사용

서비스HTTP GET 요청을 처리하려면 서비스 호스트에 WS-MetadataExchange 요청을 서비스하기 위해 하나 이상의 엔드포인트를 사용하도록 설정해야 합니다. 이 작업은 WS_SERVICE_ENDPOINT WS-MetadataExchange 적절한 버전을 설정하여 수행됩니다.

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

Ws-MetadataExchange 요청에 대한 URL 접미사 지정

애플리케이션은 필요에 따라 특정 경로에서 WS-MetadataExchange 대한 요청만 수락하도록 설정할 수 있습니다. 이 작업은 지정된 WS_SERVICE_ENDPOINT 대한 접미사를 지정하여 수행됩니다. 이 접미사는 WS_SERVICE_ENDPOINT 실제 URL에 있는 그대로 연결됩니다. 연결된 문자열은 수신된 'to' 헤더와 일치하는 URL로 사용됩니다.

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

다음 API 요소는 서비스 메타와 관련이 있습니다.

열거형 설명
WS_METADATA_EXCHANGE_TYPE 엔드포인트에서 WS-MetadataExchange 및 HTTP GET 서비스를 사용하거나 사용하지 않도록 설정합니다.

 

구조체 설명
WS_SERVICE_ENDPOINT_METADATA 엔드포인트의 포트 요소를 나타냅니다.
WS_SERVICE_METADATA 서비스 메타데이터 문서 배열을 지정합니다.
WS_SERVICE_METADATA_DOCUMENT 서비스 메타데이터를 구성하는 개별 문서를 지정합니다.