Konfiguration und MetadatenunterstützungConfiguration and Metadata Support

In diesem Thema wird beschrieben, wie Konfigurations- und Metadatenunterstützung für Bindungen und Bindungselemente aktiviert wird.This topic describes how to enable configuration and metadata support for bindings and binding elements.

Überblick über Konfiguration und MetadatenOverview of Configuration and Metadata

In diesem Artikel werden die folgenden Aufgaben aus, welche optionalen Elemente 1, 2 und 4 sind in der Entwickeln von Kanälen Aufgabenliste.This topic discusses the following tasks, which are optional items 1, 2, and 4 in the Developing Channels task list.

  • Aktivierung von Unterstützung der Konfigurationsdatei für ein Bindungselement.Enabling configuration file support for a binding element.

  • Aktivierung von Unterstützung der Konfigurationsdatei für eine Bindung.Enabling configuration file support for a binding.

  • Export von WSDL und Richtlinienassertionen für ein Bindungselement.Exporting WSDL and policy assertions for a binding element.

  • Identifizierung von WSDL und Richtlinienassertionen für das Einsetzen und Konfigurieren der Bindung oder des Bindungselements.Identifying WSDL and policy assertions to insert and configure your binding or binding element.

Informationen zum Erstellen von benutzerdefinierten Bindungen und Bindungselemente verwenden, finden Sie unter Erstellen benutzerdefinierter Bindungen und Erstellen eines BindingElementzugeordnet.For information about creating user-defined bindings and binding elements, see Creating User-Defined Bindings and Creating a BindingElement, respectively.

Hinzufügen von KonfigurationsunterstützungAdding Configuration Support

Zum Aktivieren der Konfigurationsdateiunterstützung für einen Kanal müssen Sie zwei Konfigurationsabschnitte implementieren, System.ServiceModel.Configuration.BindingElementExtensionElement, wodurch die Konfigurationsunterstützung für Bindungselemente aktiviert wird, und das System.ServiceModel.Configuration.StandardBindingElement sowie das System.ServiceModel.Configuration.StandardBindingCollectionElement<TStandardBinding,TBindingConfiguration> implementieren, wodurch die Konfigurationsunterstützung für Bindungen aktiviert wird.To enable configuration file support for a channel, you must implement two configuration sections, System.ServiceModel.Configuration.BindingElementExtensionElement, which enables configuration support for binding elements, and the System.ServiceModel.Configuration.StandardBindingElement and System.ServiceModel.Configuration.StandardBindingCollectionElement<TStandardBinding,TBindingConfiguration>, which enable configuration support for bindings.

Eine einfachere Möglichkeit hierzu ist die Verwendung der ConfigurationCodeGenerator Beispieltool Konfigurationscode für die Bindungen und Bindungselemente zu generieren.An easier way to do this is to use the ConfigurationCodeGenerator sample tool to generate configuration code for your bindings and binding elements.

Erweitern von BindingElementExtensionElementExtending BindingElementExtensionElement

Der folgende Beispielcode stammt aus dem Transport: UDP Beispiel.The following example code is taken from the Transport: UDP sample. UdpTransportElement ist ein BindingElementExtensionElement, das UdpTransportBindingElement für das Konfigurationssystem verfügbar macht.The UdpTransportElement is a BindingElementExtensionElement that exposes UdpTransportBindingElement to the configuration system. Mit wenigen grundlegenden Überschreibungen definiert das Beispiel den Konfigurationsabschnittsnamen, den Typ des Bindungselements und wie das Bindungselement erstellt wird.With a few basic overrides, the sample defines the configuration section name, the type of the binding element and how to create the binding element. Benutzer können dann wie folgt den Erweiterungsabschnitt in einer Konfigurationsdatei registrieren.Users can then register the extension section in a configuration file as follows.

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

Auf die Erweiterung kann von benutzerdefinierten Bindungen verwiesen werden, um UDP als Transport zu nutzen.The extension can be referenced from custom bindings to use UDP as the transport.

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

Hinzufügen einer Konfiguration für eine BindungAdding Configuration for a Binding

