自定义行为的配置错误

时间:2010-09-07 15:01:26

标签: .net wcf configuration

我创建了一个自定义行为,用于与WCF服务一起将所有错误记录到应用程序日志中。我为行为做了BehaviorExtensionElement

public ErrorLoggingBehaviorExtensionElement : BehaviorExtensionElement
{
    public ErrorLoggingBehaviorExtensionElement() { }

    /* - Elements removed for brevity - */
}

我正在尝试在我的配置中应用它,如下所示:

<extensions>
  <behaviorExtensions>
    <add name="errorLogging"
         type="ErrorLoggingBehaviorExtensionElement, Logging, Version=1.0.0.0, 
               Culture=neutral, PublicKeyToken=56e8273d901d717f"/>
  </behaviorExtensions>
</extensions>

<services>
  <service name="TestService" behaviorConfiguration="TestServiceBehavior">
    <endpoint address="" 
              binding="wsHttpBinding" 
              contract="Test_Service.ITestService"/>
    <endpoint address="mex" 
              binding="mexHttpBinding" 
              contract="IMetadataExchange"/>
  </service>
</services>

<behaviors>
  <serviceBehaviors>
    <behavior name="TestServiceBehavior">
      <serviceMetadata httpGetEnabled="true"/>
      <errorLogging />
    </behavior>
  </serviceBehaviors>
</behaviors>

注意:行为注册元素上的“type”属性实际上在我的配置文件中的一行上,以克服this known issue。为您的眼睛添加了换行符。

尝试查看服务页面时,会生成以下应用程序错误:

  

为system.serviceModel / behaviors创建配置节处理程序时发生错误:没有为此对象定义无参数构造函数。

删除<errorLogging />元素会使错误消失,但我无法看到它与报告的错误有何关联。

1 个答案:

答案 0 :(得分:2)

问题实际上在配置元素的子元素中很深。

其中一个配置属性是枚举,用TypeConverterAttribute修饰以执行从字符串到枚举的转换:

[ConfigurationProperty("level", IsRequired=false)]
[TypeConverter(typeof(EnumConverter))]
public LogLevel Level
{
    get { ... }
    set { ... }
}

抛出的异常实际上是指类型EnumConverter没有无参数构造函数(实际上它需要枚举类型来转换)。

为了解决这个问题,我转而在元素的构造函数中创建ConfigurationProperty,而不是使用声明性模型。在某些时候,我可能会创建一个EnumConverter<T>类,以便可以以声明方式使用它。

这让我有一天的挖掘才能最终解决。