Procedimiento para 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 usar Windows Communication Foundation (WCF) para exportar aserciones en expresiones de directivas que están adjuntas a enlaces de WSDL en el punto de conexión, la operación o los asuntos del mensaje, según las funcionalidades 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 punto de conexión 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 aserciones de directivas personalizadas, consulte System.ServiceModel.Description.IPolicyImportExtension y Procedimiento para importar aserciones de directivas personalizadas.
Para exportar aserciones de directivas personalizadas
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 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
Inserte el elemento de enlace en el enlace del punto de conexión 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
Implemente System.ServiceModel.Configuration.BindingElementExtensionElement para su elemento de enlace de la aserción de directiva personalizada.
Agregue la extensión del elemento de enlace al archivo de configuración mediante el elemento <bindingElementExtensions>.
Cree un enlace personalizado mediante System.ServiceModel.Channels.CustomBinding.
Para insertar un elemento de enlace mediante programación
Cree un nuevo System.ServiceModel.Channels.BindingElement y agréguelo a System.ServiceModel.Channels.CustomBinding.
Agregue el enlace personalizado del paso 1. a un nuevo punto de conexión y agregue ese nuevo punto de conexión de servicio a System.ServiceModel.ServiceHost llamando al método AddServiceEndpoint.
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.
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