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


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

В утверждениях политики описываются возможности и требования конечной точки службы. Приложения-службы могут использовать проверочные утверждения пользовательской политики в метаданных службы для передачи конечной точки, привязки или информации о настройке контракта клиентскому приложению. Windows Communication Foundation (WCF) можно использовать для экспорта проверочных утверждений в выражения политики, прикрепленные в привязках WSDL в конечной точке, операции или темах сообщений, в зависимости от передаваемых возможностей или требований.

Специальные проверочные утверждения политики экспортируются путем реализации интерфейса System.ServiceModel.Description.IPolicyExportExtension на System.ServiceModel.Channels.BindingElement и либо вставки элемента привязки непосредственно в привязку конечной точки службы, либо регистрации элемента привязки в файле конфигурации приложения. Реализация экспорта политики добавляет проверочное утверждение пользовательской политики как экземпляр System.Xml.XmlElement в соответствующую коллекцию System.ServiceModel.Description.PolicyAssertionCollection в контексте System.ServiceModel.Description.PolicyConversionContext, переданный методу ExportPolicy.

Кроме этого, необходимо проверить свойство PolicyVersion класса WsdlExporter и экспортировать вложенные выражения и политики и атрибуты инфраструктуры политики в соответствующее пространство имен в зависимости от указанной версии политики.

Импорт проверочных утверждений пользовательской политики см. в System.ServiceModel.Description.IPolicyImportExtension и Как импортировать утверждения пользовательской политики.

Экспорт проверочных утверждений пользовательской политики

  1. Реализация интерфейса System.ServiceModel.Description.IPolicyExportExtension в System.ServiceModel.Channels.BindingElement. В следующем коде показана реализация проверочного утверждения пользовательской политики на уровне привязки.

    #Region "IPolicyExporter Members"
    Public Sub ExportPolicy(ByVal exporter As MetadataExporter, ByVal policyContext As PolicyConversionContext) Implements IPolicyExportExtension.ExportPolicy
      If exporter Is Nothing Then
        Throw New NullReferenceException("The MetadataExporter object passed to the ExporterBindingElement is null.")
      End If
      If policyContext Is Nothing Then
        Throw New NullReferenceException("The PolicyConversionContext object passed to the ExporterBindingElement is null.")
      End If
    
      Dim elem As XmlElement = doc.CreateElement(name1, ns1)
      elem.InnerText = "My custom text."
      Dim att As XmlAttribute = doc.CreateAttribute("MyCustomAttribute", ns1)
      att.Value = "ExampleValue"
      elem.Attributes.Append(att)
      Dim subElement As XmlElement = doc.CreateElement("MyCustomSubElement", ns1)
      subElement.InnerText = "Custom Subelement Text."
      elem.AppendChild(subElement)
      policyContext.GetBindingAssertions().Add(elem)
      Console.WriteLine("The custom policy exporter was called.")
    End Sub
    #End Region
    
    #region IPolicyExporter Members
    public void ExportPolicy(MetadataExporter exporter, PolicyConversionContext policyContext)
    {
      if (exporter == null)
        throw new NullReferenceException("The MetadataExporter object passed to the ExporterBindingElement is null.");
      if (policyContext == null)
        throw new NullReferenceException("The PolicyConversionContext object passed to the ExporterBindingElement is null.");
    
      XmlElement elem = doc.CreateElement(name1, ns1);
      elem.InnerText = "My custom text.";
      XmlAttribute att = doc.CreateAttribute("MyCustomAttribute", ns1);
      att.Value = "ExampleValue";
      elem.Attributes.Append(att);
      XmlElement subElement = doc.CreateElement("MyCustomSubElement", ns1);
      subElement.InnerText = "Custom Subelement Text.";
      elem.AppendChild(subElement);
      policyContext.GetBindingAssertions().Add(elem);
      Console.WriteLine("The custom policy exporter was called.");
    }
    #endregion
    
  2. Элемент привязки вставляется в привязку конечной точки либо программно, либо при помощи файла конфигурации приложения. См. описанные ниже действия.

