Partilhar via


Como: Exportar asserções de política personalizada

As asserções de política descrevem os recursos e os requisitos de um ponto de extremidade de serviço. Os aplicativos de serviço podem usar asserções de política personalizadas em metadados de serviço para comunicar informações de endpoint, vinculação ou personalização de contrato ao aplicativo cliente. Você pode usar o Windows Communication Foundation (WCF) para exportar asserções em expressões de política anexadas em associações WSDL no ponto de extremidade, operação ou assuntos da mensagem, dependendo dos recursos ou requisitos que você está comunicando.

As asserções de política personalizadas são exportadas implementando a System.ServiceModel.Description.IPolicyExportExtension interface em um System.ServiceModel.Channels.BindingElement e inserindo o elemento de vinculação diretamente na associação do ponto de extremidade de serviço ou registrando o elemento de vinculação no arquivo de configuração do aplicativo. Sua implementação de exportação de política deve adicionar sua declaração de política personalizada como uma System.Xml.XmlElement instância à apropriada System.ServiceModel.Description.PolicyAssertionCollection no System.ServiceModel.Description.PolicyConversionContext passado para o ExportPolicy método.

Além disso, você deve verificar a PolicyVersion propriedade da classe e exportar expressões de política aninhadas e atributos da estrutura de WsdlExporter política no namespace correto com base na versão de política especificada.

Para importar asserções de política personalizada, consulte System.ServiceModel.Description.IPolicyImportExtension e Como importar asserções de política personalizada.

Para exportar asserções de política personalizada

  1. Implemente a System.ServiceModel.Description.IPolicyExportExtension interface em um System.ServiceModel.Channels.BindingElementarquivo . O exemplo de código a seguir mostra a implementação de uma asserção de política personalizada no nível de vinculação.

    #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
    
    #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
    
  2. Insira o elemento de vinculação na vinculação de ponto de extremidade programaticamente ou usando um arquivo de configuração de aplicativo. Consulte os procedimentos a seguir.

Para inserir um elemento de vinculação usando um arquivo de configuração do aplicativo

  1. Implemente System.ServiceModel.Configuration.BindingElementExtensionElement para seu elemento de vinculação de asserção de política personalizada.

  2. Adicione a extensão do elemento binding ao arquivo de configuração usando o elemento bindingElementExtensions>.<

  3. Crie uma associação personalizada usando o System.ServiceModel.Channels.CustomBinding.

Para inserir um elemento de ligação programaticamente

  1. Crie um novo System.ServiceModel.Channels.BindingElement e adicione-o a um System.ServiceModel.Channels.CustomBindingarquivo .

  2. Adicione a associação personalizada da etapa 1. a um novo ponto de extremidade e adicione esse System.ServiceModel.ServiceHost novo ponto de extremidade de serviço ao chamando o AddServiceEndpoint método.

  3. Abra o ServiceHost. O exemplo de código a seguir mostra a criação de uma associação personalizada e a inserção programática de elementos de ligação.

    Uri baseAddress = new Uri("http://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("http://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();
    }
    
    Dim baseAddress As New Uri("http://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("http://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
    

Consulte também