namespace endpointaddress configuracion .net wcf configuration app-config

.net - endpointaddress - Configuración de WCF-Dividirlo de app.config



wcf http binding configuration (8)

Tengo un requisito específico para eliminar toda la configuración WCF del cliente (<system.serviceModel>) fuera del archivo principal app.config, y en un archivo XML separado. El comportamiento que me gustaría ver es similar al disponible en la sección de configuración de la aplicación usando la directiva File = "". De hecho, me gustaría poder especificar un archivo separado para cada servicio consumido ...

Sé que puedo construir una fábrica personalizada de ChannelBuilder que lea los datos de configuración de un archivo XML (o una serie de ellos), pero preferiría que el cliente siga teniendo los datos de configuración "autodescubiertos".

Algunas búsquedas básicas de Google parecen sugerir que esto no es posible, pero quería obtener la opinión de SO: ¿alguien aquí sabe algo que no he podido encontrar? :)

Editar ::

Tim Scott y davogones presentaron una posible sugerencia, pero una que se basa en dividir las secciones componentes de la sección system.serviceModel en archivos separados. Aunque esto no es exactamente lo que estoy buscando (me gustaría definir cada servicio y sus elementos asociados discretamente, un archivo por servicio), es una opción. Investigaré y te dejaré saber lo que pienso.


Puedes hacer así:

<system.serviceModel configSource="wcf.config"/>

Simplemente corte la sección de su modelo de servicio y póngala en un archivo separado. Deberá poner toda la sección en el archivo de configuración separado; utilizando este método no puede tener una sección de múltiples archivos AFAIK.


Tengo una aplicación en el trabajo que funciona algo así como lo que estás hablando aquí. Tenemos múltiples servicios WCF en múltiples proyectos y toda su información de configuración reside en un solo archivo de configuración.

La solución que mi empresa eligió fue leer la configuración del servicio fuera del archivo de configuración y luego establecer programáticamente los enlaces, el comportamiento, etc. en función de los valores leídos. Los valores en el archivo de configuración no se ajustan a las cosas de configuración que generalmente se ven en los servicios de WCF: fue diseñado para ser utilizado fácilmente por una clase auxiliar para hacer toda la configuración en tiempo de ejecución.

Dicho todo esto, no soy un gran fanático de hacer eso en absoluto: demasiado acoplamiento y es bastante desordenado.

Sin embargo, muestra que es posible; una cosa es pensar en tu diseño.


Tengo una tendencia a programar programáticamente todas las configuraciones de mi servicio.

Mis clientes no son realmente del tipo que entiende XML y me han pedido que haga que los archivos de configuración se parezcan más al antiguo estilo INI.

Esto es fácil de hacer (leyendo el código de archivo INI no incluido):

// create the URI which is used as the service endpoint Uri tcpBaseAddress = new Uri( string.Format("net.tcp://{0}:{1}", LocalIPAddress.ToString(), GeneralPortNumber)); // create the net.tcp binding for the service endpoint NetTcpBinding ntcBinding = new NetTcpBinding(); ntcBinding.Security.Mode = SecurityMode.None; System.ServiceModel.Channels.Binding tcpBinding = ntcBinding; // create the service host and add the endpoint Host = new ServiceHost(typeof(WordWarService), tcpBaseAddress);

Dado que podemos configurar el servidor (y el cliente, para el caso) programáticamente, no hay nada que le impida proporcionar la configuración de la forma que elija (base de datos, xml, archivo de texto loco, etc.).



Encontré este artículo que podría ayudarte. No lo he intentado, pero parece bastante sencillo.

http://weblogs.asp.net/cibrax/archive/2007/07/24/configsource-attribute-on-system-servicemodel-section.aspx

"El atributo configSource se introdujo por primera vez en .NET Framework 2.0 para admitir archivos de configuración externos. Este atributo se puede agregar a cualquier sección de configuración para especificar un archivo externo para esa sección.

Desafortunadamente, el grupo de sección system.serviceModel no admite este atributo. Si intenta agregarlo, recibirá la siguiente excepción:

El atributo ''configSource'' no se puede especificar porque su nombre comienza con el prefijo reservado ''config'' o ''lock''

Lo que descubrí es que puedes usar este atributo en las diferentes secciones en system.serviceModel, como servicios, comportamientos o enlaces. "


System.ServiceModel.Configuration.ConfigurationChannelFactory et al admite la lectura de la configuración desde una instancia System.Configuration.Configuration . Lo que significa que puede poner el <system.servicemodel ... material en un archivo dedicado sin hacer referencia a él desde web / app.config. Podrías tener múltiples archivos de configuración, uno para cada cliente.

SharePoint 2010 usa eso excesivamente en su modelo de aplicación de servicio, donde cada proxy de servicio lee su configuración desde un .config dedicado que no es necesariamente web.config o app.config y ni siquiera se hace referencia desde allí.


He estado esperando hacer lo mismo, básicamente incluso un paso más: poner mi configuración WCF en una tabla de base de datos (ya que puedo cambiar eso) no puedo acceder al sistema de archivos en mi proveedor alojado para cambiar los archivos de configuración :-() .

Desafortunadamente, esto parece menos que simple ...

Básicamente, se reduce a tener que escribir su propio descendiente "ServiceHost" personalizado que puede manejar la configuración según sea necesario.

Aquí hay un ejemplo de cómo cargar la configuración de WCF desde una ubicación de configuración personalizada .

Esto podría ayudarte a ir? Todavía espero poder resolver el problema "cargando mi configuración desde una tabla de base de datos" algún día ... solo necesito una semana tranquila en el trabajo, supongo :-)


using System; using System.Configuration; using System.IO; using System.ServiceModel; using System.ServiceModel.Configuration; namespace ConsoleHost { public class CustomServiceHost : ServiceHost { public CustomServiceHost(string customConfigPath, Type serviceType, params Uri[] baseAddresses) { CustomConfigPath = customConfigPath; var collection = new UriSchemeKeyedCollection(baseAddresses); InitializeDescription(serviceType, collection); } public string CustomConfigPath { get; private set; } protected override void ApplyConfiguration() { if (string.IsNullOrEmpty(CustomConfigPath) || !File.Exists(CustomConfigPath)) { base.ApplyConfiguration(); } else { LoadConfigFromCustomLocation(CustomConfigPath); } } void LoadConfigFromCustomLocation(string configFilename) { var filemap = new ExeConfigurationFileMap { ExeConfigFilename = configFilename }; Configuration config = ConfigurationManager. OpenMappedExeConfiguration(filemap, ConfigurationUserLevel.None); var serviceModel = ServiceModelSectionGroup.GetSectionGroup(config); bool loaded = false; foreach (ServiceElement se in serviceModel.Services.Services) { if (se.Name == Description.ConfigurationName) { LoadConfigurationSection(se); loaded = true; break; } } if (!loaded) throw new ArgumentException("ServiceElement doesn''t exist"); } } }

Después de esta clase simplemente utilícela como lo haría normalmente para inicializar el host del servicio

myServiceHost = new CustomServiceHost (ConfigFileName, typeof (QueryTree));

myServiceHost.Open ();