Konfigurace a podpora metadat
Toto téma popisuje, jak povolit podporu konfigurace a metadat pro vazby a prvky vazby.
Přehled konfigurace a metadat
Toto téma popisuje následující úkoly, které jsou volitelné položky 1, 2 a 4 v seznamu úkolů Vývoj kanálů .
Povolení podpory konfiguračního souboru pro element vazby
Povolení podpory konfiguračních souborů pro vazbu
Export kontrolních výrazů WSDL a zásad pro element vazby
Identifikace kontrolních výrazů WSDL a zásad pro vložení a konfiguraci vazby nebo elementu vazby
Informace o vytváření uživatelem definovaných vazeb a elementů vazby naleznete v tématu Vytváření uživatelem definovaných vazeb a Vytváření BindingElement v uvedeném pořadí.
Přidání podpory konfigurace
Chcete-li povolit podporu konfiguračních souborů pro kanál, musíte implementovat dvě části konfigurace, System.ServiceModel.Configuration.BindingElementExtensionElementkteré umožňují podporu konfigurace pro prvky vazby a System.ServiceModel.Configuration.StandardBindingElement a System.ServiceModel.Configuration.StandardBindingCollectionElement<TStandardBinding,TBindingConfiguration>, které umožňují podporu konfigurace pro vazby.
Jednodušším způsobem je použít ukázkový nástroj ConfigurationCodeGenerator k vygenerování konfiguračního kódu pro vazby a prvky vazby.
Rozšíření BindingElementExtensionElement
Následující ukázkový kód je převzat z transportu : ukázka UDP . Jedná se UdpTransportElement
o ten BindingElementExtensionElement , který zpřístupňuje UdpTransportBindingElement
konfiguračnímu systému. S několika základními přepsáními ukázka definuje název konfiguračního oddílu, typ elementu vazby a způsob vytvoření elementu vazby. Uživatelé pak můžou oddíl rozšíření zaregistrovat v konfiguračním souboru následujícím způsobem.
<configuration>
<system.serviceModel>
<extensions>
<bindingElementExtensions>
<add name="udpTransport" type="Microsoft.ServiceModel.Samples.UdpTransportElement, UdpTransport" />
</bindingElementExtensions>
</extensions>
</system.serviceModel>
</configuration>
Na rozšíření lze odkazovat z vlastních vazeb, aby se jako přenos používal UDP.
<configuration>
<system.serviceModel>
<bindings>
<customBinding>
<binding configurationName="UdpCustomBinding">
<udpTransport/>
</binding>
</customBinding>
</bindings>
</system.serviceModel>
</configuration>
Přidání konfigurace pro vazbu
Oddíl je StandardBindingCollectionElement<TStandardBinding,TBindingConfiguration> oddílSampleProfileUdpBindingCollectionElement
, který zpřístupňuje SampleProfileUdpBinding
konfiguračnímu systému. Většina implementace je delegována na SampleProfileUdpBindingConfigurationElement
, která je odvozena od StandardBindingElement. Obsahuje SampleProfileUdpBindingConfigurationElement
vlastnosti, které odpovídají vlastnostem v SampleProfileUdpBinding
a funkce mapují z vazby ConfigurationElement
. OnApplyConfiguration
Nakonec se metoda přepíše v SampleProfileUdpBinding
kódu , jak je znázorněno v následujícím vzorovém kódu.
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;
}
Pokud chcete tuto obslužnou rutinu zaregistrovat v konfiguračním systému, přidejte do příslušného konfiguračního souboru následující část.
<configuration>
<configSections>
<sectionGroup name="system.serviceModel">
<sectionGroup name="bindings">
<section name="sampleProfileUdpBinding" type="Microsoft.ServiceModel.Samples.SampleProfileUdpBindingCollectionElement, UdpTransport" />
</sectionGroup>
</sectionGroup>
</configSections>
</configuration>
Potom je možné na něj odkazovat v části konfigurace 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>
Přidání podpory metadat pro element vazby
Aby bylo možné integrovat kanál do systému metadat, musí podporovat import i export zásad. To umožňuje nástrojům, jako je ServiceModel Metadata Utility Tool (Svcutil.exe), generovat klienty elementu vazby.
Přidání podpory WSDL
Prvek transportní vazby v vazbě je zodpovědný za export a import adresování informací v metadatech. Při použití vazby SOAP by prvek vazby přenosu měl také exportovat správný transportní identifikátor URI v metadatech. Následující ukázkový kód je převzat z transportu : ukázka UDP .
WSDL Export
Pokud chcete exportovat informace o adresování, UdpTransportBindingElement
implementuje System.ServiceModel.Description.IWsdlExportExtension rozhraní. Metoda IWsdlExportExtension.ExportEndpoint přidá správné informace o adresování na port WSDL.
if (context.WsdlPort != null)
{
AddAddressToWsdlPort(context.WsdlPort, context.Endpoint.Address, encodingBindingElement.MessageVersion.Addressing);
}
Implementace UdpTransportBindingElement
ExportEndpoint metody také exportuje identifikátor URI přenosu, když koncový bod používá vazbu SOAP:
WsdlNS.SoapBinding soapBinding = GetSoapBinding(context, exporter);
if (soapBinding != null)
{
soapBinding.Transport = UdpPolicyStrings.UdpNamespace;
}
WSDL Import
Chcete-li rozšířit systém importu WSDL pro zpracování importu adres, přidejte do konfiguračního souboru Svcutil.exe následující konfiguraci, jak je znázorněno v souboru Svcutil.exe.config:
<configuration>
<system.serviceModel>
<client>
<metadata>
<wsdlImporters>
<extension type=" Microsoft.ServiceModel.Samples.UdpBindingElementImporter, UdpTransport" />
</wsdlImporters>
</metadata>
</client>
</system.serviceModel>
</configuration>
Při spuštění Svcutil.exe existují dvě možnosti, jak získat Svcutil.exe pro načtení rozšíření importu WSDL:
Nastavte Svcutil.exe na konfigurační soubor pomocí /SvcutilConfig:<file>.
Do stejného adresáře jako Svcutil.exe přidejte oddíl konfigurace Svcutil.exe.config.
Typ UdpBindingElementImporter
implementuje System.ServiceModel.Description.IWsdlImportExtension rozhraní. Metoda ImportEndpoint
naimportuje adresu z portu WSDL:
BindingElementCollection bindingElements = context.Endpoint.Binding.CreateBindingElements();
TransportBindingElement transportBindingElement = bindingElements.Find<TransportBindingElement>();
if (transportBindingElement is UdpTransportBindingElement)
{
ImportAddress(context);
}
Přidání podpory zásad
Element vlastní vazby může exportovat kontrolní výrazy zásad ve vazbě WSDL pro koncový bod služby k vyjádření schopností tohoto elementu vazby. Následující ukázkový kód je převzat z transportu : ukázka UDP .
Export zásad
Typ UdpTransportBindingElement
implementuje System.ServiceModel.Description.IPolicyExportExtension přidání podpory pro export zásad. V důsledku toho System.ServiceModel.Description.MetadataExporter zahrnuje UdpTransportBindingElement
generování zásad pro všechny vazby, které ji zahrnují.
V IPolicyExportExtension.ExportPolicyaplikaci přidejte kontrolní výraz pro UDP a další kontrolní výraz, pokud je kanál v režimu vícesměrového vysílání. Důvodem je to, že režim vícesměrového vysílání ovlivňuje způsob vytváření komunikačního zásobníku, a proto musí být sladěný mezi oběma stranami.
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));
}
Vzhledem k tomu, že vlastní prvky vazby přenosu jsou zodpovědné za zpracování adresování, System.ServiceModel.Description.IPolicyExportExtension musí implementace na straně UdpTransportBindingElement
musí také zpracovat export příslušných kontrolních výrazů zásad WS-Adresování, které označují verzi používaného WS-Adresování.
AddWSAddressingAssertion(context, encodingBindingElement.MessageVersion.Addressing);
Import zásad
Chcete-li rozšířit systém importu zásad, přidejte do konfiguračního souboru následující konfiguraci pro Svcutil.exe, jak je znázorněno v souboru Svcutil.exe.config:
<configuration>
<system.serviceModel>
<client>
<metadata>
<policyImporters>
<extension type=" Microsoft.ServiceModel.Samples.UdpBindingElementImporter, UdpTransport" />
</policyImporters>
</metadata>
</client>
</system.serviceModel>
</configuration>
Pak implementujeme System.ServiceModel.Description.IPolicyImportExtension z naší registrované třídy (UdpBindingElementImporter
). Zkontrolujte IPolicyImportExtension.ImportPolicykontrolní výrazy v příslušném oboru názvů a zpracujte je pro generování přenosu a kontrolu, jestli se jedná o vícesměrové vysílání. Kromě toho odeberte kontrolní výrazy, které dovozce zpracovává ze seznamu vazebních kontrolních výrazů. Při spuštění Svcutil.exe existují dvě možnosti integrace:
Nastavte Svcutil.exe na konfigurační soubor pomocí /SvcutilConfig:<file>.
Do stejného adresáře jako Svcutil.exe přidejte oddíl konfigurace Svcutil.exe.config.
Přidání vlastního importu standardních vazeb
Svcutil.exe a System.ServiceModel.Description.WsdlImporter typ ve výchozím nastavení rozpoznávají a importují systémové vazby poskytované systémem. V opačném případě se vazba naimportuje jako System.ServiceModel.Channels.CustomBinding instance. Pro povolení Svcutil.exe a WsdlImporter importu SampleProfileUdpBinding
UdpBindingElementImporter
funguje také jako vlastní standardní importér vazeb.
Vlastní import standardní vazby implementuje metodu ImportEndpoint
v System.ServiceModel.Description.IWsdlImportExtension rozhraní, aby prozkoumala System.ServiceModel.Channels.CustomBinding instanci importovanou z metadat a zjistila, jestli mohla být vygenerována konkrétní standardní vazbou.
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;
}
}
}
Obecně platí, že implementace vlastního importu standardních vazeb zahrnuje kontrolu vlastností importovaných prvků vazby a ověření, že se změnily pouze vlastnosti, které by mohly být nastaveny standardní vazbou, a všechny ostatní vlastnosti jsou jejich výchozí hodnoty. Základní strategií pro implementaci importu standardních vazeb je vytvoření instance standardní vazby, šíření vlastností z prvků vazby do standardní instance vazby, kterou standardní vazba podporuje, a porovnání prvků vazby ze standardní vazby s importovanými prvky vazby.