Sdílet prostřednictvím


Postupy: Export kontrolních výrazů vlastních zásad

Kontrolní výrazy zásad popisují možnosti a požadavky koncového bodu služby. Aplikace služeb můžou používat kontrolní výrazy vlastních zásad v metadatech služby ke komunikaci koncového bodu, vazby nebo informací o přizpůsobení kontraktu klientské aplikaci. Windows Communication Foundation (WCF) můžete použít k exportu kontrolních výrazů ve výrazech zásad připojených ve vazbách WSDL na koncovém bodu, operaci nebo předmětu zpráv v závislosti na možnostech nebo požadavcích, které komunikujete.

Kontrolní výrazy vlastních zásad se exportují implementací System.ServiceModel.Description.IPolicyExportExtension rozhraní na objektu System.ServiceModel.Channels.BindingElement a vložením elementu vazby přímo do vazby koncového bodu služby nebo registrací elementu vazby v konfiguračním souboru aplikace. Implementace exportu zásad by měla přidat vlastní kontrolní výraz zásad jako System.Xml.XmlElement instanci příslušné pro System.ServiceModel.Description.PolicyAssertionCollectionSystem.ServiceModel.Description.PolicyConversionContext předání do ExportPolicy metody.

Kromě toho musíte zkontrolovat PolicyVersion vlastnost WsdlExporter třídy a exportovat vnořené výrazy zásad a atributy architektury zásad ve správném oboru názvů na základě zadané verze zásady.

Import kontrolních výrazů vlastních zásad najdete v tématu System.ServiceModel.Description.IPolicyImportExtension a postupy: Import kontrolních výrazů vlastních zásad.

Export kontrolních výrazů vlastních zásad

  1. Implementujte System.ServiceModel.Description.IPolicyExportExtension rozhraní na objektu System.ServiceModel.Channels.BindingElement. Následující příklad kódu ukazuje implementaci vlastního kontrolního výrazu zásad na úrovni vazby.

    #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. Vložte prvek vazby do vazby koncového bodu buď prostřednictvím kódu programu, nebo pomocí konfiguračního souboru aplikace. Podívejte se na následující postupy.

Vložení elementu vazby pomocí konfiguračního souboru aplikace

  1. Implementujte System.ServiceModel.Configuration.BindingElementExtensionElement pro prvek vazby vlastního kontrolního výrazu zásad.

  2. Přidejte rozšíření elementu vazby do konfiguračního souboru pomocí <bindingElementExtensions> elementu.

  3. Vytvoření vlastní vazby pomocí nástroje System.ServiceModel.Channels.CustomBinding.

Programové vložení elementu vazby

  1. Vytvořte nový System.ServiceModel.Channels.BindingElement a přidejte ho do souboru System.ServiceModel.Channels.CustomBinding.

  2. Přidejte vlastní vazbu z kroku 1. do nového koncového bodu a přidání nového koncového bodu služby do System.ServiceModel.ServiceHostAddServiceEndpoint metody.

  3. Otevřete třídu ServiceHost. Následující příklad kódu ukazuje vytvoření vlastní vazby a programové vložení prvků vazby.

    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
    

Viz také