Der Abschnitt SampleProfileUdpBindingCollectionElement ist ein StandardBindingCollectionElement<TStandardBinding,TBindingConfiguration>, das die SampleProfileUdpBinding für das Konfigurationssystem verfügbar macht.The section SampleProfileUdpBindingCollectionElement is a StandardBindingCollectionElement<TStandardBinding,TBindingConfiguration> that exposes SampleProfileUdpBinding to the configuration system. Dem SampleProfileUdpBindingConfigurationElement, das sich von StandardBindingElement herleitet, wird der Großteil der Implementierung übertragen.The bulk of the implementation is delegated to the SampleProfileUdpBindingConfigurationElement, which derives from StandardBindingElement. Die SampleProfileUdpBindingConfigurationElement verfügt über Eigenschaften, die auf die Eigenschaften entsprechen SampleProfileUdpBinding, und die Funktionen für die Zuordnung der ConfigurationElement Bindung.The SampleProfileUdpBindingConfigurationElement has properties that correspond to the properties on SampleProfileUdpBinding, and functions to map from the ConfigurationElement binding. Schließlich wird die OnApplyConfiguration-Methode in der SampleProfileUdpBinding überschrieben. Dies wird im folgenden Beispielcode veranschaulicht.Finally, the OnApplyConfiguration method is overridden in the SampleProfileUdpBinding, as shown in the following sample code.

protected override void OnApplyConfiguration(string configurationName)  
{  
            if (binding == null)  
                throw new ArgumentNullException("binding");  

            if (binding.GetType() != typeof(SampleProfileUdpBinding))  
            {  
                throw new ArgumentException(string.Format(CultureInfo.CurrentCulture,  
                    "Invalid type for binding. Expected type: {0}. Type passed in: {1}.",  
                    typeof(SampleProfileUdpBinding).AssemblyQualifiedName,  
                    binding.GetType().AssemblyQualifiedName));  
            }  
            SampleProfileUdpBinding udpBinding = (SampleProfileUdpBinding)binding;  

            udpBinding.OrderedSession = this.OrderedSession;  
            udpBinding.ReliableSessionEnabled = this.ReliableSessionEnabled;  
            udpBinding.SessionInactivityTimeout = this.SessionInactivityTimeout;  
            if (this.ClientBaseAddress != null)  
                   udpBinding.ClientBaseAddress = ClientBaseAddress;  
}  

Um diesen Handler mit dem Konfigurationssystem zu registrieren, fügen Sie der relevanten Konfigurationsdatei den folgenden Abschnitt hinzu.To register this handler with the configuration system, add the following section to the relevant configuration file.

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

Es kann dann von verwiesen werden die <system.serviceModel > Konfigurationsabschnitt.It can then be referenced from the <system.serviceModel> configuration section.

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

Hinzufügen von Metadatenunterstützung für ein BindungselementAdding Metadata Support for a Binding Element

Um einen Kanal in ein Metadatensystem zu integrieren, muss dieser sowohl den Import als auch den Export von Richtlinien unterstützen.To integrate a channel into the metadata system, it must support both the import and export of policy. Dadurch können Tools wie z. B. ServiceModel Metadata Utility Tool (Svcutil.exe) zum Generieren von Clients des Bindungselements.This allows tools such as ServiceModel Metadata Utility Tool (Svcutil.exe) to generate clients of the binding element.

Hinzufügen von WSDL-UnterstützungAdding WSDL Support

Das Transportbindungselement in einer Bindung ist für den Export und Import von Adressierungsinformationen in/zu Metadaten verantwortlich.The transport binding element in a binding is responsible for exporting and importing addressing information in metadata. Bei der Nutzung einer SOAP-Bindung sollte das Transportbindungselement ebenfalls einen korrekten Transport-URI in die Metadaten exportieren.When using a SOAP binding, the transport binding element should also export a correct transport URI in metadata. Der folgende Beispielcode stammt aus dem Transport: UDP Beispiel.The following example code is taken from the Transport: UDP sample.

WSDL-ExportWSDL Export

Um Adressierungsinformationen zu exportieren der UdpTransportBindingElement implementiert die System.ServiceModel.Description.IWsdlExportExtension Schnittstelle.To export addressing information, the UdpTransportBindingElement implements the System.ServiceModel.Description.IWsdlExportExtension interface. Die IWsdlExportExtension.ExportEndpoint-Methode fügt dem WSDL-Port die richtigen Adressierungsinformationen hinzu.The IWsdlExportExtension.ExportEndpoint method adds the correct addressing information to the WSDL port.

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

