Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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
Exportování WSDL a výrazů zásad pro prvek vazby
Identifikace kontrolních výrazů WSDL a zásad pro vložení a konfiguraci vazby nebo elementu vazby
Informace o vytváření uživatelsky definovaných vazeb a prvků vazeb naleznete v tématu Vytváření User-Defined vazeb a Vytváření prvků vazby.
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 ukázky Transport: UDP. Jedná se o UdpTransportElement, který zpřístupňuje BindingElementExtensionElement 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 SampleProfileUdpBindingCollectionElement je StandardBindingCollectionElement<TStandardBinding,TBindingConfiguration>, který zpřístupňuje SampleProfileUdpBinding konfiguračnímu systému. Většina implementace je delegována na SampleProfileUdpBindingConfigurationElement, která je odvozena od StandardBindingElement.
SampleProfileUdpBindingConfigurationElement má vlastnosti, které odpovídají vlastnostem na SampleProfileUdpBinding, a funkce pro mapování z vazby ConfigurationElement. Nakonec je metoda OnApplyConfiguration přepsána ve SampleProfileUdpBinding, 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 ve vazbě je zodpovědný za export a import adresní informace 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 ukázky Transport: 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 metody UdpTransportBindingElementExportEndpoint také exportuje transportní URI, když koncový bod používá SOAP vazbou.
WsdlNS.SoapBinding soapBinding = GetSoapBinding(context, exporter);
if (soapBinding != null)
{
soapBinding.Transport = UdpPolicyStrings.UdpNamespace;
}
WSDL importování
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.exejsou dvě možnosti, jak přimět Svcutil.exe načíst rozšíření WSDL importu.
Nasměrujte Svcutil.exe na konfigurační soubor pomocí /SvcutilConfig:<file>.
Přidejte oddíl konfigurace pro Svcutil.exe.config ve stejném adresáři jako Svcutil.exe.
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 v rámci vazby WSDL pro koncový bod služby exportovat výrazy zásad, aby vyjádřil schopnosti tohoto prvku vazby. Následující ukázkový kód je převzat z ukázky Transport: UDP.
Export zásad
Typ UdpTransportBindingElement implementuje System.ServiceModel.Description.IPolicyExportExtension, aby umožnil podporu exportu zásad. V důsledku toho System.ServiceModel.Description.MetadataExporter zahrnuje UdpTransportBindingElement do vytváření zásad pro jakoukoli vazbu, která ji zahrnuje.
V IPolicyExportExtension.ExportPolicy přidejte kontrolu pro UDP a další kontrolu, 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 koordinová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í, musí implementace na straně System.ServiceModel.Description.IPolicyExportExtension také zpracovat export požadovaných výrazů zásad WS-Addressing, které udávají verzi WS-Addressing, která se používá.
AddWSAddressingAssertion(context, encodingBindingElement.MessageVersion.Addressing);
Import politiky
Pokud chcete 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.ImportPolicy výrazy v příslušném oboru názvů a zpracujte je pro vytvoření přenosu a ověření, zda se jedná o vícesměrové vysílání. Kromě toho odeberte tvrzení, která zpracovává dovozce, ze seznamu závazných tvrzení. Při spuštění Svcutil.exeexistují dvě možnosti integrace:
Nasměrujte Svcutil.exe na náš konfigurační soubor pomocí /SvcutilConfig:<file>.
Přidejte oddíl konfigurace pro Svcutil.exe.config ve stejném adresáři jako Svcutil.exe.
Vytvoření vlastního importéru 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. Aby se povolilo Svcutil.exe a WsdlImporter pro import SampleProfileUdpBinding, UdpBindingElementImporter funguje také jako vlastní importér standardních vazeb.
Vlastní importér standardní vazby implementuje metodu ImportEndpoint v rozhraní System.ServiceModel.Description.IWsdlImportExtension, aby prozkoumal instanci System.ServiceModel.Channels.CustomBinding importovanou z metadat a zjistil, zda mohla být generová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.