我创建了一个自定义行为,用于与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 />
元素会使错误消失,但我无法看到它与报告的错误有何关联。
答案 0 :(得分:2)
问题实际上在配置元素的子元素中很深。
其中一个配置属性是枚举,用TypeConverterAttribute
修饰以执行从字符串到枚举的转换:
[ConfigurationProperty("level", IsRequired=false)]
[TypeConverter(typeof(EnumConverter))]
public LogLevel Level
{
get { ... }
set { ... }
}
抛出的异常实际上是指类型EnumConverter
没有无参数构造函数(实际上它需要枚举类型来转换)。
为了解决这个问题,我转而在元素的构造函数中创建ConfigurationProperty
,而不是使用声明性模型。在某些时候,我可能会创建一个EnumConverter<T>
类,以便可以以声明方式使用它。
这让我有一天的挖掘才能最终解决。