Вставка элемента привязки при помощи файла конфигурации приложения

  1. Реализуйте System.ServiceModel.Configuration.BindingElementExtensionElement для элемента привязки проверочного утверждения пользовательской политики.

  2. Добавьте расширение элемента привязки в файл конфигурации с помощью элемента <bindingElementExtensions>.

  3. Создайте специальную привязку с помощью System.ServiceModel.Channels.CustomBinding.

Вставка элемента привязки программными средствами

  1. Создайте новый элемент System.ServiceModel.Channels.BindingElement и добавьте его в System.ServiceModel.Channels.CustomBinding.

  2. Добавьте специальную привязку, описанную в шаге 1, в новую конечную точку и добавьте эту новую конечную точку службы в System.ServiceModel.ServiceHost, вызвав метод AddServiceEndpoint.

  3. Откройте ServiceHost. В следующем коде показан пример создания специальной привязки и вставки элементов привязки программными средствами.

    Dim baseAddress As New Uri("https://localhost:8000/servicemodelsamples/service")
    
    ' Create a ServiceHost for the CalculatorService type and provide the base address.
    Using serviceHost As New ServiceHost(GetType(CalculatorService), baseAddress)
        ' Create a custom binding that contains two binding elements.
        Dim reliableSession As New ReliableSessionBindingElement()
        reliableSession.Ordered = True
    
        Dim httpTransport As New HttpTransportBindingElement()
        httpTransport.AuthenticationScheme = System.Net.AuthenticationSchemes.Anonymous
        httpTransport.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard
    
        Dim binding As New CustomBinding(reliableSession, httpTransport)
    
        ' Add an endpoint using that binding.
        serviceHost.AddServiceEndpoint(GetType(ICalculator), binding, "")
    
        ' Add a MEX endpoint.
        Dim smb As New ServiceMetadataBehavior()
        smb.HttpGetEnabled = True
        smb.HttpGetUrl = New Uri("https://localhost:8001/servicemodelsamples")
        serviceHost.Description.Behaviors.Add(smb)
    
        ' Open the ServiceHostBase to create listeners and start listening for messages.
        serviceHost.Open()
    
        ' The service can now be accessed.
        Console.WriteLine("The service is ready.")
        Console.WriteLine("Press <ENTER> to terminate service.")
        Console.WriteLine()
        Console.ReadLine()
    
        ' Close the ServiceHostBase to shutdown the service.
        serviceHost.Close()
    End Using
    
    Uri baseAddress = new Uri("https://localhost:8000/servicemodelsamples/service");
    
    // Create a ServiceHost for the CalculatorService type and provide the base address.
    using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService), baseAddress))
    {
        // Create a custom binding that contains two binding elements.
        ReliableSessionBindingElement reliableSession = new ReliableSessionBindingElement();
        reliableSession.Ordered = true;
    
        HttpTransportBindingElement httpTransport = new HttpTransportBindingElement();
        httpTransport.AuthenticationScheme = System.Net.AuthenticationSchemes.Anonymous;
        httpTransport.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard;
    
        CustomBinding binding = new CustomBinding(reliableSession, httpTransport);
    
        // Add an endpoint using that binding.
        serviceHost.AddServiceEndpoint(typeof(ICalculator), binding, "");
    
        // Add a MEX endpoint.
        ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
        smb.HttpGetEnabled = true;
        smb.HttpGetUrl = new Uri("https://localhost:8001/servicemodelsamples");
        serviceHost.Description.Behaviors.Add(smb);
    
        // Open the ServiceHostBase to create listeners and start listening for messages.
        serviceHost.Open();
    
        // The service can now be accessed.
        Console.WriteLine("The service is ready.");
        Console.WriteLine("Press <ENTER> to terminate service.");
        Console.WriteLine();
        Console.ReadLine();
    
        // Close the ServiceHostBase to shutdown the service.
        serviceHost.Close();
    }
    

См. также

Задачи

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

Справочник

IPolicyImportExtension
IPolicyExportExtension