2009-07-22 26 views
14

Tôi muốn thêm một phần mở rộng hành vi để các lớp dịch vụ của tôi sẽ được khởi tạo với Ninject. Tôi tạo ra một lớp kế thừa từ BehaviorExtensionElement và đăng ký nó trong App.config của tôi. Tôi không thể nhìn thấy bất cứ điều gì rõ ràng tôi là thiếu, nhưng khi khởi động này được ném:Thêm một phần mở rộng hành vi tùy chỉnh wcf gây ra một 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 

Đây là App.config của tôi:

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

Đây là lớp hành vi của tôi:

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

} 

Trả lời

20

Biến tên loại cần phải chính xác tương đương với typeof(DependencyInjectionServiceBehavior).AssemblyQualifiedName. Sự hiểu biết trước đây của tôi là không có bất kỳ không gian nào trong tên loại đầy đủ, điều này hóa ra là sai.

+0

bất kỳ giải pháp nào ?? – Kiquenet

+0

Chính xác những gì tôi cần biết để khắc phục sự cố của mình - cảm ơn bạn – stuartd

+9

Sử dụng Trình chỉnh sửa cấu hình dịch vụ WCF để thêm tiện ích mở rộng hành vi sẽ cho phép bạn duyệt tệp DLL và lớp bên trong và sẽ thêm thông tin thích hợp vào tệp cấu hình của bạn tốt. Chỉ là một lựa chọn khác có thể dễ dàng hơn đối với một số người! –

Các vấn đề liên quan