2009-07-22 8 views
14

Je souhaite ajouter une extension de comportement afin que mes classes de service soient instanciées avec Ninject. J'ai créé une classe qui hérite de BehaviorExtensionElement et l'a enregistrée dans mon App.config. Je ne vois rien évident que je suis absent, mais au démarrage cela est jeté:Ajout d'une extension de comportement wcf personnalisée provoque une exception ConfigurationErrors

System.Configuration.ConfigurationErrorsException: An error occurred creating the configuration section handler for system.serviceModel/behaviors: Extension element TestExtension cannot be added to this element. Verify that the extension is registered in the extension collection at system.serviceModel/extensions/behaviorExtensions. 
Parameter name: element (...\MyAssembly.dll.config line 42) ---> 
System.ArgumentException: Extension element TestExtension cannot be added to this element. 
Verify that the extension is registered in the extension collection at system.serviceModel/extensions/behaviorExtensions. 
Parameter name: element 

Voici mon App.config:

<system.serviceModel> 
<extensions> 
    <behaviorExtensions> 
    <add name="TestExtension" type="Mynamespace.DependencyInjectionServiceBehavior,MyAssembly,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null" /> 
    </behaviorExtensions> 
</extensions> 
<behaviors> 
    <serviceBehaviors> 
    <behavior name="MyServiceBehavior"> 
     <TestExtension/> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 

Voici ma classe de comportement:

public class DependencyInjectionServiceBehavior : BehaviorExtensionElement, IServiceBehavior 
{ 
    public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) 
    { 
     foreach (ChannelDispatcherBase cdb in serviceHostBase.ChannelDispatchers) 
     { 
      ChannelDispatcher cd = cdb as ChannelDispatcher; 
      if (cd != null) 
      { 
       foreach (EndpointDispatcher ed in cd.Endpoints) 
       { 
        ed.DispatchRuntime.InstanceProvider = 
         new DependencyInjectionInstanceProvider(serviceDescription.ServiceType); 
       } 
      } 
     } 
    } 

    public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) 
    { 
    } 

    public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, 
     Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters) 
    { 
    } 

    public override Type BehaviorType 
    { 
     get { return this.GetType(); } 
    } 

    protected override object CreateBehavior() 
    { 
     return new DependencyInjectionServiceBehavior(); 
    } 

} 

Répondre

20

Il s'avère que le nom du type doit être exactement équivalent à typeof(DependencyInjectionServiceBehavior).AssemblyQualifiedName. Ma première compréhension était qu'il n'y avait pas d'espaces dans le nom de type complet, ce qui s'est avéré faux.

+0

une solution? – Kiquenet

+0

Exactement ce que je devais savoir pour résoudre mon problème - merci – stuartd

+9

L'utilisation de l'éditeur de configuration de service WCF pour ajouter l'extension de comportement vous permettra de parcourir la DLL et la classe et ajoutera les informations appropriées à votre fichier de configuration comme bien. Juste une autre alternative qui pourrait être un peu plus facile pour certaines personnes! –

Questions connexes