Dela via


Stöd för konfiguration och metadata

Det här avsnittet beskriver hur du aktiverar konfigurations- och metadatastöd för bindningar och bindningselement.

Översikt över konfiguration och metadata

I det här avsnittet beskrivs följande uppgifter, som är valfria objekt 1, 2 och 4 i aktivitetslistan Utveckla kanaler .

  • Aktivera stöd för konfigurationsfiler för ett bindningselement.

  • Aktivera stöd för konfigurationsfiler för en bindning.

  • Exportera WSDL och principkontroller för ett bindningselement.

  • Identifiera WSDL- och principkontroller för att infoga och konfigurera bindnings- eller bindningselementet.

Information om hur du skapar användardefinierade bindningar och bindningselement finns i Skapa användardefinierade bindningarrespektive Skapa ett BindingElement.

Lägga till konfigurationsstöd

Om du vill aktivera stöd för konfigurationsfiler för en kanal måste du implementera två konfigurationsavsnitt, System.ServiceModel.Configuration.BindingElementExtensionElement, som möjliggör konfigurationsstöd för bindningselement och System.ServiceModel.Configuration.StandardBindingElement och System.ServiceModel.Configuration.StandardBindingCollectionElement<TStandardBinding,TBindingConfiguration>, som aktiverar konfigurationsstöd för bindningar.

Ett enklare sätt att göra detta är att använda exempelverktyget ConfigurationCodeGenerator för att generera konfigurationskod för dina bindningar och bindningselement.

Utöka BindingElementExtensionElement

Följande exempelkod hämtas från exemplet Transport: UDP . UdpTransportElement är en BindingElementExtensionElement som exponeras UdpTransportBindingElement för konfigurationssystemet. Med några grundläggande åsidosättningar definierar exemplet konfigurationsavsnittets namn, typen av bindningselement och hur du skapar bindningselementet. Användarna kan sedan registrera tillägget i en konfigurationsfil på följande sätt.

<configuration>  
  <system.serviceModel>  
    <extensions>  
      <bindingElementExtensions>  
      <add name="udpTransport" type="Microsoft.ServiceModel.Samples.UdpTransportElement, UdpTransport" />  
      </bindingElementExtensions>  
    </extensions>  
  </system.serviceModel>  
</configuration>  

Tillägget kan refereras från anpassade bindningar för att använda UDP som transport.

<configuration>  
  <system.serviceModel>  
    <bindings>  
      <customBinding>  
       <binding configurationName="UdpCustomBinding">  
         <udpTransport/>  
       </binding>  
      </customBinding>  
    </bindings>  
  </system.serviceModel>  
</configuration>  

Lägga till konfiguration för en bindning

Avsnittet SampleProfileUdpBindingCollectionElement är ett StandardBindingCollectionElement<TStandardBinding,TBindingConfiguration> som exponeras SampleProfileUdpBinding för konfigurationssystemet. Huvuddelen av implementeringen delegeras till SampleProfileUdpBindingConfigurationElement, som härleds från StandardBindingElement. Har SampleProfileUdpBindingConfigurationElement egenskaper som motsvarar egenskaperna för SampleProfileUdpBindingoch funktioner som ska mappas från bindningen ConfigurationElement . Slutligen OnApplyConfiguration åsidosättas metoden i SampleProfileUdpBinding, som du ser i följande exempelkod.

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;  
}  

Om du vill registrera den här hanteraren med konfigurationssystemet lägger du till följande avsnitt i den relevanta konfigurationsfilen.

<configuration>  
  <configSections>  
     <sectionGroup name="system.serviceModel">  
         <sectionGroup name="bindings">  
                 <section name="sampleProfileUdpBinding" type="Microsoft.ServiceModel.Samples.SampleProfileUdpBindingCollectionElement, UdpTransport" />  
         </sectionGroup>  
     </sectionGroup>  
  </configSections>  
</configuration>  

Det kan sedan refereras från konfigurationsavsnittet <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>  

Lägga till metadatastöd för ett bindningselement

För att integrera en kanal i metadatasystemet måste den ha stöd för både import och export av principen. På så sätt kan verktyg som ServiceModel Metadata Utility Tool (Svcutil.exe) generera klienter för bindningselementet.

Lägga till WSDL-stöd

Transportbindningselementet i en bindning ansvarar för att exportera och importera adresseringsinformation i metadata. När du använder en SOAP-bindning bör transportbindningselementet också exportera en korrekt transport-URI i metadata. Följande exempelkod hämtas från exemplet Transport: UDP .

WSDL-export

Om du vill exportera adresseringsinformation UdpTransportBindingElement implementerar System.ServiceModel.Description.IWsdlExportExtension gränssnittet. Metoden IWsdlExportExtension.ExportEndpoint lägger till rätt adressinformation till WSDL-porten.

if (context.WsdlPort != null)  
{  
    AddAddressToWsdlPort(context.WsdlPort, context.Endpoint.Address, encodingBindingElement.MessageVersion.Addressing);  
}  

Implementeringen UdpTransportBindingElement av ExportEndpoint metoden exporterar också en transport-URI när slutpunkten använder en SOAP-bindning:

