Vorgehensweise: Exportieren von benutzerdefinierten RichtlinienassertionenHow to: Export Custom Policy Assertions

Richtlinienassertionen beschreiben die Funktionen und Anforderungen eines Dienstendpunkts.Policy assertions describe the capabilities and requirements of a service endpoint. Dienstanwendungen können benutzerdefinierte Richtlinienassertionen in Dienstmetadaten verwenden, um Endpunkt-, Bindungs- oder Vertragsanpassungsinformationen an die Clientanwendung zu übermitteln.Service applications can use custom policy assertions in service metadata to communicate endpoint, binding or contract customization information to the client application. Windows Communication Foundation (WCF) können um Assertionen in Richtlinienausdrücke in WSDL-Bindungen auf den Endpunkt, den Vorgang oder Nachrichtenbetreffs, abhängig von den Funktionen oder Anforderungen, kommunizieren, zu exportieren.You can use Windows Communication Foundation (WCF) to export assertions in policy expressions attached in WSDL bindings at the endpoint, operation, or message subjects, depending upon the capabilities or requirements you are communicating.

Exportieren Sie benutzerdefinierte Richtlinienassertionen, indem Sie die System.ServiceModel.Description.IPolicyExportExtension-Schnittstelle für System.ServiceModel.Channels.BindingElement implementieren und das Bindungselement entweder direkt in die Bindung des Dienstendpunkts einfügen oder das Bindungselement in der Anwendungskonfigurationsdatei registrieren.Custom policy assertions are exported by implementing the System.ServiceModel.Description.IPolicyExportExtension interface on a System.ServiceModel.Channels.BindingElement and either inserting the binding element directly into the binding of the service endpoint or by registering the binding element in your application configuration file. Bei der Implementierung des Richtlinienexports sollte die benutzerdefinierte Richtlinienassertion der entsprechenden System.Xml.XmlElement zum System.ServiceModel.Description.PolicyAssertionCollection, der in der System.ServiceModel.Description.PolicyConversionContext-Methode übergeben wird, als ExportPolicy-Instanz hinzugefügt werden.Your policy export implementation should add your custom policy assertion as a System.Xml.XmlElement instance to the appropriate System.ServiceModel.Description.PolicyAssertionCollection on the System.ServiceModel.Description.PolicyConversionContext passed into the ExportPolicy method.

Außerdem müssen Sie die PolicyVersion-Eigenschaft der WsdlExporter-Klasse überprüfen und geschachtelte Richtlinienausdrücke und Attribute des Richtlinienframework anhand der angegebenen Richtlinienversion in den richtigen Namespace exportieren.In addition you must check the PolicyVersion property of the WsdlExporter class and export nested policy expressions and policy framework attributes in the correct namespace based on the policy version specified.

Um benutzerdefinierte Richtlinienassertionen zu importieren, finden Sie unter System.ServiceModel.Description.IPolicyImportExtension und Vorgehensweise: Importieren von benutzerdefinierten Richtlinienassertionen.To import custom policy assertions, see System.ServiceModel.Description.IPolicyImportExtension and How to: Import Custom Policy Assertions.

So exportieren Sie benutzerdefinierte RichtlinienassertionenTo export custom policy assertions

  1. Implementieren Sie die System.ServiceModel.Description.IPolicyExportExtension-Schnittstelle für System.ServiceModel.Channels.BindingElement.Implement the System.ServiceModel.Description.IPolicyExportExtension interface on a System.ServiceModel.Channels.BindingElement. Im folgenden Codebeispiel wird die Implementierung einer benutzerdefinierten Richtlinienassertion auf der Bindungsebene veranschaulicht.The following code example shows the implementation of a custom policy assertion at the binding level.

    #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. Fügen Sie das Bindungselement programmgesteuert oder mithilfe einer Anwendungskonfigurationsdatei in die Endpunktbindung ein.Insert the binding element into the endpoint binding either programmatically or using an application configuration file. Anweisungen hierzu finden Sie in den folgenden Verfahren.See the following procedures.

So fügen Sie ein Bindungselement mit einer Anwendungskonfigurationsdatei einTo insert a binding element using an application configuration file

  1. Implementieren Sie System.ServiceModel.Configuration.BindingElementExtensionElement für das Bindungselement der benutzerdefinierten Richtlinienassertion.Implement System.ServiceModel.Configuration.BindingElementExtensionElement for your custom policy assertion binding element.

  2. Fügen Sie die bindungselementerweiterung auf die Konfigurationsdatei mit den <BindingElementExtensions > Element.Add the binding element extension to the configuration file using the <bindingElementExtensions> element.

  3. Erstellen Sie mit System.ServiceModel.Channels.CustomBinding eine benutzerdefinierte Bindung.Build a custom binding using the System.ServiceModel.Channels.CustomBinding.

So fügen Sie ein Bindungselement programmgesteuert einTo insert a binding element programmatically

  1. Erstellen Sie ein neues System.ServiceModel.Channels.BindingElement, und fügen Sie es System.ServiceModel.Channels.CustomBinding hinzu.Create a new System.ServiceModel.Channels.BindingElement and add it to a System.ServiceModel.Channels.CustomBinding.

  2. Fügen Sie die benutzerdefinierte Bindung aus Schritt 1Add the custom binding from step 1. einem neuen Endpunkt hinzu, und fügen Sie diesen neuen Dienstendpunkt System.ServiceModel.ServiceHost hinzu, indem Sie die AddServiceEndpoint-Methode aufrufen.to a new endpoint and add that new service endpoint to the System.ServiceModel.ServiceHost by calling the AddServiceEndpoint method.

  3. Öffnen Sie ServiceHost.Open the ServiceHost. Im folgenden Codebeispiel wird das Erstellen einer benutzerdefinierten Bindung und das programmgesteuerte Einfügen von Bindungselementen veranschaulicht.The following code example shows the creation of a custom binding and the programmatic insertion of binding elements.

    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
    

Siehe auchSee Also

IPolicyImportExtension
IPolicyExportExtension
Vorgehensweise: Importieren von benutzerdefinierten RichtlinienassertionenHow to: Import Custom Policy Assertions