Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
In questo argomento viene descritto come abilitare il supporto di configurazione e metadati per le associazioni e gli elementi di associazione.
Panoramica della configurazione e dei metadati
In questo argomento vengono illustrate le attività seguenti, che sono elementi facoltativi 1, 2 e 4 nell'elenco attività Sviluppo canali .
Abilitazione del supporto dei file di configurazione per un elemento di associazione.
Abilitazione del supporto dei file di configurazione per un'associazione.
Esportazione di asserzioni WSDL e di policy per un elemento di associazione.
Identificazione delle asserzioni WSDL e delle policy per inserire e configurare l'elemento di associazione o associativo.
Per informazioni sulla creazione di associazioni definite dall'utente e di elementi di associazione, vedere rispettivamente Creazione di associazioni User-Defined e Creazione di un elemento di associazione.
Aggiunta del supporto per la configurazione
Per abilitare il supporto dei file di configurazione per un canale, è necessario implementare due sezioni di configurazione: System.ServiceModel.Configuration.BindingElementExtensionElement, che abilita il supporto della configurazione per gli elementi di associazione, e System.ServiceModel.Configuration.StandardBindingElement e System.ServiceModel.Configuration.StandardBindingCollectionElement<TStandardBinding,TBindingConfiguration>, che abilitano il supporto della configurazione per le associazioni.
Un modo più semplice per eseguire questa operazione consiste nell'usare lo strumento di esempio ConfigurationCodeGenerator per generare codice di configurazione per le associazioni e gli elementi di associazione.
Estensione di BindingElementExtensionElement
Il codice di esempio seguente è tratto dall'esempio Transport: UDP .
UdpTransportElement è un BindingElementExtensionElement che espone UdpTransportBindingElement al sistema di configurazione. Con alcune sostituzioni di base, l'esempio definisce il nome della sezione di configurazione, il tipo dell'elemento di associazione e come creare l'elemento di associazione. Gli utenti possono quindi registrare la sezione dell'estensione in un file di configurazione come indicato di seguito.
<configuration>
<system.serviceModel>
<extensions>
<bindingElementExtensions>
<add name="udpTransport" type="Microsoft.ServiceModel.Samples.UdpTransportElement, UdpTransport" />
</bindingElementExtensions>
</extensions>
</system.serviceModel>
</configuration>
È possibile fare riferimento all'estensione nelle associazioni personalizzate per usare UDP come trasporto.
<configuration>
<system.serviceModel>
<bindings>
<customBinding>
<binding configurationName="UdpCustomBinding">
<udpTransport/>
</binding>
</customBinding>
</bindings>
</system.serviceModel>
</configuration>
Aggiunta della configurazione per un'associazione
La sezione SampleProfileUdpBindingCollectionElement è un oggetto StandardBindingCollectionElement<TStandardBinding,TBindingConfiguration> che espone SampleProfileUdpBinding al sistema di configurazione. La maggior parte dell'implementazione viene delegata a SampleProfileUdpBindingConfigurationElement, che deriva da StandardBindingElement. l'oggetto SampleProfileUdpBindingConfigurationElement dispone di proprietà che corrispondono alle proprietà su SampleProfileUdpBinding, e funzioni per eseguire il mapping dall'associazione ConfigurationElement. Infine, il OnApplyConfiguration metodo viene sottoposto a override in SampleProfileUdpBinding, come illustrato nel codice di esempio seguente.
protected override void OnApplyConfiguration(string configurationName)
{
if (binding == null)
throw new ArgumentNullException("binding");
if (binding.GetType() != typeof(SampleProfileUdpBinding))
{
var expectedType = typeof(SampleProfileUdpBinding).AssemblyQualifiedName;
var typePassedIn = binding.GetType().AssemblyQualifiedName;
throw new ArgumentException($"Invalid type for binding. Expected type: {expectedType}. Type passed in: {typePassedIn}.");
}
SampleProfileUdpBinding udpBinding = (SampleProfileUdpBinding)binding;
udpBinding.OrderedSession = this.OrderedSession;
udpBinding.ReliableSessionEnabled = this.ReliableSessionEnabled;
udpBinding.SessionInactivityTimeout = this.SessionInactivityTimeout;
if (this.ClientBaseAddress != null)
udpBinding.ClientBaseAddress = ClientBaseAddress;
}
Per registrare questo gestore con il sistema di configurazione, aggiungere la sezione seguente al file di configurazione pertinente.
<configuration>
<configSections>
<sectionGroup name="system.serviceModel">
<sectionGroup name="bindings">
<section name="sampleProfileUdpBinding" type="Microsoft.ServiceModel.Samples.SampleProfileUdpBindingCollectionElement, UdpTransport" />
</sectionGroup>
</sectionGroup>
</configSections>
</configuration>
Può quindi essere richiamato dalla <sezione di configurazione system.serviceModel>.
<configuration>
<system.serviceModel>
<client>
<endpoint configurationName="calculator"
address="soap.udp://localhost:8001/"
bindingConfiguration="CalculatorServer"
binding="sampleProfileUdpBinding"
contract= "Microsoft.ServiceModel.Samples.ICalculatorContract">
</endpoint>
</client>
</system.serviceModel>
</configuration>
Aggiunta del supporto di metadati per un elemento di associazione
Per integrare un canale nel sistema di metadati, deve supportare sia l'importazione che l'esportazione dei criteri. In questo modo, strumenti come lo strumento utilità metadati ServiceModel (Svcutil.exe) possono generare client dell'elemento di binding.
Aggiunta del supporto WSDL
L'elemento di associazione di trasporto in un'associazione è responsabile dell'esportazione e dell'importazione delle informazioni di indirizzamento nei metadati. Quando si usa un'associazione SOAP, l'elemento di associazione del trasporto deve esportare anche un URI di trasporto corretto nei metadati. Il codice di esempio seguente è tratto dall'esempio Transport: UDP .
Esportazione WSDL
Per esportare le informazioni di indirizzamento, UdpTransportBindingElement implementa l'interfaccia System.ServiceModel.Description.IWsdlExportExtension . Il IWsdlExportExtension.ExportEndpoint metodo aggiunge le informazioni di indirizzamento corrette alla porta WSDL.
if (context.WsdlPort != null)
{
AddAddressToWsdlPort(context.WsdlPort, context.Endpoint.Address, encodingBindingElement.MessageVersion.Addressing);
}
L'implementazione UdpTransportBindingElement del ExportEndpoint metodo esporta anche un URI di trasporto quando l'endpoint usa un'associazione SOAP:
WsdlNS.SoapBinding soapBinding = GetSoapBinding(context, exporter);
if (soapBinding != null)
{
soapBinding.Transport = UdpPolicyStrings.UdpNamespace;
}
Importazione WSDL
Per estendere il sistema di importazione WSDL per gestire l'importazione degli indirizzi, aggiungere la configurazione seguente al file di configurazione per Svcutil.exe come illustrato nel file Svcutil.exe.config:
<configuration>
<system.serviceModel>
<client>
<metadata>
<wsdlImporters>
<extension type=" Microsoft.ServiceModel.Samples.UdpBindingElementImporter, UdpTransport" />
</wsdlImporters>
</metadata>
</client>
</system.serviceModel>
</configuration>
Quando si esegue Svcutil.exe, sono disponibili due opzioni per ottenere Svcutil.exe per caricare le estensioni di importazione WSDL:
Indicare Svcutil.exe nel file di configurazione usando /SvcutilConfig:<file>.
Aggiungere la sezione di configurazione a Svcutil.exe.config nella stessa directory di Svcutil.exe.
Il UdpBindingElementImporter tipo implementa l'interfaccia System.ServiceModel.Description.IWsdlImportExtension . Il ImportEndpoint metodo importa l'indirizzo dalla porta WSDL:
BindingElementCollection bindingElements = context.Endpoint.Binding.CreateBindingElements();
TransportBindingElement transportBindingElement = bindingElements.Find<TransportBindingElement>();
if (transportBindingElement is UdpTransportBindingElement)
{
ImportAddress(context);
}
Aggiunta del supporto delle politiche
L'elemento di associazione personalizzato può esportare asserzioni di criteri nell'associazione WSDL per un endpoint di servizio per esprimere le funzionalità di tale elemento di associazione. Il codice di esempio seguente è tratto dall'esempio Transport: UDP .
Esportazione dei criteri
Il UdpTransportBindingElement tipo implementa System.ServiceModel.Description.IPolicyExportExtension per aggiungere il supporto per l'esportazione delle politiche. Di conseguenza, System.ServiceModel.Description.MetadataExporter include UdpTransportBindingElement nella generazione di criteri per qualsiasi associazione che lo include.
In IPolicyExportExtension.ExportPolicyaggiungere un'asserzione per UDP e un'altra asserzione se il canale è in modalità multicast. Ciò è dovuto al fatto che la modalità multicast influisce sul modo in cui viene costruito lo stack di comunicazione e pertanto deve essere coordinata tra entrambi i lati.
ICollection<XmlElement> bindingAssertions = context.GetBindingAssertions();
XmlDocument xmlDocument = new XmlDocument();
bindingAssertions.Add(xmlDocument.CreateElement(
UdpPolicyStrings.Prefix, UdpPolicyStrings.TransportAssertion, UdpPolicyStrings.UdpNamespace));
if (Multicast)
{
bindingAssertions.Add(xmlDocument.CreateElement(
UdpPolicyStrings.Prefix, UdpPolicyStrings.MulticastAssertion, UdpPolicyStrings.UdpNamespace));
}
Poiché gli elementi personalizzati di associazione di trasporto sono responsabili della gestione dell'indirizzamento, l'implementazione di System.ServiceModel.Description.IPolicyExportExtension su UdpTransportBindingElement deve anche gestire l'esportazione delle appropriate asserzioni di criteri WS-Addressing per indicare la versione di WS-Addressing usata.
AddWSAddressingAssertion(context, encodingBindingElement.MessageVersion.Addressing);
Importazione dei criteri
Per estendere il sistema di importazione dei criteri, aggiungere la configurazione seguente al file di configurazione per Svcutil.exe come illustrato nel file Svcutil.exe.config:
<configuration>
<system.serviceModel>
<client>
<metadata>
<policyImporters>
<extension type=" Microsoft.ServiceModel.Samples.UdpBindingElementImporter, UdpTransport" />
</policyImporters>
</metadata>
</client>
</system.serviceModel>
</configuration>
Quindi implementiamo System.ServiceModel.Description.IPolicyImportExtension dalla nostra classe registrata (UdpBindingElementImporter). In IPolicyImportExtension.ImportPolicy esaminare le asserzioni nello spazio dei nomi appropriato e elaborare quelle destinate a generare il trasporto e verificare se è multicast. Rimuovere inoltre le asserzioni che l'importatore gestisce dall'elenco di asserzioni vincolanti. Anche in questo caso, quando si esegue Svcutil.exe, sono disponibili due opzioni per l'integrazione:
Indicare il punto Svcutil.exe nel file di configurazione utilizzando /SvcutilConfig:<file>.
Aggiungere la sezione di configurazione a Svcutil.exe.config nella stessa directory di Svcutil.exe.
Aggiunta di un importatore di binding standard personalizzato
Svcutil.exe e il tipo System.ServiceModel.Description.WsdlImporter, per impostazione predefinita, riconosce e importa associazioni fornite dal sistema. In caso contrario, il binding viene importato come istanza di System.ServiceModel.Channels.CustomBinding. Per abilitare Svcutil.exe e l'oggetto WsdlImporter a importare SampleProfileUdpBinding, anche UdpBindingElementImporter funge da importatore di associazioni standard personalizzato.
Un'utilità di importazione di associazioni standard personalizzata implementa il ImportEndpoint metodo sull'interfaccia System.ServiceModel.Description.IWsdlImportExtension per esaminare l'istanza System.ServiceModel.Channels.CustomBinding importata dai metadati per verificare se potrebbe essere stata generata da un'associazione standard specifica.
if (context.Endpoint.Binding is CustomBinding)
{
Binding binding;
if (transportBindingElement is UdpTransportBindingElement)
{
//if TryCreate is true, the CustomBinding will be replace by a SampleProfileUdpBinding in the
//generated config file for better typed generation.
if (SampleProfileUdpBinding.TryCreate(bindingElements, out binding))
{
binding.Name = context.Endpoint.Binding.Name;
binding.Namespace = context.Endpoint.Binding.Namespace;
context.Endpoint.Binding = binding;
}
}
}
In genere, l'implementazione di un'utilità di importazione dell'associazione standard personalizzata comporta la verifica delle proprietà degli elementi di associazione importati per verificare che solo le proprietà che potrebbero essere state impostate dall'associazione standard siano state modificate e che tutte le altre proprietà siano le relative impostazioni predefinite. Una strategia di base per l'implementazione di un'utilità di importazione dell'associazione standard consiste nel creare un'istanza dell'associazione standard, propagare le proprietà dagli elementi di associazione all'istanza di associazione standard supportata dall'associazione standard e confrontare gli elementi di associazione dall'associazione standard con gli elementi di associazione importati.