WsdlNS.SoapBinding soapBinding = GetSoapBinding(context, exporter);  
if (soapBinding != null)  
{  
    soapBinding.Transport = UdpPolicyStrings.UdpNamespace;  
}  

WSDL-import

Om du vill utöka WSDL-importsystemet till att hantera importen av adresserna lägger du till följande konfiguration i konfigurationsfilen för Svcutil.exe som visas i filen Svcutil.exe.config:

<configuration>  
  <system.serviceModel>  
    <client>  
      <metadata>  
        <wsdlImporters>  
          <extension type=" Microsoft.ServiceModel.Samples.UdpBindingElementImporter, UdpTransport" />  
        </wsdlImporters>  
      </metadata>  
    </client>  
  </system.serviceModel>  
</configuration>  

När du kör Svcutil.exe finns det två alternativ för att hämta Svcutil.exe för att läsa in WSDL-importtilläggen:

  1. Peka Svcutil.exe till konfigurationsfilen med hjälp av filen> /SvcutilConfig:<.

  2. Lägg till konfigurationsavsnittet i Svcutil.exe.config i samma katalog som Svcutil.exe.

Typen UdpBindingElementImporter implementerar System.ServiceModel.Description.IWsdlImportExtension gränssnittet. Metoden ImportEndpoint importerar adressen från WSDL-porten:

BindingElementCollection bindingElements = context.Endpoint.Binding.CreateBindingElements();  
TransportBindingElement transportBindingElement = bindingElements.Find<TransportBindingElement>();  
if (transportBindingElement is UdpTransportBindingElement)  
{  
    ImportAddress(context);  
}  

Lägga till principstöd

Det anpassade bindningselementet kan exportera principkontroller i WSDL-bindningen för en tjänstslutpunkt för att uttrycka funktionerna i det bindningselementet. Följande exempelkod hämtas från exemplet Transport: UDP .

Principexport

Typen UdpTransportBindingElement implementerar System.ServiceModel.Description.IPolicyExportExtension för att lägga till stöd för exportprincip. Därför System.ServiceModel.Description.MetadataExporter ingår UdpTransportBindingElement i genereringen av principen för alla bindningar som innehåller den.

I IPolicyExportExtension.ExportPolicylägger du till en försäkran för UDP och en annan försäkran om kanalen är i multicast-läge. Det beror på att multicast-läget påverkar hur kommunikationsstacken konstrueras och därför måste samordnas mellan båda sidor.

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));  
}  

Eftersom anpassade transportbindningselement ansvarar för hantering av adresser System.ServiceModel.Description.IPolicyExportExtension måste implementeringen av UdpTransportBindingElement även hantera export av lämpliga principkontroller för WS-adressering för att ange vilken version av WS-Addressing som används.

AddWSAddressingAssertion(context, encodingBindingElement.MessageVersion.Addressing);  

Principimport

Om du vill utöka systemet för principimport lägger du till följande konfiguration i konfigurationsfilen för Svcutil.exe som visas i filen Svcutil.exe.config:

<configuration>  
  <system.serviceModel>  
    <client>  
      <metadata>  
        <policyImporters>  
          <extension type=" Microsoft.ServiceModel.Samples.UdpBindingElementImporter, UdpTransport" />  
        </policyImporters>  
      </metadata>  
    </client>  
  </system.serviceModel>  
</configuration>  

Sedan implementerar System.ServiceModel.Description.IPolicyImportExtension vi från vår registrerade klass (UdpBindingElementImporter). I IPolicyImportExtension.ImportPolicyundersöker du försäkran i lämpligt namnområde och bearbetar dem för att generera transporten och kontrollera om den är multicast. Ta dessutom bort de intyg som importören hanterar från listan över bindningskontroller. När du kör Svcutil.exe finns det två alternativ för integrering:

  1. Peka Svcutil.exe till konfigurationsfilen med hjälp av filen> /SvcutilConfig:<.

  2. Lägg till konfigurationsavsnittet i Svcutil.exe.config i samma katalog som Svcutil.exe.

Lägga till en anpassad standardbindningsimportör

Svcutil.exe och System.ServiceModel.Description.WsdlImporter typen identifierar och importerar som standard bindningar som tillhandahålls av systemet. Annars importeras bindningen som en System.ServiceModel.Channels.CustomBinding instans. Om du vill aktivera Svcutil.exe och WsdlImporter importera SampleProfileUdpBindingUdpBindingElementImporter fungerar även som en anpassad standardbindningsimportör.

En anpassad standardbindningsimportör implementerar ImportEndpoint metoden i System.ServiceModel.Description.IWsdlImportExtension gränssnittet för att undersöka den instans som System.ServiceModel.Channels.CustomBinding importerats från metadata för att se om den kunde ha genererats av en specifik standardbindning.

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;  
        }  
    }  
}  

I allmänhet innebär implementering av en anpassad standardbindningsimportör att kontrollera egenskaperna för de importerade bindningselementen för att kontrollera att endast egenskaper som kunde ha angetts av standardbindningen har ändrats och att alla andra egenskaper är deras standardvärden. En grundläggande strategi för att implementera en standardbindningsimportör är att skapa en instans av standardbindningen, sprida egenskaperna från bindningselementen till den standardbindningsinstans som standardbindningen stöder och jämföra bindningselementen från standardbindningen med de importerade bindningselementen.