Delen via


Ondersteuning voor configuratie en metagegevens

In dit onderwerp wordt beschreven hoe u ondersteuning voor configuratie en metagegevens inschakelt voor bindingen en bindingselementen.

Overzicht van configuratie en metagegevens

In dit onderwerp worden de volgende taken besproken. Dit zijn optionele items 1, 2 en 4 in de takenlijst Kanalen ontwikkelen.

  • Ondersteuning voor configuratiebestanden inschakelen voor een bindingselement.

  • Ondersteuning voor configuratiebestanden inschakelen voor een binding.

  • WSDL- en beleidsverklaringen exporteren voor een bindingselement.

  • WSDL- en beleidsverklaringen identificeren om uw bindings- of bindingselement in te voegen en te configureren.

Zie Voor informatie over het maken van door de gebruiker gedefinieerde bindingen en bindingselementen respectievelijk Het maken van door de gebruiker gedefinieerde bindingen en het maken van een BindingElement.

Configuratieondersteuning toevoegen

Als u ondersteuning voor configuratiebestanden voor een kanaal wilt inschakelen, moet u twee configuratiesecties implementeren, System.ServiceModel.Configuration.BindingElementExtensionElementdie configuratieondersteuning voor bindingselementen mogelijk maakt en de System.ServiceModel.Configuration.StandardBindingElement en System.ServiceModel.Configuration.StandardBindingCollectionElement<TStandardBinding,TBindingConfiguration>, waarmee configuratieondersteuning voor bindingen wordt ingeschakeld.

Een eenvoudigere manier om dit te doen, is door het voorbeeldhulpprogramma ConfigurationCodeGenerator te gebruiken om configuratiecode te genereren voor uw bindingen en bindingselementen.

BindingElementExtensionElement uitbreiden

De volgende voorbeeldcode is afkomstig uit het voorbeeld Transport: UDP . Dit UdpTransportElement is een BindingElementExtensionElement systeem dat beschikbaar is voor UdpTransportBindingElement het configuratiesysteem. Met enkele eenvoudige onderdrukkingen definieert het voorbeeld de naam van de configuratiesectie, het type bindingselement en het maken van het bindingselement. Gebruikers kunnen vervolgens de extensiesectie als volgt registreren in een configuratiebestand.

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

Naar de extensie kan worden verwezen vanuit aangepaste bindingen om UDP als transport te gebruiken.

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

Configuratie voor een binding toevoegen

De sectie is een StandardBindingCollectionElement<TStandardBinding,TBindingConfiguration> sectie SampleProfileUdpBindingCollectionElement die beschikbaar is voor SampleProfileUdpBinding het configuratiesysteem. Het grootste deel van de implementatie wordt gedelegeerd aan de SampleProfileUdpBindingConfigurationElement, die is afgeleid van StandardBindingElement. De SampleProfileUdpBindingConfigurationElement eigenschappen komen overeen met de eigenschappen op SampleProfileUdpBindingen functies die vanuit de ConfigurationElement binding moeten worden toegewezen. Ten slotte wordt de OnApplyConfiguration methode overschreven in de SampleProfileUdpBinding, zoals wordt weergegeven in de volgende voorbeeldcode.

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

Als u deze handler wilt registreren bij het configuratiesysteem, voegt u de volgende sectie toe aan het relevante configuratiebestand.

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

Er kan vervolgens naar worden verwezen vanuit de configuratiesectie 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>  

Ondersteuning voor metagegevens toevoegen voor een bindingselement

Als u een kanaal wilt integreren in het metagegevenssysteem, moet het zowel het importeren als exporteren van beleid ondersteunen. Hierdoor kunnen hulpprogramma's zoals het hulpprogramma voor metagegevens van ServiceModel (Svcutil.exe) clients van het bindingselement genereren.

WSDL-ondersteuning toevoegen

Het transportbindingselement in een binding is verantwoordelijk voor het exporteren en importeren van adresseringsinformatie in metagegevens. Wanneer u een SOAP-binding gebruikt, moet het transportbindingselement ook een juiste transport-URI in metagegevens exporteren. De volgende voorbeeldcode is afkomstig uit het voorbeeld Transport: UDP .

WSDL Exporteren

De interface wordt geïmplementeerd om adresseringsgegevens UdpTransportBindingElementSystem.ServiceModel.Description.IWsdlExportExtension te exporteren. De IWsdlExportExtension.ExportEndpoint methode voegt de juiste adresseringsinformatie toe aan de WSDL-poort.

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

De UdpTransportBindingElement implementatie van de ExportEndpoint methode exporteert ook een transport-URI wanneer het eindpunt een SOAP-binding gebruikt:

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

WSDL Importeren

