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

Error handling 如何在BizTalk管理控制台中显示来自自定义functoid错误的异常消息?,error-handling,biztalk,biztalk-mapper,Error Handling,Biztalk,Biztalk Mapper,我的目标是在自定义functoid中发生错误后,影响BizTalk管理控制台中挂起的实例窗口的“错误信息”选项卡中出现的错误描述。如果可能,我还希望ErrorReport.Description promoted属性在失败消息上显示此错误说明 我已经阅读了有关自定义functoid开发的所有内容,但在其中找不到关于错误处理的更多内容。特别是,每当我的functoid抛出异常时,我会看到样板文件“Exception has thrown at the target of a invocation”

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

我已经阅读了有关自定义functoid开发的所有内容,但在其中找不到关于错误处理的更多内容。特别是,每当我的functoid抛出异常时,我会看到样板文件“Exception has thrown at the target of a invocation”(异常已在调用的目标处抛出)消息,该消息在异常通过反射发生时发生,而不是异常本身上的消息

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


如果我模仿DatabaseLookupFunctoid和DatabaseErrorExtractFunctoid所采用的方法,是否有某种方法可以使映射失败并产生提取的错误,而不是像示例中所示将其映射到目标架构上的字段?

最简单的答案是,您可以这样做

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


因此,您要做的是捕获代码中的错误,将详细信息写入Windows事件日志(确保创建自定义事件源),然后……就是这样。这就是我所做的。我不担心BT Admin中会出现什么内容。strong text

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

System.Diagnostics.EventLog.WriteEntry("EVENT_LOG_SOURCE", "Error message...", System.Diagnostics.EventLogEntryType.Error);
正如Johns-305所提到的,您需要确保您的事件源已注册(例如,
System.Diagnostics.EventLog.CreateEventSource(“event\u LOG\u source”,“Application”)
——但这实际上应该作为安装步骤的一部分,使用脚本或某种脚本来设置环境)。BizTalk中的错误处理确实只是.NET错误处理,但需要记住的一点是,映射实际上是以XSLT的形式执行的,它们执行的上下文对异常和错误的处理方式(尤其是未处理的异常)有重大影响

编排

如果您在一个包含异常处理的业务流程中执行转换,抛出的异常将被处理,甚至可能会落入业务流程中的其他日志记录中——换句话说,从C#function执行
throw
,其工作方式与您认为在C#中其他地方的工作方式相同。但是,我尽量避免这种情况,因为您永远不知道映射是否会在其他地方使用,因为XSLT中的异常处理并不总是按照您的想法进行(见下文)

发送/接收端口


不幸的是,如果您在发送或接收端口上执行映射,并且
在其中抛出一个异常,那么您几乎肯定会在事件日志中得到一条毫无帮助的错误消息,并在组集线器中得到一个挂起的实例。没有简单、直接的方法来“取消”转换-XSLT1.0没有任何指定的方法来完成转换(参见示例)。这样,您就可以将错误字符串输出到输出中的特定节点(和/或
EventLog
),或编写大量完全自定义的XSLT来尝试验证输入,或正确设计模式,并在必要时使用验证组件。例如,如果您有一个节点必须匹配特定的正则表达式,或者该节点不应为空,或者重复次数不应超过X次,确保在模式上设置了这些限制,然后确保在尝试映射之前通过
xmlvalidater
或类似程序;但是,我希望通过在挂起的实例本身上获得正确的错误消息来简化管理。相反,我们必须用时间戳进行眼球关联,以找出哪个错误与哪个实例有关,这是一种痛苦。我还尝试了错误字符串输出节点方法,但这也需要将整个源文档映射到目标,以便在检测到错误时可以对其进行更多处理,这对我们的模式来说似乎不好。如果您需要为路由或消息关联这样做,您可以始终检查您的值,并将一些输出输出到升级的属性,然后基于该属性进行路由。。。但我认为验证还是会更好