Procedura: importare asserzioni di criteri personalizzati

Le asserzioni di criteri descrivono le funzionalità e i requisiti di un endpoint del servizio. Le applicazioni client possono utilizzare asserzioni di criteri nei metadati del servizio per configurare l'associazione del client o per personalizzare il contratto di servizio per un endpoint del servizio.

Le asserzioni di criteri personalizzate vengono importate implementando l'interfaccia System.ServiceModel.Description.IPolicyImportExtension e passando quell'oggetto al sistema di metadati o registrando il tipo di implementazione nel file di configurazione dell'applicazione. Le implementazioni dell'interfaccia IPolicyImportExtension devono fornire un costruttore senza parametri.

Per importare asserzioni di criteri personalizzati

  1. Implementare l'interfaccia System.ServiceModel.Description.IPolicyImportExtension in una classe. Vedere le procedure seguenti.

  2. Inserire l'unità di importazione dei criteri personalizzati tramite uno dei modi seguenti:

  3. Utilizzando un file di configurazione. Vedere le procedure seguenti.

  4. Uso di un file di configurazione con lo strumento utilità metadati ServiceModel (Svcutil.exe). Vedere le procedure seguenti.

  5. Inserendo a livello di programmazione l'unità di importazione dei criteri. Vedere le procedure seguenti.

Per implementare l'interfaccia System.ServiceModel.Description.IPolicyImportExtension in qualsiasi classe

  1. Nel metodo IPolicyImportExtension.ImportPolicy, per ogni oggetto criterio a cui si è interessati, individuare le asserzioni dei criteri che si desidera importare chiamando il metodo appropriato (in base all'ambito dell'asserzione desiderata) nell'oggetto System.ServiceModel.Description.PolicyConversionContext passato al metodo. Nell'esempio di codice seguente viene illustrato come utilizzare il metodo PolicyAssertionCollection.Remove per individuare l'asserzione del criterio personalizzato e rimuoverla dalla raccolta in un passaggio. Se si utilizza il metodo di rimozione per individuare e rimuovere l'asserzione, non è necessario eseguire il passaggio 4.

    // 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;
    }
    
    ' 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
    
  2. Elaborare le asserzioni dei criteri. Si noti che il sistema del criterio non normalizza i criteri annidati e wsp:optional. È necessario elaborare questi costrutti nell'implementazione di un'estensione di importazione del criterio.

  3. Eseguire la personalizzazione dell'associazione o del contratto che supporta la funzionalità o il requisito specificato dall'asserzione del criterio. In genere, le asserzioni indicano che un'associazione richiede una particolare configurazione o uno specifico elemento di associazione. Apportare queste modifiche accedendo alla proprietà PolicyConversionContext.BindingElements. Le altre asserzioni richiedono che si modifichi il contratto. È possibile accedere e modificare il contratto utilizzando la proprietà PolicyConversionContext.Contract. Si noti che l'unità di importazione dei criteri può venire chiamata più volte per la stessa associazione e per lo stesso contratto, ma per alternative criteri diverse se l'importazione di un'alternativa criterio non riesce. Il codice deve adattarsi a questo comportamento.

  4. Rimuovere l'asserzione di criteri personalizzata dalla raccolta di asserzioni. Se l'asserzione non viene rimossa, Windows Communication Foundation (WCF) presuppone che l'importazione del criterio non sia stata completata correttamente e non importa l'associazione associata. Se è stato utilizzato il metodo PolicyAssertionCollection.Remove per individuare l'asserzione di criteri personalizzata e rimuoverla dalla raccolta in un unico passaggio, non è necessario eseguire questa procedura.

Per inserire l'unità di importazione di criteri personalizzata nel sistema di metadati utilizzando un file di configurazione

  1. Aggiungere il tipo di unità di importazione all'elemento <extensions> all'interno dell'elemento <policyImporters> nel file di configurazione client.

    <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>
    
  2. Nell'applicazione client, utilizzare System.ServiceModel.Description.MetadataResolver o System.ServiceModel.Description.WsdlImporter per risolvere i metadati. L'unità di importazione viene richiamata automaticamente.

    // 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"))
    

Per inserire l'unità di importazione di criteri personalizzata nel sistema di metadati utilizzando Svcutil.exe

  1. Aggiungere il tipo di unità di importazione all'elemento <extensions> all'interno dell'elemento <policyImporters> nel file di configurazione Svcutil.exe.config. È anche possibile puntare a Svcutil.exe per caricare tipi di unità di importazione di criteri registrati in un file di configurazione diverso, utilizzando l'opzione /svcutilConfig.

  2. Usare lo strumento utilità metadati ServiceModel (Svcutil.exe) per importare i metadati e l'utilità di importazione viene richiamata automaticamente.

Per inserire l'unità di importazione di criteri personalizzata nel sistema di metadati a livello di programmazione

  1. Aggiungere l'unità di importazione alla proprietà MetadataImporter.PolicyImportExtensions (ad esempio, se si sta utilizzando System.ServiceModel.Description.WsdlImporter) prima di importare i metadati.

Vedi anche