Procedure: Aangepaste beleidsverklaringen exporteren
Beleidsverklaringen beschrijven de mogelijkheden en vereisten van een service-eindpunt. Servicetoepassingen kunnen aangepaste beleidsverklaringen in servicemetagegevens gebruiken om eindpunten, bindings- of contractaanpassingsgegevens te communiceren met de clienttoepassing. U kunt Windows Communication Foundation (WCF) gebruiken om asserties te exporteren in beleidsexpressies die zijn gekoppeld aan WSDL-bindingen op het eindpunt, de bewerking of berichtonderwerp, afhankelijk van de mogelijkheden of vereisten die u communiceert.
Aangepaste beleidsverklaringen worden geƫxporteerd door de System.ServiceModel.Description.IPolicyExportExtension interface op een System.ServiceModel.Channels.BindingElement te implementeren en het bindingselement rechtstreeks in te voegen in de binding van het service-eindpunt of door het bindingselement in uw toepassingsconfiguratiebestand te registreren. Uw beleidsexport-implementatie moet uw aangepaste beleidsverklaring toevoegen als een System.Xml.XmlElement exemplaar aan de juiste System.ServiceModel.Description.PolicyAssertionCollection voor de System.ServiceModel.Description.PolicyConversionContext doorgegeven methode ExportPolicy .
Daarnaast moet u de PolicyVersion eigenschap van de WsdlExporter klasse controleren en geneste beleidsexpressies en beleidsframeworkkenmerken exporteren in de juiste naamruimte op basis van de opgegeven beleidsversie.
Als u aangepaste beleidsverklaringen wilt importeren, raadpleegt System.ServiceModel.Description.IPolicyImportExtension u en procedures: Aangepaste beleidsverklaringen importeren.
Aangepaste beleidsverklaringen exporteren
Implementeer de System.ServiceModel.Description.IPolicyExportExtension interface op een System.ServiceModel.Channels.BindingElement. In het volgende codevoorbeeld ziet u de implementatie van een aangepaste beleidsverklaring op bindingsniveau.
#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
Voeg het bindingselement programmatisch in de eindpuntbinding in of gebruik een toepassingsconfiguratiebestand. Zie de volgende procedures.
Een bindingselement invoegen met behulp van een toepassingsconfiguratiebestand
Implementeer System.ServiceModel.Configuration.BindingElementExtensionElement het bindingselement voor uw aangepaste beleidsverklaring.
Voeg de extensie van het bindingselement toe aan het configuratiebestand met behulp van het element bindingElementExtensions>.<
Bouw een aangepaste binding met behulp van de System.ServiceModel.Channels.CustomBinding.
Een bindingselement programmatisch invoegen
Maak een nieuwe System.ServiceModel.Channels.BindingElement en voeg deze toe aan een System.ServiceModel.Channels.CustomBinding.
Voeg de aangepaste binding toe vanuit stap 1. naar een nieuw eindpunt en voeg dat nieuwe service-eindpunt toe aan het System.ServiceModel.ServiceHost eindpunt door de AddServiceEndpoint methode aan te roepen.
Open het ServiceHost. In het volgende codevoorbeeld ziet u het maken van een aangepaste binding en de programmatische invoeging van bindingselementen.
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