如何在BizTalk管理控制台中显示自定义functoid错误的异常消息?

时间:2017-02-25 02:36:11

标签: error-handling biztalk biztalk-mapper

我的目标是在我的自定义functoid中发生错误后,影响暂停实例窗口的“错误信息”选项卡中BizTalk管理控制台中显示的错误说明。如果可能,我还希望ErrorReport.Description promote属性在失败的消息上显示此错误描述。

我已经阅读了有关自定义functoid开发的所有内容,但我找不到有关其中的错误处理的内容。特别是,只要我的functoids抛出异常,我就会看到样板“异常被抛出到调用的目标”消息,只要通过反射发生异常,就会发生消息,而不是异常本身的消息。

我曾希望在BaseFunctoid类框架中找到一些允许我提交错误字符串的东西,以便遍历反射边界。有没有办法从自定义functoid中传递错误信息,以便BizTalk管理控制台显示它?

如果我模仿DatabaseLookupFunctoid和DatabaseErrorExtractFunctoid采用的方法,是否有某些方法可以使用提取的错误使地图失败,而不是将其映射到目标模式中的字段,如其示例所示?

2 个答案:

答案 0 :(得分:1)

最简单的方法是使用自定义C#,在代码中编写类似的内容:

System.Diagnostics.EventLog.WriteEntry("EVENT_LOG_SOURCE", "Error message...", System.Diagnostics.EventLogEntryType.Error);

正如Johns-305所提到的,你需要确保你的事件源已经注册(例如System.Diagnostics.EventLog.CreateEventSource("EVENT_LOG_SOURCE", "Application") - 但这应该作为安装步骤的一部分来完成EventLogInstaller或某种类型的脚本来设置环境)。 BizTalk中的错误处理当然只是.NET错误处理,但有一点要记住,映射实际上是作为XSLT执行的,并且它们执行的上下文可能会对异常和错误的处理方式产生重大影响。处理,特别是未处理的例外。

<强>业务流程

如果您正在业务流程中执行具有异常处理的转换,则会处理抛出的异常,甚至可能属于业务流程中的其他日志记录 - 换句话说,执行throw来自C#函数将以你认为它在C#中的其他地方工作的方式工作。但是,我试图避免这种情况,因为你永远都不知道某个地图是否会在某些时候被用于其他地方,因为XSLT中的异常处理并不总是像你想象的那样工作(见下文)。

发送/接收端口

不幸的是,如果您在发送或接收端口上执行映射并且throw中有异常,那么您几乎肯定会在事件日志和组中心中的暂停实例中收到非常无用的错误消息。简单地“取消”转换没有简单直接的方法 - XSLT 1.0没有任何指定的方法(参见例如Throwing an exception from XSLT)。这使得您可以将错误字符串输出到输出中的特定节点(和/或EventLog),或者编写大量完全自定义的XSLT以尝试验证输入,或正确设计模式,必要时使用验证组件。例如,如果您的节点必须与特定正则表达式匹配,或者永远不应为空,或者永远不应重复超过X次,请确保在架构上设置这些限制,然后确保将其传递给{{在尝试映射之前1}}或类似。

答案 1 :(得分:0)

最简单的答案是,你这样做。

请记住,BizTalk应用程序中的错误处理没有什么特别之处,它只是常规普通的 .Net错误处理

因此,您所做的就是捕获代码中的错误,将详细信息写入Windows事件日志(确保创建自定义事件源)并且......就是这样。这就是我所做的一切。我并不担心BT Admin中出现的内容。强文