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
Implementare l'interfaccia System.ServiceModel.Description.IPolicyImportExtension in una classe. Vedere le procedure seguenti.
Inserire l'unità di importazione dei criteri personalizzati tramite uno dei modi seguenti:
Utilizzando un file di configurazione. Vedere le procedure seguenti.
Uso di un file di configurazione con lo strumento utilità metadati ServiceModel (Svcutil.exe). Vedere le procedure seguenti.
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
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
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.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.
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
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>
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
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
.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
- Aggiungere l'unità di importazione alla proprietà MetadataImporter.PolicyImportExtensions (ad esempio, se si sta utilizzando System.ServiceModel.Description.WsdlImporter) prima di importare i metadati.