Sdílet prostřednictvím


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 SampleProfileUdpBindinga funkce mapují z vazby ConfigurationElement . OnApplyConfiguration Nakonec se metoda přepíše v SampleProfileUdpBindingkó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 UdpTransportBindingElementExportEndpoint 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:

  1. Nastavte Svcutil.exe na konfigurační soubor pomocí /SvcutilConfig:<file>.

  2. 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:

  1. Nastavte Svcutil.exe na konfigurační soubor pomocí /SvcutilConfig:<file>.

  2. 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 SampleProfileUdpBindingUdpBindingElementImporter 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.