2009-08-26 6 views
2

Ich habe eine benutzerdefinierte Bindung erstellt und möchte sie über App.config konfigurierbar machen.Erstellen einer benutzerdefinierten Bindung konfigurierbar über App.config

Die Bindung hat keine speziellen Optionen im Moment, so wäre es ausreichend, nur

<endpoint address="http://myAddress" 
      binding="myBinding" 
      contract="myContract"> 

Nach der Überprüfung einiger Websites zu unterstützen, fand ich heraus, dass ich Konfigurationsunterstützung durch ein <BindingExtension> zu ermöglichen habe. Allerdings ist die MSDN-Website nicht viel helfen, da, wenn ich versuche

<extensions> 
    <bindingExtensions> 
    <add name="myBinding" 
     type="MyNamespace.MyHttpBinding, NameOfMyDll, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/> 
    </bindingExtensions> 
</extensions> 

hinzuzufügen, erhalte ich nur die folgende Fehlermeldung beim Versuch, das Programm zu starten:

Konfiguration Bindungserweiterung ‚System .serviceModel/bindings/myBinding 'konnte nicht gefunden werden. Stellen Sie sicher, dass diese Bindungserweiterung ordnungsgemäß in system.serviceModel/extensions/bindingExtensions registriert ist und dass sie korrekt buchstabiert ist.

Der in der bingExtension erwähnte Typ verweist auf den Typ, der von Binding erbt.

Was muss ich hinzufügen, um die Konfigurationsunterstützung für meine Bindung zu aktivieren?


Update

Mein Ziel ist nur in der Lage zu sein, meine Bindung an die Config-Datei zu exportieren. Ich möchte keine besonderen Einstellungen für die Bindung zulassen. Es sollte nur über den Tag <endpoint> der Konfigurationsdatei verwendbar sein.

I've uploaded a minimal sample project where the bug occurs tomegaupload.

Antwort

3

Sie sind auf dem richtigen Weg. Der entscheidende Punkt ist jedoch, dass das bindingExtension-Element nicht direkt auf Ihre Bindungsklasse verweisen soll.

Stattdessen müssen mehrere Klassen das Konfigurationsmodell unterstützen. Zum Starten ist die bindingExtension, die Sie registrieren, wirklich eine Klasse, die von StandardBindingCollectionElement erbt. Dies stellt eine Auflistung von StandardBindingElement dar. Dies ist die Konfigurationsklasse, die alle Konfigurationseigenschaften aufweist, die Ihre Bindung in der CONFIG-Datei unterstützt, und die für das Erstellen Ihrer Bindungsinstanz und das Festlegen von Eigenschaften in der .config verantwortlich ist Datei.

Beachten Sie außerdem, dass Sie normalerweise ein ähnliches Muster zum Erstellen einer Konfigurationsansicht Ihres TransportBindingElement verwenden (wenn Sie einen Transportkanal verwenden), sodass Sie benutzerdefinierte Bindungen erstellen können, die diese Konfiguration verwenden. In diesem Fall hätten Sie eine Klasse, die TransportElement erbt.

P.S. Wenn Sie denken, dass dies eine Menge Wiederholungscode ist, wenn Sie viele Einstellungen haben, dann stimme ich Ihnen zu.

Update: gefunden, was dein Problem war: Sie müssen mindestens einen leeren < Bindungen/> Abschnitt in Ihrer Konfigurationsdatei. Einfach hinzufügen und die Bindung wird jetzt erkannt.

+0

Im Allgemeinen sollte das, was Sie tun, funktionieren. Haben Sie es ohne WebServiceHost versucht, aber das normale? – tomasr

+0

Ja, habe es auch mit einem ServiceHost versucht. Das Problem besteht weiter. Ich habe bemerkt, dass sich die Fehlermeldung nicht ändert, auch wenn ich das Attribut "type" in der Erweiterung in etwas Unsinn wie "foobar" ändere. Außerdem habe ich versucht, die DLL der Bindung in den globalen Assemblycache hinzuzufügen. Fehlermeldung immer noch gleich :-( – Etan

+0

Klingt, dass Ihre Bindungserweiterung überhaupt nicht geladen wird. Haben Sie versucht, fuslogvw.exe zu verwenden, um zu prüfen, ob die Assembly möglicherweise nicht geladen wird? WCF ist wählerisch, wie der Assemblyname geschrieben wird bei der Registrierung von Konfig-Erweiterungen. – tomasr

Verwandte Themen