工作流服务中 HandleError 与 ProvideFault 不一致,如何处理?

Posted

技术标签:

【中文标题】工作流服务中 HandleError 与 ProvideFault 不一致,如何处理?【英文标题】:HandleError vs. ProvideFault inconsistencies in workflow service, how to handle? 【发布时间】:2013-07-05 19:53:35 【问题描述】:

在我们的 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(字节 [] 缓冲区,Int32 偏移量,Int32 大小,TimeSpan 超时) 在 System.ServiceModel.Channels.SessionConnectionReader.Receive(TimeSpan 超时)

    最后还有触发both的错误,首先是ProvideFault,然后是HandleError(在后台线程上)

    如果可能,我也想记录相应的传入消息。我使用 OperationContext.Current.RequestContext.RequestMessage.ToString() 这通常只适用于 ProvideFault,在 HandleError 中我们不再有 RequestContext

所以我的结论是,要记录所有错误,我必须同时登录这两种方法。但这会导致大量重复的日志条目,因为 3..

我当前的解决方法是“记住”来自 ProvideFault 的最后记录的异常,如果相同的异常进入 HandleError,则忽略它。在我看来不是很干净。

有没有更好、更可靠的方法来记录 WF 服务中可能发生的所有错误?

请不要指向Logging exceptions in WCF with IErrorHandler inside HandleError or ProvideFault?,因为这不会提供任何帮助。

【问题讨论】:

【参考方案1】:

我已经看到场景 2 发生在不同的上下文(BizTalk 适配器)中,似乎调用了 HandleError 是因为适配器中发生了异常,但 ProvideFault 不是 之所以调用,是因为没有实际返回的消息 - 错误发生的方式是它阻止适配器实际生成/读取/翻译消息并将其传递到管道。这似乎甚至阻止了生成 fault 消息。从管道读取失败似乎构成了这一点 - 您的服务不知道它是否失败,因为它甚至从未连接过,或者它是否因为远程服务器失败而失败。 TransactionAbortedException 之类的东西也可能导致这种情况,或者(在我的特定情况下)SqlException 可能会导致这种情况。

这应该为案例#1 提供一些线索,我自己没有看到或复制过它:这是由于消息链中某处的异常处理不当造成的。在这种情况下,生成了一条错误消息,但链上更高的东西未能以可以调用HandleError 的方式处理异常。 NullReferenceException 在这里很有意义 - 如果您没有正确处理空检查,那么很难说在这种情况下还会发生什么。

就解决这个问题而言,我可能会尝试登录这两个地方,并提供一些额外的信息来解释日志的来源。这将是故障安全的,即使它确实重复记录。另一方面,如果您有一个生成这些场景中的一个或两个的异常列表,您可能会实现逻辑来检查它是什么类型的异常(或它发生在哪里) - 如果它是一个异常,可能会减少日志记录可能会被其他方法处理。

【讨论】:

以上是关于工作流服务中 HandleError 与 ProvideFault 不一致,如何处理?的主要内容,如果未能解决你的问题,请参考以下文章

使用 HandleError 或 ProvideFault 中的 IErrorHandler 在 WCF 中记录异常?

使用全局日志记录时,MVC [HandleError] HandleErrorAttribute 调用了两次

WCF HandleError System.InvalidOperationException 一个任务只有在它处于完成状态时才能被释放

MVC3 HandleError 不显示错误页面

MVC HandleError 属性在控制器上不起作用

(u盘文件同步软件) goodsync prov9.9.30 官方版