【问题标题】:Adding a custom wcf behavior extension causes a ConfigurationErrorsException添加自定义 wcf 行为扩展会导致 ConfigurationErrorsException
【发布时间】:2026-02-05 13:20:05
【问题描述】:

我想添加一个行为扩展,以便使用 Ninject 实例化我的服务类。我创建了一个继承自 BehaviorExtensionElement 的类并将其注册到我的 App.config 中。我看不到任何明显的遗漏,但在启动时会抛出:

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

}

【问题讨论】:

    标签: .net wcf


    【解决方案1】:

    结果类型名称需要完全等同于typeof(DependencyInjectionServiceBehavior).AssemblyQualifiedName。我之前的理解是,完全限定类型名中不应该有任何空格,结果证明是错误的。

    【讨论】:

    • 使用 WCF 服务配置编辑器添加行为扩展将允许您浏览其中的 DLL 和类,并将适当的信息添加到您的配置文件中。只是另一种选择,对某些人来说可能更容易一些!