在开发WCF服务层时捕获和记录错误的最佳方法是什么?为什么?
我可以想到三种方式,
1)手动尝试/捕捉每种方法。
2)将责任留给WCF引擎。
3)使用第三方库,例如企业库策略注入/记录。
答案 0 :(得分:23)
我会实现自定义IErrorHandler并使用log4net
[AttributeUsage (AttributeTargets.Interface)]
public class ErrorPolicyBehaviorAttribute : Attribute, IContractBehavior, IErrorHandler
{
private ILog m_logger;
#region IErrorHandler
public void ProvideFault (Exception error, MessageVersion version, ref Message fault)
{
return;
}
public bool HandleError (Exception error)
{
m_logger.Error (error.Message, error);
return true;
}
#endregion
#region IContractBehavior
public void ApplyDispatchBehavior (ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime)
{
...init logger
......Add this class to a list of dispatchRuntime.ChannelDispatcher.ErrorHandlers...
}
#endregion
}
此类还实现了IContractBehavior,因此您可以在服务合同中将其用作属性。
[ErrorPolicyBehavior]
public interface IYourServiceContract
{ }
log4net非常灵活,因此您可以根据需要记录所需内容。
答案 1 :(得分:10)
可以将WCF配置为跨应用程序的所有组件输出流程里程碑的跟踪,例如操作调用,代码异常,警告和其他重要的处理事件。
以下是启用跟踪的app.config
示例。
<configuration>
<system.diagnostics>
<sources>
<source name="System.ServiceModel" switchValue="Warning" propagateActivity="true" >
<listeners>
<add name="xml"/>
</listeners>
</source>
<source name="myUserTraceSource" switchValue="Warning, ActivityTracing">
<listeners>
<add name="xml"/>
</listeners>
</source>
</sources>
<sharedListeners>
<add name="xml"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData="TraceLog.svclog" />
</sharedListeners>
</system.diagnostics>
</configuration>
您可以从MSDN: Configuring Tracing了解有关WCF跟踪的更多信息。
Microsoft提供Service Trace Viewer Tool来读取.svclog文件。
除了跟踪之外,您可能还需要考虑使用log4net进行应用内日志记录。
答案 2 :(得分:2)
查看log4net可能值得您花些时间。这里有一个很好的教程CodeProject。
答案 3 :(得分:2)
如果您要求记录框架ELMAH也是一个很好的选择。如果您不想在每个方法的try / catch周围乱丢代码,可以尝试使用AOP frameworks,这样您就可以通过使用Attributes标记方法来处理异常
答案 4 :(得分:1)
我会选择数字1.主要是因为减少了3号和2号的开销应该是禁止的。
当然,你仍然想要记录像文件或事件管理器这样的东西。但我个人会使用log4net,因为它比所有entlib的东西都要轻一点。