Vorgehensweise: Exportieren von benutzerdefinierten Richtlinienassertionen

Richtlinienassertionen beschreiben die Funktionen und Anforderungen eines Dienstendpunkts. Dienstanwendungen können benutzerdefinierte Richtlinienassertionen in Dienstmetadaten verwenden, um Endpunkt-, Bindungs- oder Vertragsanpassungsinformationen an die Clientanwendung zu übermitteln. Sie können Assertionen je nach den zu übermittelnden Funktionen oder Anforderungen in Windows Communication Foundation (WCF) in Richtlinienausdrücke exportieren, die in WSDL-Bindungen am Subjekt des Endpunkts, des Vorgangs oder der Nachricht angefügt werden.

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. Bei der Implementierung des Richtlinienexports sollte die benutzerdefinierte Richtlinienassertion der entsprechenden System.ServiceModel.Description.PolicyAssertionCollection zum System.ServiceModel.Description.PolicyConversionContext, der in der ExportPolicy-Methode übergeben wird, als System.Xml.XmlElement-Instanz hinzugefügt werden.

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.

Weitere Informationen zum Importieren von benutzerdefinierten Richtlinienassertionen finden Sie unter System.ServiceModel.Description.IPolicyImportExtension und Vorgehensweise: Importieren von benutzerdefinierten Richtlinienassertionen.

So exportieren Sie benutzerdefinierte Richtlinienassertionen

  1. Implementieren Sie die System.ServiceModel.Description.IPolicyExportExtension-Schnittstelle für System.ServiceModel.Channels.BindingElement. Im folgenden Codebeispiel wird die Implementierung einer benutzerdefinierten Richtlinienassertion auf der Bindungsebene veranschaulicht.

    #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. Fügen Sie das Bindungselement programmgesteuert oder mithilfe einer Anwendungskonfigurationsdatei in die Endpunktbindung ein. Anweisungen hierzu finden Sie in den folgenden Verfahren.

So fügen Sie ein Bindungselement mit einer Anwendungskonfigurationsdatei ein

  1. Implementieren Sie System.ServiceModel.Configuration.BindingElementExtensionElement für das Bindungselement der benutzerdefinierten Richtlinienassertion.

  2. Fügen Sie der Konfigurationsdatei mit dem <bindingElementExtensions>-Element die Erweiterung des Bindungselements hinzu.

  3. Erstellen Sie mit System.ServiceModel.Channels.CustomBinding eine benutzerdefinierte Bindung.

So fügen Sie ein Bindungselement programmgesteuert ein

  1. Erstellen Sie ein neues System.ServiceModel.Channels.BindingElement, und fügen Sie es System.ServiceModel.Channels.CustomBinding hinzu.

  2. Fügen Sie die benutzerdefinierte Bindung aus Schritt 1 einem neuen Endpunkt hinzu, und fügen Sie diesen neuen Dienstendpunkt System.ServiceModel.ServiceHost hinzu, indem Sie die AddServiceEndpoint-Methode aufrufen.

  3. Öffnen Sie ServiceHost. Im folgenden Codebeispiel wird das Erstellen einer benutzerdefinierten Bindung und das programmgesteuerte Einfügen von Bindungselementen veranschaulicht.

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

Siehe auch

Aufgaben

Vorgehensweise: Importieren von benutzerdefinierten Richtlinienassertionen

Verweis

IPolicyImportExtension
IPolicyExportExtension