정책 지원
Wsutil은 입력 메타데이터에 지정된 정책을 처리하고 서비스 모델 지원을 위한 도우미 루틴을 생성합니다.
wsutil에서 정책 지원을 사용하는 방법
개발자는 wsutil 컴파일러에서 정책 지원을 사용하려면 다음 단계를 수행해야 합니다.
- 대상 웹 서비스에 필요한 모든 입력 메타데이터 파일을 수집합니다.
- wsutil.exe사용하여 수집된 모든 WSDL/XSD/정책 파일을 컴파일합니다. Wsutil은 각 입력 WSDL 및 XSD 파일에 대해 하나의 스텁 파일 및 헤더 파일 집합을 생성합니다.
- 생성된 헤더 파일을 검사하면 모든 정책 도우미 루틴 이름이 헤더 파일의 시작 부분에 있는 주석 섹션에 나열됩니다.
- bindingName_CreateServiceProxy 도우미 루틴을 사용하여 서비스 프록시를 만듭니다.
- bindingName_CreateServiceEndpoint 도우미 루틴을 사용하여 서비스 엔드포인트를 만듭니다.
- 메서드 서명에 지정된 WS_bindingTemplateType_BINDING_TEMPLATE 구조를 채웁니다. 개발자는 필요에 따라 추가 채널 속성 및/또는 보안 속성을 제공할 수 있습니다.
- 성공적인 반환 서비스 프록시 또는 서비스 엔드포인트에서 도우미 루틴을 호출합니다.
다음 섹션에서는 관련 항목에 대해 자세히 설명합니다.
정책 입력 처리
기본적으로 wsutil은 "/nopolicy" 옵션으로 호출되지 않는 한 항상 정책 템플릿을 생성합니다. 정책은 WSDL 파일의 일부로 포함되거나 wsutil이 입력으로 사용하는 정책 메타데이터 파일로 별도로 만들 수 있습니다. 컴파일러 옵션 "/wsp:"는 지정된 입력 메타데이터가 정책 파일임을 나타내는 데 사용됩니다. Wsutil은 다음 컴파일을 사용하여 잠재적인 정책 관련 도우미를 생성합니다.
wsutil /wsdl:trusted.wsdl /wsdl:trusted1.wsdl
wstuil /wsdl:input.wsdl /wsp:policy.wsp
다음 예제와 같이 "/nopolicy" 옵션을 사용하면 정책 도우미가 생성되지 않습니다.
wsutil /nopolicy /wsdl:trusted.wsdl /wsdl:trusted1.wsdl
wsutil 컴파일러에서 생성된 정책 관련 코드
메타데이터 매핑 페이지에는 바인딩 형식이 서로 다른 메타데이터 구문 간의 매핑이 자세히 설명됩니다.
정책 설정에는 다음 세 가지 범주의 정책 설정을 지정할 수 있습니다.
- 채널 속성입니다. 현재 지원되는 채널 속성은 WS_CHANNEL_PROPERTY_ENCODING, WS_CHANNEL_PROPERTY_ADDRESSING_VERSION 및 WS_CHANNEL_PROPERTY_ENVELOPE_VERSION.
- 보안 속성입니다. 현재 WS_SECURITY_PROPERTY_TIMESTAMP_USAGE, WS_SECURITY_PROPERTY_SECURITY_HEADER_LAYOUT, WS_SECURITY_PROPERTY_TRANSPORT_PROTECTION_LEVEL 및 WS_SECURITY_PROPERTY_SECURITY_HEADER_VERSION보안 속성만 지원됩니다.
- 보안 바인딩. 현재 WS_HTTP_HEADER_AUTH_SECURITY_BINDING, WS_SSL_TRANSPORT_SECURITY_BINDING, WS_TCP_SSPI_TRANSPORT_SECURITY_BINDING, WS_USERNAME_MESSAGE_SECURITY_BINDING, WS_KERBEROS_APREQ_MESSAGE_SECURITY_BINDING등 보안 바인딩만 지원됩니다. 및 WS_SECURITY_CONTEXT_MESSAGE_SECURITY_BINDING.
바인딩 템플릿 유형
wsutil에서 지원되는 바인딩 수는 제한되어 있습니다. 이러한 바인딩의 지원되는 모든 조합은 WS_BINDING_TEMPLATE_TYPE 정의에 나열됩니다. 예를 들어 wsdl의 다음 바인딩에 대해
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
Wsutil은 이 바인딩에 대한 WS_HTTP_BINDING_TEMPLATE_TYPE 바인딩 템플릿 형식을 생성합니다.
정책 설명
입력 정책 설정을 사용하여 wsutil은 템플릿 형식과 정책에 지정된 값을 포함하여 입력 정책을 설명하는 정책 설명 집합을 생성합니다. 예를 들어 입력의 경우
<wsdl:binding...>
<soap11:binding.../> =< WS_ENVELOPE_VERSION_SOAP_1_1
</wsdl:binding>
wsutil은 다음과 같은 채널 속성 설명을 생성합니다.
WS_ENVELOPE_VERSION_SOAP_1_1,
{
WS_CHANNEL_PROPERTY_ENVELOPE_VERSION,
(void*)&locaDefinitions.policies.bindHostedClientSoap.envelopeVersion, //points to the WS_ENVELOPE_VERSION_SOAP_1_1 value above
sizeof(&localDefinitions.policies.bindHostedClientSoap.envelopeVersion),
},
한 바인딩의 모든 정책 설정(채널 속성, 보안 속성 및 보안 바인딩 속성)은 하나의 WS_bindingTemplateType_POLICY_DESCRIPTION 구조로 집계됩니다. WS_BINDING_TEMPLATE_TYPE wsutil에서 지원하는 다양한 바인딩 정책 조합을 지정합니다.
애플리케이션에서 채울 템플릿 구조
정책 설명에는 지정된 바인딩에 대한 입력 메타데이터에 지정된 모든 정책 정보가 포함되지만, 해당 정책 설정을 사용하여 서비스 프록시 및/또는 서비스 엔드포인트를 만들 때 정책에 표시할 수 없는 정보가 있습니다. 예를 들어 애플리케이션은 HTTP 헤더 인증을 위한 자격 증명을 제공해야 합니다.
애플리케이션은 webservices.h에 정의된 각 다른 바인딩 템플릿 형식에 대한 WS_bindingTemplateType_BINDING_TEMPLATE 명명된 템플릿 구조를 입력해야 합니다.
struct WS_bindingTemplateType_BINDING_TEMPLATE
{
WS_CHANNEL_PROPERTIES channelProperties;
WS_SECURITY_PROPERTIES securityProperties;
possible_list_of_SECURITY_BINDING_TEMPLATEs;
...
};
보안 바인딩 템플릿 목록은 일치하는 보안 바인딩에 따라 선택 사항입니다. 예를 들어 WS_SSL_TRANSPORT_SECURITY_BINDING_TEMPLATE 필드는 애플리케이션이 자격 증명 정보를 포함하여 SSL 관련 보안 바인딩 정보를 제공하기 위해 WS_HTTP_SSL_BINDING_TEMPLATE 표시됩니다.
애플리케이션은 웹 서비스 템플릿 API를 호출하기 전에 이 구조의 모든 필드를 채워야 합니다. 정책에서 나타낼 수 없는 보안 바인딩 속성뿐만 아니라 추가 보안 속성을 입력해야 하며 웹 서비스 API는 런타임에 두 속성 집합을 병합합니다. 적용할 수 없는 경우 필드를 0으로 표시할 수 있습니다. 예를 들어 추가 보안 속성이 필요하지 않은 경우 securityProperties를 0으로 설정할 수 있습니다.
헤더 파일의 도우미 루틴 및 정책 설명 선언
wsutil은 애플리케이션이 서비스 프록시 및 서비스 엔드포인트를 더 쉽게 만들 수 있도록 서비스 모델 계층에서 더 나은 지원을 용이하게 하는 도우미 루틴을 만듭니다. 애플리케이션에서 직접 사용할 수 있도록 정책 설명도 노출됩니다. CreateSerivceProxy 도움말 루틴은 다음과 같습니다.
HRESULT bindingName_CreateServiceProxy(
__in_ecount_opt(propertyCount) const WS_PROXY_PROPERTY* properties,
__in const ULONG propertyCount,
__in WS_constraintName_BINDING_TEMPLATE* templateValue,
__deref_out WS_SERVICE_PROXY** serviceProxy,
__in_opt WS_ERROR* error);
개발자는 이러한 도우미 루틴을 사용하는 것이 좋습니다. 하지만 webservices.dll제공된 런타임 아래 루틴을 직접 사용할 수도 있습니다. 개발자는 서비스 모델 계층을 사용하여 프로그래밍할 때 정책 설명을 직접 사용하지 않는 것이 좋습니다.
고급 사용자에 대한 헤더에도 정책 설명 참조가 생성됩니다. 개발자가 서비스 모델 기능을 사용하지 않는 경우 정책 설명을 직접 사용할 수 있습니다.
struct {
...
struct {
...
} contracts;
struct {
WS_bindingTemplateType_POLICY_DESCRIPTION bindingName;
...
} policies;
}
스텁 파일의 정의 프로토타입
바인딩당 단일 정책 설명 구조 필드와 내부적으로 참조되는 도우미 설명은 로컬 프로토타입 구조에서 만들어집니다. 정책 설명은 WS_CONTRACT_DESCRIPTION 생성되는 파일에 생성됩니다. 일반적으로 스텁 파일에는 정책 사양에 대한 모든 세부 정보가 포함되어 있지만 개발자는 개발 중에 스텁 파일을 검사할 필요가 없습니다.
struct {
...
struct {
... } contracts;
...
struct {
struct {
hierarchy of policy template descriptions;
} bindingName;
...
list of bindings in the input wsdl file.
} policies;
} fileNameLocalDefinitions;
스텁 파일의 도우미 루틴 구현
Wsutil은 WsCreateServiceProxy애플리케이션 호출을 간소화하고 정책 설정에 제공된 정보를 기반으로 WS_SERVICE_ENDPOINT 만드는 도우미 루틴을 생성합니다.
지정된 포트에 대해 지정된 바인딩 제약 조건에 따라 첫 번째 인수는 템플릿 구조에 따라 다릅니다. 다음 예제에서는 HTTP 전송을 가정합니다. 서비스 프록시 만들기에 대한 서명은 하나의 추가 채널 형식 매개 변수와 유사합니다.
HRESULT bindingName_CreateServiceProxy(
__in WS_bindingTemplateType_BINDING_TEMPLATE* templateValue,
__in_ecount_opt(propertyCount) const WS_PROXY_PROPERTY* properties,
__in const ULONG propertyCount,
__deref_out WS_SERVICE_PROXY** serviceProxy,
__in_opt WS_ERROR* error)
{
return WsCreateServiceProxyFromTemplate(
WS_CHANNEL_TYPE_REQUEST, // this is fixed for http, requires input for TCP
properties,
propertyCount,
WS_bindingTemplateType_BINDING_TEMPLATE_TYPE,
templateValue,
sizeof(WS_bindingTemplateType_BINDING_TEMPLATE),
&fileName.policies.bindingName, // template description as generated in the stub file
sizeof(WS_constraintName_POLICY_DESCRIPTION),
serviceProxy,
error);
}
HRESULT bindingName_CreateServiceEndpoint(
__in WS_bindingTemplateType_BINDING_TEMPLATE* templateValue,
__in_opt const WS_STRING* addressUrl,
__in bindingNameFunctionTable* functionTable,
__in WS_SERVICE_SECURITY_CALLBACK authorizationCallback,
__in const WS_SERVICE_ENDPOINT_PROPERTY* properties,
__in ULONG propertyCount,
__in WS_HEAP* heap,
__deref_out WS_SERVICE_ENDPOINT** serviceEndpoint,
__in_opt WS_ERROR* error)
{
WS_SERVICE_CONTRACT serviceContract;
serviceContract.contractDescription = &fileName.contracts.bindingName;
serviceContract.defaultMessageHandlerCallback = NULL;
serviceContract.methodTable = (const void *)functionTable;
return WsCreateServiceEndpointFromTemplate(
properties,
propertyCount,
addressUrl, // service endpoint address
WS_CHANNEL_TYPE_RESPONSE, // this is fixed for http, requires input for TCP
&serviceContract,
authorizationCallback,
heap,
WS_bindingTemplateType_BINDING_TEMPLATE_TYPE,
templateValue,
sizeof(WS_bindingTemplateType_BINDING_TEMPLATE),
&fileName.policies.bindingName, // template description as generated in the stub file
sizeof(WS_bindingTemplateType_POLICY_DESCRIPTION),
serviceEndpoint,
error);
}
지원되는 정책 설정
다음 표에는 지원되는 모든 바인딩 템플릿 형식, 형식에 필요한 일치하는 보안 바인딩, 형식에 대한 애플리케이션에서 채울 템플릿 구조 및 일치하는 설명 형식이 나열되어 있습니다. 애플리케이션 개발자는 지정된 정책에 필요한 보안 바인딩이 무엇인지 이해해야 하는 반면 애플리케이션은 템플릿 구조를 채워야 합니다.
예를 들어 WS_HTTP_SSL_BINDING_TEMPLATE_TYPE 바인딩에 대한 입력 정책이 HTTP 전송을 지정하고 WS_SSL_TRANSPORT_SECURITY_BINDING나타냅니다. 애플리케이션은 도우미 루틴을 호출하기 전에 WS_HTTP_SSL_BINDING_TEMPLATE 구조를 채워야 하며 일치하는 정책 설명은 WS_HTTP_SSL_POLICY_DESCRIPTION. 구체적으로 WSDL의 바인딩 섹션에는 다음 세그먼트가 포함되어 있습니다.
<wsp:Policy...>
<sp:TransportBinding...>
<wsp:Policy...>
<sp:TransportToken...>
<wsp:Policy...>
<sp:HttpsToken.../>
</wsp:Policy...>
</sp:TransportToken...>
</wsp:Policy>
</sp:TransportBinding...>
</wsp:Policy>
<wsdl:binding...>
<soap11:binding.../> => WS_ENVELOPE_VERSION_SOAP_1_1
</wsdl:binding>
보안 컨텍스트 지원
보안 컨텍스트부트스트랩 채널은 서비스 채널에서 보안 대화를 설정하기 위해 만들어집니다. Wsutil은 부트스트랩 채널이 동일한 채널 속성과 보안 속성을 가진 서비스 채널과 동일한 시나리오만 지원합니다. 전송 보안은 보안 컨텍스트 메시지 바인딩에 필요합니다. wsutil은 다른 메시지 보안 바인딩이 있는 부트스트랩 채널을 지원하지만 다른 메시지 보안 바인딩과 조합하지 않고 서비스 채널에서 유일한 메시지 보안 바인딩으로 보안 컨텍스트만 지원합니다. 개발자는 정책 템플릿 지원 외부에서 이러한 조합을 지원할 수 있습니다.
다음 열거형은 정책 지원의 일부입니다.
다음 함수는 정책 지원의 일부입니다.
다음 구조는 정책 지원의 일부입니다.
- WS_HTTP_BINDING_TEMPLATE
- WS_HTTP_HEADER_AUTH_BINDING_TEMPLATE
- WS_HTTP_HEADER_AUTH_POLICY_DESCRIPTION
- WS_HTTP_HEADER_AUTH_SECURITY_BINDING_POLICY_DESCRIPTION
- WS_HTTP_HEADER_AUTH_SECURITY_BINDING_TEMPLATE
- WS_HTTP_POLICY_DESCRIPTION
- WS_HTTP_SSL_BINDING_TEMPLATE
- WS_HTTP_SSL_HEADER_AUTH_BINDING_TEMPLATE
- WS_HTTP_SSL_HEADER_AUTH_POLICY_DESCRIPTION
- WS_HTTP_SSL_KERBEROS_APREQ_BINDING_TEMPLATE
- WS_HTTP_SSL_KERBEROS_APREQ_POLICY_DESCRIPTION
- WS_HTTP_SSL_KERBEROS_APREQ_SECURITY_CONTEXT_BINDING_TEMPLATE
- WS_HTTP_SSL_KERBEROS_APREQ_SECURITY_CONTEXT_POLICY_DESCRIPTION
- WS_HTTP_SSL_POLICY_DESCRIPTION
- WS_HTTP_SSL_USERNAME_BINDING_TEMPLATE
- WS_HTTP_SSL_USERNAME_POLICY_DESCRIPTION
- WS_HTTP_SSL_USERNAME_SECURITY_CONTEXT_BINDING_TEMPLATE
- WS_HTTP_SSL_USERNAME_SECURITY_CONTEXT_POLICY_DESCRIPTION
- WS_KERBEROS_APREQ_MESSAGE_SECURITY_BINDING_POLICY_DESCRIPTION
- WS_KERBEROS_APREQ_MESSAGE_SECURITY_BINDING_TEMPLATE
- WS_SECURITY_CONTEXT_MESSAGE_SECURITY_BINDING_POLICY_DESCRIPTION
- WS_SECURITY_CONTEXT_MESSAGE_SECURITY_BINDING_TEMPLATE
- WS_SECURITY_CONTEXT_SECURITY_BINDING_POLICY_DESCRIPTION
- WS_SECURITY_CONTEXT_SECURITY_BINDING_TEMPLATE
- WS_SSL_TRANSPORT_SECURITY_BINDING_POLICY_DESCRIPTION
- WS_SSL_TRANSPORT_SECURITY_BINDING_TEMPLATE
- WS_SSPI_TRANSPORT_SECURITY_BINDING_POLICY_DESCRIPTION
- WS_TCP_BINDING_TEMPLATE
- WS_TCP_POLICY_DESCRIPTION
- WS_TCP_SSPI_BINDING_TEMPLATE
- WS_TCP_SSPI_KERBEROS_APREQ_BINDING_TEMPLATE
- WS_TCP_SSPI_KERBEROS_APREQ_POLICY_DESCRIPTION
- WS_TCP_SSPI_KERBEROS_APREQ_SECURITY_CONTEXT_BINDING_TEMPLATE
- WS_TCP_SSPI_KERBEROS_APREQ_SECURITY_CONTEXT_POLICY_DESCRIPTION
- WS_TCP_SSPI_POLICY_DESCRIPTION
- WS_TCP_SSPI_TRANSPORT_SECURITY_BINDING_TEMPLATE
- WS_TCP_SSPI_USERNAME_BINDING_TEMPLATE
- WS_TCP_SSPI_USERNAME_POLICY_DESCRIPTION
- WS_TCP_SSPI_USERNAME_SECURITY_CONTEXT_BINDING_TEMPLATE
- WS_TCP_SSPI_USERNAME_SECURITY_CONTEXT_POLICY_DESCRIPTION
- WS_USERNAME_MESSAGE_SECURITY_BINDING_POLICY_DESCRIPTION
- WS_USERNAME_MESSAGE_SECURITY_BINDING_TEMPLATE