在我们的 WF4 工作流服务中,我们尝试尽可能地健壮。我们要做的一件事是在 HandleError 和 ProvideFault ( IErrorhandler ) 中记录错误。文档清楚地指出 HandleError 将是进行日志记录的正确位置,但我看到发生了一些奇怪的事情:
我看到一些仅触发ProvideFault的错误,但从未触发 HandleError,一个示例是:
System.NullReferenceException:对象引用未设置为对象的实例。在 System.ServiceModel.Activities.Dispatcher.DurableInstanceManager.GetInstanceAsyncResult.GetInstance() 在 System.ServiceModel.Activities.Dispatcher.DurableInstanceManager.GetInstanceAsyncResult..ctor
还有一些错误只会触发HandleError,但不会触发 ProvideFault,一个例子是:
System.ServiceModel.CommunicationException:从管道读取错误:管道已结束。(109, 0x6d)。在 System.ServiceModel.Channels.PipeConnection.Read(Byte[] 缓冲区,Int32 偏移量,Int32 大小,TimeSpan 超时) 在 System.ServiceModel.Channels.SessionConnectionReader.Receive(TimeSpan 超时)
最后有触发两者的错误,首先是ProvideFault,然后是HandleError(在后台线程上)
如果可能的话,我也想记录相应的传入消息。我使用OperationContext.Current.RequestContext.RequestMessage.ToString()执行此操作这通常仅适用于 ProvideFault,在 HandleError 中我们不再有 RequestContext
所以我的结论是,要记录所有错误,我必须同时登录这两种方法。但这会导致大量重复的日志条目,因为 3..
我当前的解决方法是“记住”来自 ProvideFault 的最后记录的异常,如果相同的异常进入 HandleError,则忽略它。在我看来不是很干净。
有没有人更好、更可靠的方法来记录WF 服务中可能发生的所有错误?
请不要使用 HandleError 或 ProvideFault 中的 IErrorHandler 在 WCF 中记录异常?因为那没有提供任何帮助。