Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este tema se describe cómo habilitar la configuración y el soporte de metadatos para vínculos y elementos de vínculo.
Información general sobre la configuración y los metadatos
En este tema se describen las siguientes tareas, que son elementos opcionales 1, 2 y 4 en la lista de tareas Canales de desarrollo .
Habilitación de la compatibilidad con archivos de configuración para un elemento de enlace.
Habilitar la compatibilidad con archivos de configuración para una vinculación.
Exportación de WSDL y aserciones de directivas para un elemento de enlace.
Identificación de WSDL y aserciones de directivas para insertar y configurar su enlace o elemento de enlace.
Para obtener información sobre cómo crear enlaces definidos por el usuario y elementos de enlace, vea Crear User-Defined Enlaces y Crear un BindingElement, respectivamente.
Agregación de la compatibilidad de configuración
Para habilitar la compatibilidad con archivos de configuración para un canal, debe implementar dos secciones de configuración: System.ServiceModel.Configuration.BindingElementExtensionElement, que habilita la compatibilidad de configuración con elementos de enlace, y System.ServiceModel.Configuration.StandardBindingElement y System.ServiceModel.Configuration.StandardBindingCollectionElement<TStandardBinding,TBindingConfiguration>, que habilitan la compatibilidad de configuración con enlaces.
Una manera más fácil de hacerlo es usar la herramienta de ejemplo ConfigurationCodeGenerator para generar código de configuración para los enlaces y los elementos de enlace.
Extender BindingElementExtensionElement
El código de ejemplo siguiente se toma del ejemplo Transport: UDP . El elemento UdpTransportElement
es una clase BindingElementExtensionElement que expone UdpTransportBindingElement
en el sistema de configuración. Con algunas sobrescrituras básicas, el ejemplo define el nombre de la sección de configuración, el tipo del elemento de enlace y cómo crear el elemento de enlace. A continuación, los usuarios pueden registrar la sección de extensión en un archivo de configuración como se indica a continuación.
<configuration>
<system.serviceModel>
<extensions>
<bindingElementExtensions>
<add name="udpTransport" type="Microsoft.ServiceModel.Samples.UdpTransportElement, UdpTransport" />
</bindingElementExtensions>
</extensions>
</system.serviceModel>
</configuration>
Se puede hacer referencia a la extensión desde enlaces personalizados para usar UDP como transporte.
<configuration>
<system.serviceModel>
<bindings>
<customBinding>
<binding configurationName="UdpCustomBinding">
<udpTransport/>
</binding>
</customBinding>
</bindings>
</system.serviceModel>
</configuration>
Agregación de la configuración para un enlace
La sección SampleProfileUdpBindingCollectionElement
es un StandardBindingCollectionElement<TStandardBinding,TBindingConfiguration> que expone SampleProfileUdpBinding
al sistema de configuración. La mayor parte de la implementación se delega en el SampleProfileUdpBindingConfigurationElement
, que deriva de StandardBindingElement. SampleProfileUdpBindingConfigurationElement
tiene propiedades que corresponden a las propiedades de SampleProfileUdpBinding
, y funciones para mapear desde el enlace de ConfigurationElement
. Por último, el método OnApplyConfiguration
se sobrescribe en SampleProfileUdpBinding
, como se muestra en el siguiente código de ejemplo.
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;
}
Para registrar este controlador con el sistema de configuración, agregue la siguiente sección al archivo de configuración correspondiente.
<configuration>
<configSections>
<sectionGroup name="system.serviceModel">
<sectionGroup name="bindings">
<section name="sampleProfileUdpBinding" type="Microsoft.ServiceModel.Samples.SampleProfileUdpBindingCollectionElement, UdpTransport" />
</sectionGroup>
</sectionGroup>
</configSections>
</configuration>
A continuación, se puede hacer referencia a ella desde la <sección de configuración 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>
Adición de compatibilidad con metadatos para un elemento de enlace
Para integrar un canal en el sistema de metadatos, debe admitir tanto la importación como la exportación de la directiva. Esto permite que herramientas como ServiceModel Metadata Utility Tool (Svcutil.exe) generen clientes del elemento de enlace.
Adición de compatibilidad con WSDL
El elemento de transporte de una vinculación es responsable de exportar e importar información de direccionamiento en los metadatos. Al usar un enlace SOAP, el elemento de enlace de transporte también debe exportar un URI de transporte correcto en los metadatos. El código de ejemplo siguiente se toma del ejemplo Transport: UDP .
Exportación de WSDL
Para exportar la información de direccionamiento, la UdpTransportBindingElement
implementa la interfaz System.ServiceModel.Description.IWsdlExportExtension. El IWsdlExportExtension.ExportEndpoint método agrega la información de direccionamiento correcta al puerto WSDL.
if (context.WsdlPort != null)
{
AddAddressToWsdlPort(context.WsdlPort, context.Endpoint.Address, encodingBindingElement.MessageVersion.Addressing);
}
La UdpTransportBindingElement
implementación del ExportEndpoint método también exporta un URI de transporte cuando el punto de conexión usa un enlace SOAP:
WsdlNS.SoapBinding soapBinding = GetSoapBinding(context, exporter);
if (soapBinding != null)
{
soapBinding.Transport = UdpPolicyStrings.UdpNamespace;
}
Importación de WSDL
Para ampliar el sistema de importación de WSDL para controlar la importación de las direcciones, agregue la siguiente configuración al archivo de configuración para Svcutil.exe tal como se muestra en el archivo Svcutil.exe.config:
<configuration>
<system.serviceModel>
<client>
<metadata>
<wsdlImporters>
<extension type=" Microsoft.ServiceModel.Samples.UdpBindingElementImporter, UdpTransport" />
</wsdlImporters>
</metadata>
</client>
</system.serviceModel>
</configuration>
Al ejecutar Svcutil.exe, hay dos opciones para que Svcutil.exe cargue las extensiones de importación de WSDL.
Para señalar el archivo de configuración para su uso con Svcutil.exe, use el archivo /SvcutilConfig:<archivo>.
Agregue la sección de configuración a Svcutil.exe.config en el mismo directorio que Svcutil.exe.
El UdpBindingElementImporter
tipo implementa la System.ServiceModel.Description.IWsdlImportExtension interfaz . El ImportEndpoint
método importa la dirección desde el puerto WSDL:
BindingElementCollection bindingElements = context.Endpoint.Binding.CreateBindingElements();
TransportBindingElement transportBindingElement = bindingElements.Find<TransportBindingElement>();
if (transportBindingElement is UdpTransportBindingElement)
{
ImportAddress(context);
}
Adición de soporte para políticas
El elemento de enlace personalizado puede exportar aserciones de directiva en el enlace de WSDL para que un extremo de servicio exprese las funciones de ese elemento de enlace. El código de ejemplo siguiente se toma del ejemplo Transport: UDP .
Exportación de políticas
El UdpTransportBindingElement
tipo implementa System.ServiceModel.Description.IPolicyExportExtension para agregar compatibilidad con la directiva de exportación. Como resultado, System.ServiceModel.Description.MetadataExporter incluye UdpTransportBindingElement
en la generación de directiva para cualquier enlace que la incluya.
En IPolicyExportExtension.ExportPolicy, agregue una aserción para UDP y otra aserción si el canal está en modo de multidifusión. Esto se debe a que el modo de multidifusión afecta a cómo se construye la pila de comunicaciones, y, por tanto, debe coordinarse entre ambos lados.
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));
}
Dado que los elementos de enlace de transporte personalizados son responsables de la administración del direccionamiento, la implementación System.ServiceModel.Description.IPolicyExportExtension en el UdpTransportBindingElement
también debe administrar la exportación de las aserciones de directivas WS-Addressing adecuadas para indicar la versión de WS-Addressing que se está utilizando.
AddWSAddressingAssertion(context, encodingBindingElement.MessageVersion.Addressing);
Importación de directivas
Para ampliar el sistema de importación de directivas, agregue la siguiente configuración al archivo de configuración para Svcutil.exe como se muestra en el archivo Svcutil.exe.config:
<configuration>
<system.serviceModel>
<client>
<metadata>
<policyImporters>
<extension type=" Microsoft.ServiceModel.Samples.UdpBindingElementImporter, UdpTransport" />
</policyImporters>
</metadata>
</client>
</system.serviceModel>
</configuration>
A continuación, implementamos System.ServiceModel.Description.IPolicyImportExtension desde nuestra clase registrada (UdpBindingElementImporter
). En IPolicyImportExtension.ImportPolicy, examine las aserciones en el espacio de nombres adecuado y procese las que se encargan de la generación del transporte y de la comprobación de si es multidifusión. Además, elimine de la lista de aserciones vinculantes las aserciones que maneja el importador. De nuevo, al ejecutar Svcutil.exe, hay dos opciones para la integración:
Para señalar el archivo de configuración para su uso con Svcutil.exe, use el archivo /SvcutilConfig:<archivo>.
Agregue la sección de configuración a Svcutil.exe.config en el mismo directorio que Svcutil.exe.
Agregación de un importador de enlace estándar personalizado
Svcutil.exe y el tipo System.ServiceModel.Description.WsdlImporter, de forma predeterminada, reconocen e importan enlaces proporcionados por el sistema. De lo contrario, el enlace se importa como una instancia System.ServiceModel.Channels.CustomBinding. Para permitir que Svcutil.exe y WsdlImporter importen el SampleProfileUdpBinding
, el UdpBindingElementImporter
actúa también como un importador de enlaces estándar personalizado.
Un importador de enlaces estándar personalizado implementa el ImportEndpoint
método en la System.ServiceModel.Description.IWsdlImportExtension interfaz para examinar la System.ServiceModel.Channels.CustomBinding instancia importada de metadatos para ver si podría haber sido generada por un enlace estándar específico.
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;
}
}
}
Por lo general, la implementación de un importador de enlaces estándar personalizado implica comprobar las propiedades de los elementos de enlace importados para comprobar que solo las propiedades que el enlace estándar podría haber establecido han cambiado y todas las demás propiedades son sus valores predeterminados. Una estrategia básica para implementar un importador de enlaces estándar es crear una instancia del enlace estándar, propagar las propiedades de los elementos de enlace a la instancia de enlace estándar que admite el enlace estándar y comparar los elementos de enlace del enlace estándar con los elementos de enlace importados.