2008-12-10 7 views
15

Ich möchte Binding-Objekt von web.config oder app.config bekommen.WCF: Wie bekomme ich Binding-Objekt von der Konfiguration

Also, dieser Code funktioniert:

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

aber ich möchte folgendes tun:

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

Ich interessiere mich für DoSomething() -Methode, natürlich.

Antwort

6

Sie können eine Bindung instanziieren, indem Sie einen verbindlichen Konfigurationsnamen aus App.config/Web.config eingeben.

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

Initialisiert eine neue Instanz der Klasse WSHttpBinding mit einem durch seine Konfigurationsnamen angegebenen Bindung.

Das folgende Beispiel zeigt, wie eine neue Instanz der WSHttpBinding-Klasse mit einem Zeichenfolgenargument initialisiert wird.

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

Nur wenn Sie wissen, welche Art von Bindung Sie verwenden werden, z. WSHttpBinding oder NetTcpBiding. Sie verlieren die Flexibilität, die Art des Bidings zur Laufzeit zu ändern. – Anthony

+4

Aber ich brauche eine Bindung, nicht nur (WSHttpBinding) –

+0

Für benutzerdefinierte Bindungen: var Bindung = neue System.ServiceModel.Channels.CustomBinding ("BindingName"); – Sal

6

Eine freche Option könnte sein, eine Instanz mit dem Standard-Konstruktor zu erstellen, die als Vorlage zu verwenden:

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

Dann ist dieses Verstauen und wieder verwenden. Irgendeine Hilfe?

+0

Besser als nichts :) Aber ich möchte Bindungsobjekt aus der Konfigurationsdatei bekommen, laden Sie es mit Namen. – bh213

7

Check out this Blog-Post von Mark Gabarra, zeigt es, wie die konfigurierten Bindungen

+0

Dies erklärt nur, wie die konfigurierten Bindungen aufgelistet werden. Für das vollständige Ding überprüfen Sie meine Antwort. – daniloquio

7

aufzuzählen Wenn Sie die Art der Bindung bis zur Laufzeit nicht kennen, können Sie die folgende verwenden:

Dabei ist bindingType vom Typ der Bindung und endpointConfigName der Name der in der Konfigurationsdatei angegeben ist.

Alle enthaltenen Bindungen stellen einen Konstruktor zur Verfügung, der endpointConfigurationName als einzigen Parameter verwendet, so dass dies für alle von ihnen funktionieren sollte. Ich habe es für WsHttpBinding und NetTcpBinding ohne Probleme verwendet.

+0

Dies erklärt nur, wie das Binding-Objekt ausgehend von einer abstrakten Konfigurationsdefinition initialisiert wird. Für die komplette Sache schau dir meine Antwort an :) – daniloquio

4

Diese Antwort erfüllt die OP-Anfrage und wird zu 100% aus dieser erstaunlichen Nachricht von Pablo M. Cibraro extrahiert.

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

Diese Methode gibt Ihnen die Bindungsabschnitt config.

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

Diese Methode gibt Ihnen das tatsächliche Binding Objekt, das Sie so dringend benötigen.

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