다음을 통해 공유


방법: 사용자 지정 정책 어설션 가져오기

정책 어설션은 서비스 엔드포인트의 기능 및 요구 사항에 대해 설명합니다. 클라이언트 애플리케이션은 서비스 메타데이터에서 정책 어설션을 사용하여 서비스 엔드포인트에 대해 서비스 계약을 사용자 지정하거나 클라이언트 바인딩을 구성할 수 있습니다.

System.ServiceModel.Description.IPolicyImportExtension 인터페이스를 구현하고 해당 개체를 메타데이터 시스템에 전달하거나 애플리케이션 구성 파일에 구현 형식을 등록하면 사용자 지정 정책 어설션을 가져올 수 있습니다. IPolicyImportExtension 인터페이스의 구현은 매개 변수가 없는 생성자를 제공해야 합니다.

사용자 지정 정책 어설션을 가져오려면

  1. 클래스에서 System.ServiceModel.Description.IPolicyImportExtension 인터페이스를 구현합니다. 다음 절차를 참조하십시오.

  2. 다음 중 하나를 사용하여 사용자 지정 정책 가져오기를 삽입합니다.

  3. 구성 파일 사용 다음 절차를 참조하십시오.

  4. ServiceModel 메타데이터 유틸리티 도구(Svcutil.exe)와 함께 구성 파일 사용 다음 절차를 참조하십시오.

  5. 정책 가져오기를 프로그래밍 방식으로 삽입 다음 절차를 참조하십시오.

클래스에서 System.ServiceModel.Description.IPolicyImportExtension 인터페이스를 구현하려면

  1. IPolicyImportExtension.ImportPolicy 메서드에서 원하는 각 정책 주체에 대해, 이 메서드에 전달된 System.ServiceModel.Description.PolicyConversionContext 개체에서 원하는 어설션 범위에 따라 적절한 메서드를 호출하여 가져올 정책 어설션을 찾습니다. 다음 코드 예제에서는 PolicyAssertionCollection.Remove 메서드를 사용하여 사용자 지정 정책 어설션을 찾고 컬렉션에서 이를 한 번에 제거하는 방법을 보여 줍니다. remove 메서드를 사용하여 어설션을 찾아 제거하면 4단계를 수행할 필요가 없습니다.

    // Locate the custom assertion and remove it.
    XmlElement customAssertion = context.GetBindingAssertions().Remove(name1, ns1);
    if (customAssertion != null)
    {
      Console.WriteLine(
        "Removed our custom assertion from the imported "
        + "assertions collection and inserting our custom binding element."
      );
      // Here we would add the binding modification that implemented the policy.
      // This sample does not do this.
      Console.ForegroundColor = ConsoleColor.Red;
      Console.WriteLine(customAssertion.NamespaceURI + " : " + customAssertion.Name);
      Console.WriteLine(customAssertion.OuterXml);
      Console.ForegroundColor = ConsoleColor.Gray;
    }
    
    ' Locate the custom assertion and remove it.
    Dim customAssertion As XmlElement = context.GetBindingAssertions().Remove(name1, ns1)
    If customAssertion IsNot Nothing Then
        Console.WriteLine("Removed our custom assertion from the imported " & "assertions collection and inserting our custom binding element.")
        ' Here we would add the binding modification that implemented the policy.
        ' This sample does not do this.
        Console.ForegroundColor = ConsoleColor.Red
        Console.WriteLine(customAssertion.NamespaceURI & " : " & customAssertion.Name)
        Console.WriteLine(customAssertion.OuterXml)
        Console.ForegroundColor = ConsoleColor.Gray
    End If
    
  2. 정책 어설션을 처리합니다. 정책 시스템은 중첩된 정책 및 wsp:optional을 정규화하지 않습니다. 따라서 정책 가져오기 확장 구현에서 이러한 구문을 처리해야 합니다.

  3. 정책 어설션에 의해 지정된 기능 또는 요구 사항을 지원하는 바인딩 또는 계약에 대해 사용자 지정을 수행합니다. 일반적으로 어설션은 바인딩에 특정 구성 또는 특정 바인딩 요소가 필요함을 나타냅니다. PolicyConversionContext.BindingElements 속성에 액세스하여 이러한 사항을 수정하십시오. 다른 어설션을 사용하려면 계약을 수정해야 합니다. PolicyConversionContext.Contract 속성을 사용하여 계약에 액세스하고 이를 수정할 수 있습니다. 정책 가져오기는 동일한 바인딩 및 계약에 대해 여러 번 호출될 수 있지만 정책 대안을 가져오는 데 실패하면 다른 정책으로 대체됩니다. 사용자 코드는 이 동작에 대해 유연해야 합니다.

  4. 어설션 컬렉션에서 사용자 지정 정책 어설션을 제거합니다. 어설션을 제거하지 않으면 WCF(Windows Communication Foundation)에서 정책 가져오기가 실패했다고 가정하고 연결된 바인딩을 가져오지 않습니다. PolicyAssertionCollection.Remove 메서드를 사용하여 사용자 지정 정책 어설션을 찾고 컬렉션에서 이를 한 번에 제거했다면 이 단계를 수행할 필요가 없습니다.

구성 파일을 사용하여 사용자 지정 정책 가져오기를 메타데이터 시스템에 삽입하려면

  1. 클라이언트 구성 파일의 <policyImporters> 요소 내의 <extensions> 요소에 가져오기 형식을 추가합니다.

    <client>
        <endpoint 
          address="http://localhost:8080/StatefulService" 
          binding="wsHttpBinding"
          bindingConfiguration="CustomBinding_IStatefulService" 
          contract="IStatefulService"
          name="CustomBinding_IStatefulService" />
      <metadata>
        <policyImporters>
          <extension type="Microsoft.WCF.Documentation.CustomPolicyImporter, PolicyExtensions"/>
        </policyImporters>
      </metadata>
    </client>
    
  2. 클라이언트 애플리케이션에서 System.ServiceModel.Description.MetadataResolver 또는 System.ServiceModel.Description.WsdlImporter를 사용하여 메타데이터를 확인하면 해당 가져오기가 자동으로 호출됩니다.

    // Download all metadata.
    ServiceEndpointCollection endpoints
      = MetadataResolver.Resolve(
        typeof(IStatefulService),
        new EndpointAddress("http://localhost:8080/StatefulService/mex")
      );
    
    ' Download all metadata. 
    Dim endpoints As ServiceEndpointCollection = MetadataResolver.Resolve(GetType(IStatefulService), New EndpointAddress("http://localhost:8080/StatefulService/mex"))
    

Svcutil.exe를 사용하여 사용자 지정 정책 가져오기를 메타데이터 시스템에 삽입하려면

  1. Svcutil.exe.config 구성 파일의 <policyImporters> 요소에 있는 <extensions> 요소에 가져오기 형식을 추가합니다. 또한 /svcutilConfig 옵션을 사용하여 다른 구성 파일에서 등록된 정책 가져오기 형식을 로드하도록 Svcutil.exe를 지정할 수 있습니다.

  2. ServiceModel 메타데이터 유틸리티 도구(Svcutil.exe)를 사용하여 메타데이터를 가져오면 가져오기 도구가 자동으로 호출됩니다.

프로그래밍 방식으로 사용자 지정 정책 가져오기를 메타데이터 시스템에 삽입하려면

  1. 메타데이터를 가져오기 전에 가져오기를 MetadataImporter.PolicyImportExtensions 속성(예를 들어 System.ServiceModel.Description.WsdlImporter를 사용 중인 경우)에 추가합니다.

참고 항목