Als u het WSDL-importsysteem wilt uitbreiden voor het importeren van de adressen, voegt u de volgende configuratie toe aan het configuratiebestand voor Svcutil.exe, zoals wordt weergegeven in het bestand Svcutil.exe.config:

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

Wanneer u Svcutil.exe uitvoert, zijn er twee opties om Svcutil.exe te krijgen om de WSDL-importextensies te laden:

  1. Wijs Svcutil.exe naar het configuratiebestand met behulp van het /SvcutilConfig:<-bestand>.

  2. Voeg de configuratiesectie toe aan Svcutil.exe.config in dezelfde map als Svcutil.exe.

Het UdpBindingElementImporter type implementeert de System.ServiceModel.Description.IWsdlImportExtension interface. De ImportEndpoint methode importeert het adres uit de WSDL-poort:

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

Beleidsondersteuning toevoegen

Het aangepaste bindingselement kan beleidsverklaringen exporteren in de WSDL-binding voor een service-eindpunt om de mogelijkheden van dat bindingselement uit te drukken. De volgende voorbeeldcode is afkomstig uit het voorbeeld Transport: UDP .

Beleidsexport

Het UdpTransportBindingElement type implementeert System.ServiceModel.Description.IPolicyExportExtension om ondersteuning toe te voegen voor het exporteren van beleid. Als gevolg hiervan System.ServiceModel.Description.MetadataExporter omvat u UdpTransportBindingElement het genereren van beleid voor elke binding die deze bevat.

Voeg in IPolicyExportExtension.ExportPolicyeen verklaring voor UDP en een andere assertie toe als het kanaal zich in de multicast-modus bevindt. Dit komt doordat de multicastmodus van invloed is op de manier waarop de communicatiestack wordt samengesteld en dus moet worden gecoördineerd tussen beide zijden.

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

Omdat aangepaste transportbindingselementen verantwoordelijk zijn voor het afhandelen van adressering, moet de System.ServiceModel.Description.IPolicyExportExtension implementatie op de UdpTransportBindingElement implementatie ook de juiste WS-Adresseringsbeleidsverklaringen verwerken om aan te geven welke versie van WS-Adressering wordt gebruikt.

AddWSAddressingAssertion(context, encodingBindingElement.MessageVersion.Addressing);  

Beleid importeren

Als u het systeem voor het importeren van het beleid wilt uitbreiden, voegt u de volgende configuratie toe aan het configuratiebestand voor Svcutil.exe, zoals wordt weergegeven in het bestand Svcutil.exe.config:

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

Vervolgens implementeren System.ServiceModel.Description.IPolicyImportExtension we vanuit onze geregistreerde klasse (UdpBindingElementImporter). Bekijk IPolicyImportExtension.ImportPolicyde asserties in de juiste naamruimte en verwerkt de asserties voor het genereren van het transport en controleer of het multicast is. Verwijder bovendien de beweringen die de importeur verwerkt uit de lijst met bindingsverklaringen. Ook bij het uitvoeren van Svcutil.exe zijn er twee opties voor integratie:

  1. Wijs Svcutil.exe naar ons configuratiebestand met behulp van het bestand> /SvcutilConfig:<.

  2. Voeg de configuratiesectie toe aan Svcutil.exe.config in dezelfde map als Svcutil.exe.

Een aangepaste standaardbindingimporteur toevoegen

Svcutil.exe en het type worden standaard door het System.ServiceModel.Description.WsdlImporter systeem geleverde bindingen herkend en geïmporteerd. Anders wordt de binding geïmporteerd als een System.ServiceModel.Channels.CustomBinding exemplaar. Om Svcutil.exe en de WsdlImporter importfunctie in te schakelen, fungeert de UdpBindingElementImporterSampleProfileUdpBinding functie ook als een aangepaste standaardbindingsimporteur.

Een aangepaste standaardbindingimporteur implementeert de ImportEndpoint methode op de System.ServiceModel.Description.IWsdlImportExtension interface om het System.ServiceModel.Channels.CustomBinding exemplaar te onderzoeken dat is geïmporteerd uit metagegevens om te zien of het kan zijn gegenereerd door een specifieke standaardbinding.

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

Over het algemeen omvat het implementeren van een aangepaste standaardbindingimporteur het controleren van de eigenschappen van de geïmporteerde bindingselementen om te controleren of alleen eigenschappen die door de standaardbinding kunnen zijn ingesteld, zijn gewijzigd en alle andere eigenschappen de standaardwaarden zijn. Een basisstrategie voor het implementeren van een standaardbindingimporteur is het maken van een exemplaar van de standaardbinding, het doorgeven van de eigenschappen van de bindingselementen aan het standaardbindingexemplaren dat door de standaardbinding wordt ondersteund en het vergelijken van de bindingselementen van de standaardbinding met de geïmporteerde bindingselementen.