Поделиться через


Как импортировать утверждения пользовательской политики

В утверждениях политики описываются возможности и требования конечной точки службы. Клиентские приложения могут использовать утверждения политики в метаданных службы для настройки привязки клиента или для настройки контракта службы для конечной точки службы.

Утверждения настраиваемой политики импортируются путем реализации интерфейса System.ServiceModel.Description.IPolicyImportExtension и передачи этого объекта системе метаданных или путем регистрации типа реализации в файле конфигурации приложения. Реализации интерфейса IPolicyImportExtension должны предоставлять конструктор по умолчанию.

Импорт утверждений настраиваемой политики

  1. Реализуйте интерфейс System.ServiceModel.Description.IPolicyImportExtension в классе. См. описанные ниже действия.

  2. Вставьте импортер настраиваемой политики одним из следующих способов:

  3. Путем использования файла конфигурации. См. описанные ниже действия.

  4. Путем использования файла конфигурации в сочетании с Служебное средство ServiceModel Metadata Utility Tool (Svcutil.exe). См. описанные ниже действия.

  5. Программным путем. См. описанные ниже действия.

Реализация интерфейса System.ServiceModel.Description.IPolicyImportExtension в любом классе

  1. В методе System.ServiceModel.Description.IPolicyImportExtension.ImportPolicy(System.ServiceModel.Description.MetadataImporter,System.ServiceModel.Description.PolicyConversionContext) для каждого интересующего субъекта политики найдите утверждения политики, которые требуется импортировать, вызвав соответствующий метод (в зависимости от требуемой области утверждения) объекта System.ServiceModel.Description.PolicyConversionContext, переданного методу. В следующем примере кода показано использование метода System.ServiceModel.Description.PolicyAssertionCollection.Remove(System.String,System.String) для поиска утверждения настраиваемой политики и удаления его из коллекции за один шаг. Если использовать метод удаления для поиска и удаления утверждения, выполнять шаг 4 не потребуется.

    ' 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
    
    // 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;
    }
    
  2. Обработайте утверждения политики. Обратите внимание, что система политики не нормализует вложенные политики и wsp:optional. Эти конструкции необходимо обработать в реализации расширения импорта политики.

  3. Настройте привязку или контракт, поддерживающие возможность или требование, задаваемое утверждением политики. Как правило, в утверждениях указывается, что привязка требует определенной конфигурации или определенного элемента привязки. Внесите эти изменения, обратившись к свойству System.ServiceModel.Description.PolicyConversionContext.BindingElements. Другие утверждения требуют изменения контракта. Обратиться к контракту и внести в него изменения можно с помощью свойства System.ServiceModel.Description.PolicyConversionContext.Contract. Обратите внимание, что импортер политики может вызываться несколько раз для одной и той же привязки и контракта, однако для разных альтернативных политик, если импортировать альтернативную политику не удается. Код должен быть устойчив к такому поведению.

  4. Удалите утверждение настраиваемой политики из коллекции утверждений. Если не удалить утверждение, Windows Communication Foundation (WCF) предполагает, что импорт политики завершился неудачно, и не импортирует связанную привязку. Если использовался метод System.ServiceModel.Description.PolicyAssertionCollection.Remove(System.String,System.String) для поиска утверждения настраиваемой политики и удаления его из коллекции за один шаг, выполнять этот шаг не требуется.

Вставка импортера настраиваемой политики в систему метаданных с помощью файла конфигурации

  1. Добавьте тип импортера в элемент <extensions> внутри элемента <policyImporters> в файле конфигурации клиента.

    <client>
        <endpoint 
          address="https://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. 
    Dim endpoints As ServiceEndpointCollection = MetadataResolver.Resolve(GetType(IStatefulService), New EndpointAddress("https://localhost:8080/StatefulService/mex"))
    
    // Download all metadata. 
    ServiceEndpointCollection endpoints
      = MetadataResolver.Resolve(
        typeof(IStatefulService),
        new EndpointAddress("https://localhost:8080/StatefulService/mex")
      );
    

Вставка импортера настраиваемой политики в систему метаданных с помощью Svcutil.exe

  1. Добавьте тип импортера в элемент <extensions> внутри элемента <policyImporters> в файле конфигурации Svcutil.exe.config. Также можно с помощью параметра /svcutilConfig дать Svcutil.exe указание загрузить типы импортеров политик, зарегистрированные в другом файле конфигурации.

  2. Используйте Служебное средство ServiceModel Metadata Utility Tool (Svcutil.exe) для импорта метаданных, и импортер будет вызываться автоматически.

Вставка импортера настраиваемой политики в систему метаданных программным путем

  1. Добавьте импортер в свойство System.ServiceModel.Description.MetadataImporter.PolicyImportExtensions (например, если используется класс System.ServiceModel.Description.WsdlImporter), прежде чем импортировать метаданные.

См. также

Справочник

System.ServiceModel.Description.MetadataResolver
System.ServiceModel.Description.WsdlImporter
System.ServiceModel.Description.MetadataResolver

Другие ресурсы

Расширение системы метаданных