2008-12-10 11 views
15

Me gustaría obtener un objeto de enlace de web.config o app.config.WCF: Cómo obtener un objeto de enlace desde la configuración

Por lo tanto, este código funciona:

wcfTestClient = new TestServiceClient("my_endpoint", Url + "/TestService.svc"); 

pero me gustaría hacer lo siguiente: Método

Binding binding = DoSomething(); 
wcfTestClient = new TestServiceClient(binding, Url + "/TestService.svc"); 

Estoy interesado en HacerAlgo(), por supuesto.

Respuesta

6

Puede crear una instancia de un enlace dando un nombre de configuración vinculante desde App.config/Web.config.

http://msdn.microsoft.com/en-us/library/ms575163.aspx

Inicializa una nueva instancia de la clase wsHttpBinding con un enlace especificado por su nombre de la configuración.

El siguiente ejemplo muestra cómo inicializar una nueva instancia de la clase WSHttpBinding con un argumento de cadena.

// Set the IssuerBinding to a WSHttpBinding loaded from config 
b.Security.Message.IssuerBinding = new WSHttpBinding("Issuer"); 
+7

Solo si sabe qué tipo de enlace va a utilizar, p. WSHttpBinding o NetTcpBiding. Pierdes la flexibilidad para cambiar el tipo de biding en tiempo de ejecución. – Anthony

+4

Pero necesito cualquier enlace, no solo (WSHttpBinding) –

+0

Para enlaces personalizados: var binding = new System.ServiceModel.Channels.CustomBinding ("BindingName"); – Sal

6

Una opción descarada podría ser la creación de una instancia con el constructor por defecto, para utilizar como plantilla:

Binding defaultBinding; 
using(TestServiceClient client = new TestServiceClient()) { 
    defaultBinding = client.Endpoint.Binding; 
} 

luego mete esta distancia y volver a utilizarlo. ¿Alguna ayuda?

+0

Mejor que nada :) Pero me gustaría obtener el objeto vinculante del archivo de configuración, cargarlo por su nombre. – bh213

7

Salida posterior this el blog de Mark Gabarra, muestra cómo enumerar los enlaces configurados

+0

Esto solo explica cómo enumerar los enlaces configurados. Para la cosa completa echa un vistazo a mi respuesta. – daniloquio

7

Si no conoce el tipo de la unión hasta que el tiempo de ejecución, puede utilizar lo siguiente:

return (Binding)Activator.CreateInstance(bindingType, endpointConfigName); 

Dónde bindingType del tipo de la unión y endpointConfigName es el nombre de la especificada en el archivo de configuración.

Todos los enlaces incluidos proporcionan un constructor que toma EndpointConfigurationName como el único parámetro, por lo que debería funcionar para todos ellos. Lo he usado para WsHttpBinding y NetTcpBinding sin problemas.

+0

Esto solo explica cómo inicializar el objeto Enlace a partir de una definición de configuración abstracta. Para saber más, mira mi respuesta :) – daniloquio

4

Esta respuesta cumple con la solicitud de OP y se extrae al 100% de esta increíble publicación de Pablo M. Cibraro.

http://weblogs.asp.net/cibrax/getting-wcf-bindings-and-behaviors-from-any-config-source

Este método le da sección de unión de la configuración.

private BindingsSection GetBindingsSection(string path) 
{ 
    System.Configuration.Configuration config = 
    System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(
    new System.Configuration.ExeConfigurationFileMap() { ExeConfigFilename = path }, 
     System.Configuration.ConfigurationUserLevel.None); 

    var serviceModel = ServiceModelSectionGroup.GetSectionGroup(config); 
    return serviceModel.Bindings; 
} 

Este método le da la Binding objeto real que usted está necesitando desesperadamente.

public Binding ResolveBinding(string name) 
{ 
    BindingsSection section = GetBindingsSection(path); 

    foreach (var bindingCollection in section.BindingCollections) 
    { 
    if (bindingCollection.ConfiguredBindings.Count > 0 
     && bindingCollection.ConfiguredBindings[0].Name == name) 
    { 
     var bindingElement = bindingCollection.ConfiguredBindings[0]; 
     var binding = (Binding)Activator.CreateInstance(bindingCollection.BindingType); 
     binding.Name = bindingElement.Name; 
     bindingElement.ApplyConfiguration(binding); 

     return binding; 
    } 
    } 

    return null; 
} 
Cuestiones relacionadas