Sdílet prostřednictvím


Podpora konfigurace a 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

  • 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.

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

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

  1. Nasměrujte Svcutil.exe na náš konfigurační soubor pomocí /SvcutilConfig:<file>.

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