Importazione di metadati personalizzati per un'estensione WCF

In WCF (Windows Communication Foundation), l'importazione dei metadati è il processo di generazione di una rappresentazione astratta di un servizio o delle relative parti del componente dai relativi metadati. Ad esempio, WCF può importare istanze della classe ServiceEndpoint, della classe Binding o della classe ContractDescription da un documento WSDL di un servizio. Per importare i metadati del servizio in WCF è necessario usare un'implementazione della classe astratta System.ServiceModel.Description.MetadataImporter. I tipi che derivano dalla classe MetadataImporter implementano il supporto per l'importazione dei formati di metadati che si basano sulla logica di importazione di WS-Policy di WCF.

I metadati personalizzati sono costituiti da elementi XML non importabili mediante le utilità di importazione dei metadati forniti dal sistema. Esempi comuni di metadati personalizzati sono le estensioni WSDL personalizzate e le asserzioni di criteri personalizzate.

Questa sezione descrive come importare le estensioni WSDL e le asserzioni di criteri personalizzate, senza tuttavia tratta il processo di importazione in sé. Per ulteriori informazioni sull'uso dei tipi che esportano e importano metadati, siano essi personalizzati o supportati dal sistema, vedere Esportazione e importazione di metadati.

Panoramica

Il tipo System.ServiceModel.Description.WsdlImporter è l'implementazione della classe astratta MetadataImporter inclusa con WCF. Il tipo WsdlImporter importa metadati WSDL insieme ai relativi criteri allegati. Questi elementi vengono quindi raggruppati in un oggetto System.ServiceModel.Description.MetadataSet. Le asserzioni di criteri e le estensioni WSDL non riconosciute dalle unità di importazione predefinite vengono importate tramite una delle unità di importazione personalizzate e registrate di documenti WSDL e di criteri. In genere, le unità di importazione vengono implementate per supportare gli elementi di associazione definiti dall'utente o per modificare il contratto importato.

Contenuto della sezione sono descritti gli argomenti seguenti:

  1. Implementazione e utilizzo dell'interfaccia System.ServiceModel.Description.IWsdlImportExtension, che espone i dati WSDL alle unità di importazione personalizzate prima di generare descrizioni e codice. Questa interfaccia può essere utilizzata per esaminare o modificare i tipi di descrizione e la compilazione del codice eseguita utilizzando un determinato set di metadati.

  2. Implementazione e utilizzo dell'interfaccia System.ServiceModel.Description.IPolicyImportExtension, che espone le asserzioni di criteri alle unità di importazione prima di generare oggetti descrizione. Questa interfaccia può essere utilizzata per esaminare o modificare l'associazione o il contratto in base ai criteri scaricati.

Per altre informazioni sull'esportazione di asserzioni WSDL e di criteri personalizzate, vedere Esportazione di metadati personalizzati per un'estensione WCF.

Importazione di estensioni WSDL personalizzate

Per includere il supporto per l'importazione di estensioni WSDL, implementare l'interfaccia IWsdlImportExtension e quindi aggiungere tale implementazione alla proprietà WsdlImportExtensions. È inoltre possibile utilizzare il tipo WsdlImporter per caricare implementazioni dell'interfaccia IWsdlImportExtension registrate nel file di configurazione dell'applicazione. Si noti che alcune unità di importazione WSDL sono registrate per impostazione predefinita e che l'ordine delle unità di importazione WSDL registrate è rilevante.

Quando l'unità di importazione WSDL personalizzata viene caricata e utilizzata dal tipo WsdlImporter, prima di eseguire il processo di importazione il sistema chiama il metodo BeforeImport per consentire la modifica dei metadati. Quindi, dopo aver importato i contratti, il sistema chiama il metodo ImportContract per consentire la modifica dei contratti importati dai metadati. Infine, il sistema chiama il metodo ImportEndpoint per consentire la modifica degli endpoint importati.

Per altre informazioni, vedere Procedura: Importare WSDL personalizzati.

Importazione di asserzioni di criteri personalizzati

Il tipo WsdlImporter e lo Strumento ServiceModel Metadata Utility (Svcutil.exe) gestiscono automaticamente l'elaborazione di un'ampia gamma di tipi di asserzione di criteri nelle espressioni di criteri associate ai documenti WSDL. Questi strumenti raccolgono, normalizzano e uniscono le espressioni di criteri allegate alle associazioni e alle porte WSDL.

Per includere il supporto per l'importazione di asserzioni di criteri personalizzate, implementare l'interfaccia IPolicyImportExtension e quindi aggiungere tale implementazione alla proprietà PolicyImportExtensions. È inoltre possibile utilizzare il tipo MetadataImporter per caricare implementazioni dell'interfaccia IPolicyImportExtension registrate nel file di configurazione dell'applicazione. Si noti che alcune unità di importazione dei criteri sono registrate per impostazione predefinita e che l'ordine delle unità di importazione dei criteri registrate è rilevante.

Il sistema dei metadati chiama più volte il metodo IPolicyImportExtension.ImportPolicy in tutte le estensioni di importazione criteri registrate per ogni combinazione di alternative criteri allegate ai soggetti di criterio di messaggio, operazione ed endpoint. Quando si importa una porta WSDL, i criteri allegati alla porta e all'associazione WSDL corrispondente vengono uniti prima di chiamare le estensioni di importazione criteri. Le alternative criteri sono rese disponibili sottoforma di oggetti PolicyConversionContext tramite un contesto PolicyAssertionCollection. Ogni oggetto PolicyAssertionCollection è una raccolta di asserzioni di criteri rappresentato dagli oggetti XmlElement.

Le proprietà Contract e BindingElements dell'oggetto PolicyConversionContext espongono gli oggetti ContractDescription e BindingElement importati dal documento WSDL. Le estensioni di importazione criteri elaborano le asserzioni di criteri individuando le istanze di un determinato tipo di asserzione di criteri, apportando le modifiche corrispondenti agli oggetti ContractDescription o BindingElement e quindi rimuovendo le asserzioni di criteri dall'istanza PolicyAssertionCollection corrispondente.

Poiché l'attributo wsp:Optional e le espressioni di criteri annidate non sono normalizzate, le estensioni di importazione criteri devono gestire questi costrutti di criterio. Inoltre, poiché le estensioni di importazione criteri possono essere chiamate più volte con gli stessi oggetti ContractDescription e BindingElement, le estensioni di importazione criteri devono essere in grado di gestire questo tipo di comportamento.

Importante

È possibile che all'unità di importazione vengano passati metadati non validi o inappropriati. È pertanto necessario garantire che le unità di importazione personalizzate siano in grado di gestire qualsiasi formato XML.

Vedi anche