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 policypåståenden för ett bindningselement.

  • Identifiera WSDL- och policyspecifikationer för att infoga och konfigurera bindningar eller bindningselement.

Information om hur du skapar användardefinierade bindningar och bindningselement finns i Skapa User-Defined bindningar respektive 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.

Utvidga BindingElementExtensionElement

Följande exempelkod hämtas från exemplet Transport: UDP . UdpTransportElement är en BindingElementExtensionElement som exponerar 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 användas i 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>  

Konfigurera inställningar för en bindning

Avsnittet SampleProfileUdpBindingCollectionElement är ett StandardBindingCollectionElement<TStandardBinding,TBindingConfiguration> som exponerar SampleProfileUdpBinding för konfigurationssystemet. Huvuddelen av implementeringen delegeras till SampleProfileUdpBindingConfigurationElement, som härleds från StandardBindingElement. Har SampleProfileUdpBindingConfigurationElement egenskaper som motsvarar egenskaperna för SampleProfileUdpBinding: och har funktioner för att mappa från ConfigurationElement-bindningen. Slutligen åsidosätts metoden i OnApplyConfiguration, som visas 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 för att hantera import av adresserna lägger du till följande konfiguration i konfigurationsfilen för Svcutil.exe som visas i Svcutil.exe.config-filen:

<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.exefinns det två alternativ för att få Svcutil.exe att ladda 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 policyuttryck i WSDL-bindningen för en tjänstslutpunkt för att uttrycka funktionerna hos det bindningselementet. Följande exempelkod hämtas från exemplet Transport: UDP .

Policyexport

Typen UdpTransportBindingElement implementerar System.ServiceModel.Description.IPolicyExportExtension för att lägga till stöd för exportprincip. Därför inkluderas System.ServiceModel.Description.MetadataExporter i skapandet av policyn för varje bindning som inkluderar det.

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 adresshantering, måste implementeringen av System.ServiceModel.Description.IPolicyExportExtension även hantera export av lämpliga WS-Addressing policysatser för att indikera 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 påståenden som importören hanterar från listan över bindande förutsättningar. När du kör Svcutil.exefinns det två alternativ för integrering:

  1. Peka Svcutil.exe mot vår konfigurationsfil med hjälp av /SvcutilConfig:<fil>.

  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. För att möjliggöra Svcutil.exe och WsdlImporter att importera SampleProfileUdpBinding fungerar UdpBindingElementImporter också som en anpassad importör för standardbindning.

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.