2008-12-10 7 views
15

Je voudrais obtenir l'objet Binding de web.config ou app.config.WCF: Comment obtenir l'objet de liaison de la configuration

Ainsi, ce code fonctionne:

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

mais je voudrais faire ce qui suit:

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

Je suis intéressé par la méthode DoSomething(), bien sûr.

Répondre

6

Vous pouvez instancier une liaison donnant un nom de configuration de liaison à partir de App.config/Web.config.

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

Initialise une nouvelle instance de la classe WSHttpBinding avec une liaison spécifiée par son nom de configuration.

L'exemple suivant montre comment initialiser une nouvelle instance de la classe WSHttpBinding avec un argument de chaîne.

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

Seulement si vous savez quel type de liaison vous allez utiliser, par ex. WSHttpBinding ou NetTcpBiding. Vous perdez la flexibilité de changer le type de blocage lors de l'exécution. – Anthony

+4

Mais j'ai besoin de toute liaison, non seulement (WSHttpBinding) –

+0

Pour les liaisons personnalisées: var binding = new System.ServiceModel.Channels.CustomBinding ("BindingName"); – Sal

6

Une option insolente pourrait être de créer une instance avec le constructeur par défaut, à utiliser comme modèle:

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

tuck Puis cette distance et le réutiliser. De l'aide?

+0

Mieux que rien :) Mais je voudrais obtenir l'objet de liaison du fichier de configuration, le charger par son nom. – bh213

7

Découvrez this blog de Mark Gabarra, il montre comment énumérer les liaisons configurées

+0

Ceci explique seulement comment énumérer les liaisons configurées. Pour la chose complète, consultez ma réponse. – daniloquio

7

Si vous ne connaissez pas le type de la liaison jusqu'à l'exécution, vous pouvez utiliser les éléments suivants:

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

Où BindingType du type de la liaison et endpointConfigName est le nom spécifié dans le fichier de configuration.

Toutes les liaisons incluses fournissent un constructeur qui prend le paramètre endpointConfigurationName comme seul paramètre, cela devrait donc fonctionner pour toutes les liaisons. Je l'ai utilisé pour WsHttpBinding et NetTcpBinding sans problèmes.

+0

Ceci explique seulement comment initialiser l'objet Binding à partir d'une définition de configuration abstraite. Pour la chose complète, consultez ma réponse :) – daniloquio

4

Cette réponse répond à la demande OP et est extraite à 100% de ce post étonnant de Pablo M. Cibraro.

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

Cette méthode vous donne la section de liaison de la configuration.

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

Cette méthode vous donne l'objet Binding réel que vous êtes désespérément en ont besoin.

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