Compartilhar via


Como: exportar declarações de política personalizadas

As declaraçõ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 declarações de política personalizadas em metadados de serviço para comunicar informações de endpoint, associação ou personalização de contrato ao aplicativo cliente. Você pode usar o WCF (Windows Communication Foundation) para exportar declarações em expressões de política anexadas em associações WSDL no ponto de extremidade, operação ou entidades de mensagem, dependendo dos recursos ou requisitos que você está comunicando.

As declarações de política personalizadas são exportadas implementando a interface System.ServiceModel.Description.IPolicyExportExtension em um System.ServiceModel.Channels.BindingElement e inserindo o elemento de associação diretamente à associação do ponto de extremidade de serviço ou registrando o elemento de associaçã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 instância System.Xml.XmlElement ao System.ServiceModel.Description.PolicyAssertionCollection apropriado no System.ServiceModel.Description.PolicyConversionContext passado no método ExportPolicy.

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

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

Exportar instrução de declaração de política personalizada

  1. Implemente a interface System.ServiceModel.Description.IPolicyExportExtension em um System.ServiceModel.Channels.BindingElement. O exemplo de código a seguir mostra a implementação de uma declaração de política personalizada no nível de associaçã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 associação na associaçã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 associação usando um arquivo de configuração de aplicativo

  1. Implemente System.ServiceModel.Configuration.BindingElementExtensionElement para o elemento de associação de declaração de política personalizada.

  2. Adicione a extensão de elemento de associação 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 associação programaticamente

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

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

  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 associaçã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
    

Confira também