Compartir a través de


Cómo: Exportar aserciones de directivas personalizadas

Las aserciones de directivas describen las funciones y requisitos de un extremo de servicio. Las aplicaciones de servicio pueden utilizar las aserciones de directivas personalizadas en metadatos del servicio para comunicarse el extremo, enlace o información de personalización de contrato a la aplicación cliente. Puede utilizar Windows Communication Foundation (WCF) para exportar las aserciones en expresiones de directivas adjuntas a enlaces de WSDL en el extremo, operación o asuntos del mensaje, dependiendo de las funciones o requisitos que esté comunicando.

Las aserciones de directivas personalizadas se exportan implementando la interfaz System.ServiceModel.Description.IPolicyExportExtension en System.ServiceModel.Channels.BindingElement e insertando directamente el elemento de enlace en el enlace del extremo de servicio o registrando el elemento de enlace en su archivo de configuración de la aplicación. Su implementación de exportación de directivas debería agregar su aserción de directivas personalizada como una instancia System.Xml.XmlElement al System.ServiceModel.Description.PolicyAssertionCollection adecuado en System.ServiceModel.Description.PolicyConversionContext que se pasa al método ExportPolicy.

Además, debe comprobar la propiedad PolicyVersion de la clase WsdlExporter y exportar expresiones de directivas anidadas y atributos de marco de directivas en el espacio de nombres correcto basándose en la versión de directiva especificada.

Para importar las aserciones de directivas personalizadas, vea System.ServiceModel.Description.IPolicyImportExtension y Cómo: Importar aserciones de directivas personalizadas.

Para exportar aserciones de directivas personalizadas

  1. Implemente la interfaz System.ServiceModel.Description.IPolicyExportExtension en System.ServiceModel.Channels.BindingElement. El ejemplo de código siguiente muestra la implementación de una aserción de directiva personalizada en el nivel de enlace.

    #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. Inserte el elemento de enlace en el enlace del extremo mediante programación o utilizando un archivo de configuración de la aplicación. Consulte los procedimientos siguientes.

Para insertar un elemento de enlace mediante un archivo de configuración de la aplicación

  1. Implemente System.ServiceModel.Configuration.BindingElementExtensionElement para su elemento de enlace de la aserción de directiva personalizada.

  2. Agregue la extensión del elemento de enlace al archivo de configuración utilizando el elemento <bindingElementExtensions>.

  3. Cree un enlace personalizado mediante System.ServiceModel.Channels.CustomBinding.

Para insertar un elemento de enlace mediante programación

  1. Cree un nuevo System.ServiceModel.Channels.BindingElement y agréguelo a System.ServiceModel.Channels.CustomBinding.

  2. Agregue el enlace personalizado del paso 1 a un nuevo extremo y agregue ese nuevo extremo de servicio a System.ServiceModel.ServiceHost llamando al método AddServiceEndpoint.

  3. Abra ServiceHost. El ejemplo de código siguiente muestra la creación de un enlace personalizado y la inserción mediante programación de elementos de enlace.

    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();
    }
    

Vea también

Tareas

Cómo: Importar aserciones de directivas personalizadas

Referencia

IPolicyImportExtension
IPolicyExportExtension