IPolicyImportExtension Interfaccia

Definizione

Definisce un metodo per oggetti che importano asserzioni di criteri personalizzate relative alle associazioni.

public interface class IPolicyImportExtension
public interface IPolicyImportExtension
type IPolicyImportExtension = interface
Public Interface IPolicyImportExtension
Derivato

Esempio

Nell'esempio di codice seguente viene illustrato come utilizzare il metodo PolicyAssertionCollection.Remove per individuare, restituire e rimuovere l'asserzione in un passaggio.

  #region IPolicyImporter Members
  public const string name1 = "acme";
  public const string ns1 = "http://Microsoft/WCF/Documentation/CustomPolicyAssertions";

  /*
   * Importing policy assertions usually means modifying the bindingelement stack in some way
   * to support the policy assertion. The procedure is:
   * 1. Find the custom assertion to import.
   * 2. Insert a supporting custom bindingelement or modify the current binding element collection
   *     to support the assertion.
   * 3. Remove the assertion from the collection. Once the ImportPolicy method has returned,
   *     any remaining assertions for the binding cause the binding to fail import and not be
   *     constructed.
   */
  public void ImportPolicy(MetadataImporter importer, PolicyConversionContext context)
  {
    Console.WriteLine("The custom policy importer has been called.");
    // Locate the custom assertion and remove it.
    XmlElement customAssertion = context.GetBindingAssertions().Remove(name1, ns1);
    if (customAssertion != null)
    {
      Console.WriteLine(
        "Removed our custom assertion from the imported "
        + "assertions collection and inserting our custom binding element."
      );
      // Here we would add the binding modification that implemented the policy.
      // This sample does not do this.
      Console.ForegroundColor = ConsoleColor.Red;
      Console.WriteLine(customAssertion.NamespaceURI + " : " + customAssertion.Name);
      Console.WriteLine(customAssertion.OuterXml);
      Console.ForegroundColor = ConsoleColor.Gray;
    }
 }
#endregion
    #Region "IPolicyImporter Members"
    Public Const name1 As String = "acme"
    Public Const ns1 As String = "http://Microsoft/WCF/Documentation/CustomPolicyAssertions"

'    
'     * Importing policy assertions usually means modifying the bindingelement stack in some way
'     * to support the policy assertion. The procedure is:
'     * 1. Find the custom assertion to import.
'     * 2. Insert a supporting custom bindingelement or modify the current binding element collection
'     *     to support the assertion.
'     * 3. Remove the assertion from the collection. Once the ImportPolicy method has returned, 
'     *     any remaining assertions for the binding cause the binding to fail import and not be 
'     *     constructed.
'     
    Public Sub ImportPolicy(ByVal importer As MetadataImporter, ByVal context As PolicyConversionContext) Implements IPolicyImportExtension.ImportPolicy
      Console.WriteLine("The custom policy importer has been called.")
      ' Locate the custom assertion and remove it.
      Dim customAssertion As XmlElement = context.GetBindingAssertions().Remove(name1, ns1)
      If customAssertion IsNot Nothing Then
        Console.WriteLine("Removed our custom assertion from the imported " & "assertions collection and inserting our custom binding element.")
        ' Here we would add the binding modification that implemented the policy.
        ' This sample does not do this.
        Console.ForegroundColor = ConsoleColor.Red
        Console.WriteLine(customAssertion.NamespaceURI & " : " & customAssertion.Name)
        Console.WriteLine(customAssertion.OuterXml)
        Console.ForegroundColor = ConsoleColor.Gray
      End If
    End Sub
  #End Region

Nell'esempio di codice seguente viene mostrato il file di configurazione dell'applicazione client per caricare l'utilità di importazione di criteri personalizzata quando viene richiamata la classe System.ServiceModel.Description.MetadataResolver.

<client>
    <endpoint 
      address="http://localhost:8080/StatefulService" 
      binding="wsHttpBinding"
      bindingConfiguration="CustomBinding_IStatefulService" 
      contract="IStatefulService"
      name="CustomBinding_IStatefulService" />
  <metadata>
    <policyImporters>
      <extension type="Microsoft.WCF.Documentation.CustomPolicyImporter, PolicyExtensions"/>
    </policyImporters>
  </metadata>
