정책 지원

Wsutil은 입력 메타데이터에 지정된 정책을 처리하고 서비스 모델 지원을 위한 도우미 루틴을 생성합니다.

wsutil에서 정책 지원을 사용하는 방법

개발자는 wsutil 컴파일러에서 정책 지원을 사용하려면 다음 단계를 수행해야 합니다.

  • 대상 웹 서비스에 필요한 모든 입력 메타데이터 파일을 수집합니다.
  • wsutil.exe 사용하여 수집된 모든 WSDL/XSD/정책 파일을 컴파일합니다. Wsutil은 각 입력 WSDL 및 XSD 파일에 대해 하나의 스텁 파일 및 헤더 파일 집합을 생성합니다.
  • 생성된 헤더 파일을 검사하면 모든 정책 도우미 루틴 이름이 헤더 파일의 시작 부분에 있는 주석 섹션에 나열됩니다.
  • bindingName_CreateServiceProxy 도우미 루틴을 사용하여 서비스 프록시를 만듭니다.
  • bindingName_CreateServiceEndpoint 도우미 루틴을 사용하여 서비스 엔드포인트를 만듭니다.
  • 메서드 서명에 지정된 WS_bindingTemplateType_BINDING_TEMPLATE 구조를 채웁니다. 개발자는 필요에 따라 추가 채널 속성 및/또는 보안 속성을 제공할 수 있습니다.
  • 성공적인 반환 서비스 프록시 또는 서비스 엔드포인트가 만들어지면 도우미 루틴을 호출합니다.

다음 섹션에서는 관련 topics 자세히 설명합니다.

정책 입력 처리

다음은 정책 처리와 관련된 컴파일러 옵션 입니다.

