BizTalk编排中捕获管道验证异常的技术问询
解决BizTalk编排中捕获管道验证异常的问题
我来给你梳理下怎么搞定这个问题——你现在的核心问题是把补偿处理程序和异常处理程序的用途搞混了,补偿是用来回滚已提交的事务操作,而管道验证失败抛出的是异常,必须靠异常处理程序来捕获。下面是具体的步骤和代码示例:
1. 给原子作用域添加异常处理程序
首先,打开你的原子作用域的异常处理选项卡,点击“添加异常处理程序”。你可以针对具体的异常类型捕获,也可以先加一个通用的System.Exception兜底,然后再细化。
对于XML验证失败的场景,BizTalk会抛出Microsoft.BizTalk.Component.XmlValidationException,这是你需要优先捕获的类型。
2. 在异常处理程序中提取验证错误信息
在异常处理程序里添加一个表达式形状,用C#代码从异常对象中提取具体的验证错误。比如:
// 将捕获到的异常转换为XmlValidationException Microsoft.BizTalk.Component.XmlValidationException validationErr = ex as Microsoft.BizTalk.Component.XmlValidationException; string errorDetails = string.Empty; if (validationErr != null) { // 遍历所有验证错误,拼接成可读的信息 foreach (System.Xml.Schema.ValidationError err in validationErr.ValidationErrors) { errorDetails += $"[{err.LineNumber}:{err.LinePosition}] {err.Message}\n"; } } else { // 如果不是验证异常,捕获通用错误信息 errorDetails = ex.Message; }
3. 将错误信息映射到响应消息
接下来,你可以用两种方式把错误信息传递到响应消息:
- 使用映射形状:创建一个映射,把你刚才拼接的
errorDetails字符串(或者单独的错误字段)映射到响应消息的对应节点。 - 直接在表达式中赋值:如果响应消息结构简单,直接在表达式形状里给响应消息的字段赋值,比如:
// 假设你的响应消息有ErrorInfo和Status两个字段 YourResponseMessage.ErrorInfo = errorDetails; YourResponseMessage.Status = "ValidationFailed";
4. 调整作用域的事务设置(可选)
确保你的原子作用域事务模式设置为Required或者Requires New(默认一般是Required),这样异常处理程序能正确触发,不会让编排直接终止。
关键注意点
- 补偿处理程序不是用来捕获异常的,它的作用是当事务成功提交后,后续操作出问题时回滚之前的操作(比如你在验证前写了数据库,验证失败后用补偿删数据)。
- 如果你的管道里有自定义组件,可能会抛出其他异常类型,所以建议先加一个通用的
System.Exception处理程序,避免遗漏未预见的错误。 - 捕获异常后,一定要确保编排能继续执行到发送响应消息的步骤,不要让异常冒泡到顶层导致编排终止。
内容的提问来源于stack exchange,提问作者NealWalters
相关产品推荐
相关产品推荐