</client>

Nell'esempio di codice seguente viene illustrato come utilizzare MetadataResolver per scaricare e risolvere i metadati in oggetti della descrizione.

// Download all metadata.
ServiceEndpointCollection endpoints
  = MetadataResolver.Resolve(
    typeof(IStatefulService),
    new EndpointAddress("http://localhost:8080/StatefulService/mex")
  );
' Download all metadata. 
Dim endpoints As ServiceEndpointCollection = MetadataResolver.Resolve(GetType(IStatefulService), New EndpointAddress("http://localhost:8080/StatefulService/mex"))

Commenti

Implementare l'interfaccia IPolicyImportExtension per cercare informazioni WSDL esposte da un particolare endpoint per le asserzioni di criteri personalizzate relative alle funzionalità o ai requisiti dell'endpoint. In genere, un'utilità di importazione di criteri cerca un'asserzione specifica e inserisce un elemento dell'associazione, configura un elemento dell'associazione o modifica il contratto per supportare i requisiti dell'asserzione.

A differenza della controparte, per l'interfaccia IPolicyExportExtension, IPolicyImportExtension non è necessaria l'implementazione tramite un oggetto BindingElement. È possibile caricarla utilizzando la sezione di configurazione client illustrata nella sezione Esempi oppure aggiungendola a livello di codice al costruttore System.ServiceModel.Description.WsdlImporter.

Windows Communication Foundation (WCF) passa due oggetti al ImportPolicy metodo, a MetadataImporter e a PolicyConversionContext. In genere l'oggetto PolicyConversionContext contiene già le asserzioni di criteri per ogni ambito dell'associazione.

Un'implementazione IPolicyImportExtension consente di eseguire i passaggi seguenti:

  1. Trovare l'asserzione di criteri personalizzata per la quale è responsabile chiamando i metodi GetBindingAssertions, GetMessageBindingAssertions o GetOperationBindingAssertions, a seconda dell'ambito.

  2. Rimuovere l'asserzione di criteri dalla raccolta di asserzioni. Il metodo PolicyAssertionCollection.Remove trova, restituisce e rimuove l'asserzione in un passaggio.

  3. Modificare lo stack dell'associazione o il contratto aggiungendo un elemento BindingElement personalizzato e obbligatorio alla proprietà BindingElements o modificando la proprietà PolicyConversionContext.Contract.

Il passaggio 2 è importante. Dopo aver chiamato tutti gli importatori di criteri, WCF verifica l'esistenza di eventuali asserzioni di criteri che rimangono. Se esiste, WCF presuppone che l'importazione dei criteri non sia riuscita e non importa l'associazione associata.

Importante

Un fornitore di metadati malintenzionato potrebbe inviare XML non valido come parte dei metadati nel tentativo di sfruttare un'utilità di importazione di criteri. Si consiglia vivamente che le utilità di importazione di criteri personalizzate siano affidabili per tutte le forme di XML che potrebbero passare.

È necessario che le implementazioni MetadataImporter personalizzate implementino l'oggetto PolicyConversionContext per estrarre le asserzioni di criteri allegate al formato di metadati personalizzato.

Se si desidera esportare e importare elementi WSDL personalizzati che non sono asserzioni di criteri, vedere System.ServiceModel.Description.IWsdlExportExtension e System.ServiceModel.Description.IWsdlImportExtension.

Nota

È possibile usare importazione e esportazioni di criteri personalizzati con lo strumento utilità metadati ServiceModel (Svcutil.exe) usando gli stessi elementi di configurazione in un file di configurazione e l'opzione /svcutilConfig:<configFile> .

Metodi

ImportPolicy(MetadataImporter, PolicyConversionContext)

Definisce un metodo che può importare asserzioni di criteri personalizzate e aggiungere elementi dell'associazione di implementazione.

Si applica a