기본적으로 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_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_BINDING_TEMPLATE_TYPE 보안 바인딩 조합 애플리케이션에서 채울 템플릿 구조 정책 설명
WS_HTTP_BINDING_TEMPLATE_TYPE WS_HTTP_BINDING_TEMPLATE WS_HTTP_POLICY_DESCRIPTION
WS_HTTP_SSL_BINDING_TEMPLATE_TYPE WS_SSL_TRANSPORT_SECURITY_BINDING WS_HTTP_SSL_BINDING_TEMPLATE WS_HTTP_SSL_POLICY_DESCRIPTION
WS_HTTP_HEADER_AUTH_BINDING_TEMPLATE_TYPE WS_HTTP_HEADER_AUTH_SECURITY_BINDING WS_HTTP_HEADER_AUTH_BINDING_TEMPLATE WS_HTTP_HEADER_AUTH_POLICY_DESCRIPTION
WS_HTTP_SSL_HEADER_AUTH_BINDING_TEMPLATE_TYPE WS_SSL_TRANSPORT_SECURITY_BINDINGWS_HTTP_HEADER_AUTH_SECURITY_BINDING WS_HTTP_SSL_HEADER_AUTH_BINDING_TEMPLATE WS_HTTP_SSL_HEADER_AUTH_POLICY_DESCRIPTION
WS_HTTP_SSL_USERNAME_BINDING_TEMPLATE_TYPE WS_SSL_TRANSPORT_SECURITY_BINDINGWS_USERNAME_MESSAGE_SECURITY_BINDING WS_HTTP_SSL_USERNAME_BINDING_TEMPLATE WS_HTTP_SSL_USERNAME_POLICY_DESCRIPTION
WS_HTTP_SSL_KERBEROS_APREQ_BINDING_TEMPLATE_TYPE WS_SSL_TRANSPORT_SECURITY_BINDINGWS_KERBEROS_APREQ_MESSAGE_SECURITY_BINDING WS_HTTP_SSL_KERBEROS_APREQ_BINDING_TEMPLATE WS_HTTP_SSL_KERBEROS_APREQ_POLICY_DESCRIPTION
WS_TCP_BINDING_TEMPLATE_TYPE WS_TCP_BINDING_TEMPLATE WS_TCP_POLICY_DESCRIPTION
WS_TCP_SSPI_BINDING_TEMPLATE_TYPE WS_TCP_SSPI_TRANSPORT_SECURITY_BINDING WS_TCP_SSPI_BINDING_TEMPLATE WS_TCP_SSPI_POLICY_DESCRIPTION
WS_TCP_SSPI_USERNAME_BINDING_TEMPLATE_TYPE WS_TCP_SSPI_TRANSPORT_SECURITY_BINDINGWS_USERNAME_MESSAGE_SECURITY_BINDING WS_TCP_SSPI_USERNAME_BINDING_TEMPLATE WS_TCP_SSPI_USERNAME_POLICY_DESCRIPTION
WS_TCP_SSPI_KERBEROS_APREQ_BINDING_TEMPLATE_TYPE WS_TCP_SSPI_TRANSPORT_SECURITY_BINDINGWS_KERBEROS_APREQ_MESSAGE_SECURITY_BINDING WS_TCP_SSPI_KERBEROS_APREQ_BINDING_TEMPLATE WS_TCP_SSPI_KERBEROS_APREQ_POLICY_DESCRIPTION
WS_HTTP_SSL_USERNAME_SECURITY_CONTEXT_BINDING_TEMPLATE_TYPE 부트스트랩 채널에서 WS_USERNAME_MESSAGE_SECURITY_BINDINGWS_SSL_TRANSPORT_SECURITY_BINDING 및 WS_SECURITY_CONTEXT_MESSAGE_SECURITY_BINDING WS_HTTP_SSL_USERNAME_SECURITY_CONTEXT_BINDING_TEMPLATE WS_HTTP_SSL_USERNAME_SECURITY_CONTEXT_POLICY_DESCRIPTION
WS_HTTP_SSL_KERBEROS_APREQ_SECURITY_CONTEXT_BINDING_TEMPLATE_TYPE 부트스트랩 채널에서 WS_KERBEROS_APREQ_MESSAGE_SECURITY_BINDINGWS_SSL_TRANSPORT_SECURITY_BINDING 및 WS_SECURITY_CONTEXT_MESSAGE_SECURITY_BINDING WS_HTTP_SSL_KERBEROS_APREQ_SECURITY_CONTEXT_BINDING_TEMPLATE WS_HTTP_SSL_KERBEROS_APREQ_SECURITY_CONTEXT_POLICY_DESCRIPTION
WS_TCP_SSPI_USERNAME_SECURITY_CONTEXT_BINDING_TEMPLATE_TYPE 부트스트랩 채널에서 WS_USERNAME_MESSAGE_SECURITY_BINDINGWS_TCP_SSPI_TRANSPORT_SECURITY_BINDING 및 WS_SECURITY_CONTEXT_MESSAGE_SECURITY_BINDING WS_TCP_SSPI_USERNAME_SECURITY_CONTEXT_BINDING_TEMPLATE WS_TCP_SSPI_USERNAME_SECURITY_CONTEXT_POLICY_DESCRIPTION
WS_TCP_SSPI_KERBEROS_APREQ_SECURITY_CONTEXT_BINDING_TEMPLATE_TYPE 부트스트랩 채널에서 WS_KERBEROS_APREQ_MESSAGE_SECURITY_BINDINGWS_TCP_SSPI_TRANSPORT_SECURITY_BINDING 및 WS_SECURITY_CONTEXT_MESSAGE_SECURITY_BINDING WS_TCP_SSPI_KERBEROS_APREQ_SECURITY_CONTEXT_BINDING_TEMPLATE WS_TCP_SSPI_KERBEROS_APREQ_SECURITY_CONTEXT_POLICY_DESCRIPTION

 

예를 들어 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은 다른 메시지 보안 바인딩이 있는 부트스트랩 채널을 지원하지만 다른 메시지 보안 바인딩과 조합하지 않고 서비스 채널에서 유일한 메시지 보안 바인딩으로 보안 컨텍스트만 지원합니다. 개발자는 정책 템플릿 지원 외부에서 이러한 조합을 지원할 수 있습니다.

다음 열거형은 정책 지원의 일부입니다.

다음 함수는 정책 지원의 일부입니다.

다음 구조는 정책 지원의 일부입니다.