Procedura: esportare asserzioni di criteri personalizzate

Le asserzioni di criteri descrivono le funzionalità e i requisiti di un endpoint del servizio. Le applicazioni del servizio possono utilizzare asserzioni di criteri personalizzate nei metadati del servizio per comunicare informazioni sulla personalizzazione di endpoint, associazione e contratto all'applicazione client. È possibile utilizzare Windows Communication Foundation (WCF) per esportare asserzioni in espressioni di criteri collegate ai binding WSDL nell'endpoint, nell'operazione o negli oggetti del messaggio, a seconda delle funzionalità o dei requisiti da comunicare.

Le asserzioni di criteri personalizzate vengono esportate mediante l'implementazione dell'interfaccia System.ServiceModel.Description.IPolicyExportExtension in un elemento System.ServiceModel.Channels.BindingElement, inserendo l'elemento dell'associazione direttamente nell'associazione dell'endpoint del servizio o registrando l'elemento dell'associazione nel file di configurazione dell'applicazione. È necessario che l'implementazione dell'esportazione del criterio aggiunga l'asserzione di criteri personalizzata come istanza System.Xml.XmlElement all'elemento System.ServiceModel.Description.PolicyAssertionCollection appropriato nell'elemento System.ServiceModel.Description.PolicyConversionContext passato al metodo ExportPolicy.

È inoltre necessario controllare la proprietà PolicyVersion della classe WsdlExporter ed esportare espressioni del criterio annidate e attributi dello schema dei criteri nello spazio dei nomi corretto in base alla versione del criterio specificata.

Per importare asserzioni di criteri personalizzate, vedere System.ServiceModel.Description.IPolicyImportExtension e Procedura: Importare asserzioni di criteri personalizzate.

Per esportare asserzioni di criteri personalizzate

  1. Implementare l'interfaccia System.ServiceModel.Description.IPolicyExportExtension in una classe System.ServiceModel.Channels.BindingElement. Nell'esempio di codice seguente viene illustrata l'implementazione di un'asserzione di criteri personalizzata a livello di associazione.

    #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. Inserire l'elemento di associazione nell'associazione dell'endpoint a livello di programmazione o utilizzando un file di configurazione dell'applicazione. Vedere le procedure seguenti.

Per inserire un elemento di associazione utilizzando un file di configurazione dell'applicazione

  1. Implementare System.ServiceModel.Configuration.BindingElementExtensionElement per l'elemento di associazione dell'asserzione di criteri personalizzata.

  2. Aggiungere l'estensione dell'elemento di binding al file di configurazione utilizzando l'elemento <bindingElementExtensions>.

  3. Compilare un'associazione personalizzata utilizzando System.ServiceModel.Channels.CustomBinding.

Per inserire un elemento di associazione a livello di programmazione

  1. Creare un nuovo elemento System.ServiceModel.Channels.BindingElement e aggiungerlo a System.ServiceModel.Channels.CustomBinding.

  2. Aggiungere l'associazione personalizzata di cui al passaggio 1 a un endpoint nuovo e aggiungere tale nuovo endpoint del servizio all'oggetto System.ServiceModel.ServiceHost chiamando il metodo AddServiceEndpoint.

  3. Aprire il file ServiceHost. Nell'esempio di codice seguente sono mostrati la creazione di un'associazione personalizzata e l'inserimento degli elementi dell'associazione a livello di programmazione.

    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
    

Vedi anche