2009-07-22 3 views
14

Я хочу добавить расширение поведения, чтобы мои классы обслуживания были созданы с помощью Ninject. Я создал класс, который наследует от BehaviorExtensionElement и зарегистрировал его в моем App.config. Я ничего не вижу очевидного мне не хватает, но при запуске этого брошено:Добавление пользовательского расширения поведения wcf вызывает ConfigurationErrorsException

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 

Вот мой 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> 

Вот мое поведение класс:

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

} 

ответ

20

Оказывается, имя типа должно быть в точности эквивалентным typeof(DependencyInjectionServiceBehavior).AssemblyQualifiedName. Мое более раннее понимание заключалось в том, что не было никаких пробелов в имени полностью квалифицированного типа, которое оказалось неправильным.

+0

любое решение ??? – Kiquenet

+0

Точно то, что мне нужно было знать, чтобы исправить мою проблему - спасибо – stuartd

+9

Использование редактора конфигурации службы WCF для добавления расширения поведения позволит вам просматривать DLL и класс внутри и будет добавлять соответствующую информацию в ваш файл конфигурации как Что ж. Еще одна альтернатива, которая может быть немного легче для некоторых людей! – 2011-06-29 12:16:41

Смежные вопросы