Die UdpTransportBindingElement-Implementierung der ExportEndpoint-Methode exportiert ebenfalls einen Transport-URI, wenn der Endpunkt eine SOAP-Bindung verwendet.The UdpTransportBindingElement implementation of the ExportEndpoint method also exports a transport URI when the endpoint uses a SOAP binding:

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

WSDL-ImportWSDL Import

Um das WSDL-Importsystem auf die Handhabung des Imports von Adressen zu erweitern, fügen Sie die folgende Konfiguration zur Konfigurationsdatei für Svcutil.exe hinzu (wie in der Datei Svcutil.exe.config gezeigt):To extend the WSDL import system to handle importing the addresses, add the following configuration to the configuration file for Svcutil.exe as shown in the Svcutil.exe.config file:

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

Bei der Ausführung von "Svcutil.exe" gibt es zwei Optionen, um "Svcutil.exe" dazu zu bewegen, die WSDL-Importerweiterungen zu laden:When running Svcutil.exe, there are two options for getting Svcutil.exe to load the WSDL import extensions:

  1. Verweisen Sie Svcutil.exe in die Konfigurationsdatei mithilfe der/svcutilconfig:<Datei >.Point Svcutil.exe to the configuration file using the /SvcutilConfig:<file>.

  2. Fügen Sie den Konfigurationsabschnitt zu Svcutil.exe.config im gleichen Verzeichnis wie Svcutil.exe hinzu.Add the configuration section to Svcutil.exe.config in the same directory as Svcutil.exe.

Der UdpBindingElementImporter-Typ implementiert die System.ServiceModel.Description.IWsdlImportExtension-Schnittstelle.The UdpBindingElementImporter type implements the System.ServiceModel.Description.IWsdlImportExtension interface. Die ImportEndpoint-Methode importiert die Adresse vom WSDL-Anschluss:The ImportEndpoint method imports the address from the WSDL port:

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

Hinzufügen von RichtlinienunterstützungAdding Policy Support

Das benutzerdefinierte Bindungselement kann Richtlinienassertionen in die WSDL-Bindung für einen Dienstendpunkt exportieren, um die Funktionen dieses Bindungselements auszudrücken.The custom binding element can export policy assertions in the WSDL binding for a service endpoint to express the capabilities of that binding element. Der folgende Beispielcode stammt aus dem Transport: UDP Beispiel.The following example code is taken from the Transport: UDP sample.

RichtlinienexportPolicy Export

Die UdpTransportBindingElement Typ implementiert System.ServiceModel.Description.IPolicyExportExtension Unterstützung für das Exportieren der Richtlinie hinzuzufügen.The UdpTransportBindingElement type implements System.ServiceModel.Description.IPolicyExportExtension to add support for exporting policy. Als Ergebnis schließt System.ServiceModel.Description.MetadataExporter UdpTransportBindingElement in die Generierung der Richtlinie für eine Bindung, die dieses enthält, ein.As a result, System.ServiceModel.Description.MetadataExporter includes UdpTransportBindingElement in the generation of policy for any binding that includes it.

Fügen Sie in IPolicyExportExtension.ExportPolicy eine Assertion für UDP und eine weitere Assertion ein, wenn der Kanal sich im Multicastmodus befindet.In IPolicyExportExtension.ExportPolicy, add an assertion for UDP and another assertion if the channel is in multicast mode. Grund hierfür ist, dass der Multicastmodus Einfluss auf die Art und Weise hat, in der der Kommunikationsstapel erstellt wird, weshalb eine Koordinierung zwischen beiden Seiten stattfinden muss.This is because multicast mode affects how the communication stack is constructed, and thus must be coordinated between both sides.

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

Da benutzerdefinierte Transportbindungselemente für die Handhabung der Adressierung verantwortlich sind, muss die System.ServiceModel.Description.IPolicyExportExtension-Implementierung auf dem UdpTransportBindingElement auch den Export der geeigneten WS-Adressierungsrichtlinienassertionen handhaben, um die Version der verwendeten WS-Adressierung anzugeben.Because custom transport binding elements are responsible for handling addressing, the System.ServiceModel.Description.IPolicyExportExtension implementation on the UdpTransportBindingElement must also handle exporting the appropriate WS-Addressing policy assertions to indicate the version of WS-Addressing being used.

AddWSAddressingAssertion(context, encodingBindingElement.MessageVersion.Addressing);  

RichtlinienimportPolicy Import

Um das Richtlinienimportsystem zu erweitern, fügen Sie der Konfigurationsdatei für Svcutil.exe die folgende Konfiguration hinzu (wie in der Datei Svcutil.exe.config gezeigt):To extend the policy import system, add the following configuration to the configuration file for Svcutil.exe as shown in the Svcutil.exe.config file:

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

Dann implementieren Sie System.ServiceModel.Description.IPolicyImportExtension aus der registrierten Klasse (UdpBindingElementImporter).Then we implement System.ServiceModel.Description.IPolicyImportExtension from our registered class (UdpBindingElementImporter). Prüfen Sie in IPolicyImportExtension.ImportPolicy die Assertionen im entsprechenden Namespace, verarbeiten Sie sie für die Generierung des Transports, und prüfen Sie, ob Multicast vorliegt.In IPolicyImportExtension.ImportPolicy, examine the assertions in the appropriate namespace and process the ones for generating the transport and checking if it is multicast. Entfernen Sie darüber hinaus die Assertionen, die das Importprogramm handhabt, aus der Liste der Bindungsassertionen.In addition, remove the assertions that the importer handles from the list of binding assertions. Erneut stehen bei der Ausführung von "Svcutil.exe" zwei Optionen für die Integration zur Verfügung:Again, when running Svcutil.exe, there are two options for integration:

  1. Verweisen Sie Svcutil.exe Konfigurationsdatei mithilfe der/svcutilconfig:<Datei >.Point Svcutil.exe to our configuration file using the /SvcutilConfig:<file>.

  2. Fügen Sie den Konfigurationsabschnitt zu Svcutil.exe.config im gleichen Verzeichnis wie Svcutil.exe hinzu.Add the configuration section to Svcutil.exe.config in the same directory as Svcutil.exe.

Hinzufügen eines benutzerdefinierten StandardbindungsimportprogrammsAdding a Custom Standard Binding Importer

Svcutil.exe und der System.ServiceModel.Description.WsdlImporter-Typ erkennen und importieren vom System bereitgestellte Bindungen standardmäßig.Svcutil.exe and the System.ServiceModel.Description.WsdlImporter type, by default, recognize and import system-provided bindings. Andernfalls wird die Bindung als System.ServiceModel.Channels.CustomBinding-Instanz importiert.Otherwise, the binding gets imported as a System.ServiceModel.Channels.CustomBinding instance. Zur Aktivierung des Imports der WsdlImporter für Svcutil.exe und den SampleProfileUdpBinding, fungiert der UdpBindingElementImporter auch als benutzerdefiniertes Standardbindungsimportprogramm.To enable Svcutil.exe and the WsdlImporter to import the SampleProfileUdpBinding the UdpBindingElementImporter also acts as a custom standard binding importer.

Ein benutzerdefiniertes standardbindungs-Importprogramm implementiert die ImportEndpoint Methode auf die System.ServiceModel.Description.IWsdlImportExtension Schnittstelle zum Untersuchen der System.ServiceModel.Channels.CustomBinding Instanz, die Metadaten, um festzustellen, ob sie von einer spezifischen standardbindung hätte generiert werden kann.A custom standard binding importer implements the ImportEndpoint method on the System.ServiceModel.Description.IWsdlImportExtension interface to examine the System.ServiceModel.Channels.CustomBinding instance imported from metadata to see if it could have been generated by specific standard binding.

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

Allgemein beinhaltet die Implementierung eines benutzerdefinierten Importprogramms für Standardbindungen die Überprüfung der Eigenschaften der importierten Bindungen, um zu bestätigen, dass sich nur Eigenschaften geändert haben, die von der Standardbindung hätten festgelegt werden können, und es sich bei allen anderen Eigenschaften um die Standardwerte handelt.Generally, implementing a custom standard binding importer involves checking the properties of the imported binding elements to verify that only properties that could have been set by the standard binding have changed and all other properties are their defaults. Eine grundlegende Strategie für die Implementierung eines Importprogramms für Standardbindungen ist die Erstellung einer Standardbindung, die Weitergabe der Eigenschaften von den Bindungselementen an die von der Standardbindung unterstützte Standardbindungsinstanz und der Vergleich der Bindungselemente der Standardbindung mit den importierten Bindungselementen.A basic strategy for implementing a standard binding importer is to create an instance of the standard binding, propagate the properties from the binding elements to the standard binding instance that the standard binding supports, and the compare the binding elements from the standard binding with the imported binding elements.