【问题标题】:Why is system.exception not serializable in send message shape?为什么 system.exception 在发送消息形状中不可序列化?
【发布时间】:2016-07-11 13:24:45
【问题描述】:

我正在测试我的 BizTalk 2010 业务流程的异常处理。编排具有一种范围形状,并附有一种捕获形状。 范围形状的事务类型设置为“无”,因此我可以处理 .NET 异常。在 catch 内部是一个带有消息分配形状的构造消息形状。消息分配形状使用接收形状中的活动消息类型。

当编排运行时,它会挂起发送消息形状。错误是:

在程序集 System.Xml 中键入 System.Xml.XmlDocument,Version=4.0.0.0,Culture=neutral,PublicKeyToken=xxx 未标记为可序列化。

我的项目设置为,出于测试目的,我可以处理传入的 BizTalk 消息或 XML 文件(通过测试编辑器。) 我可以将提交到接收形状的 XML 保存为 XML 文件并处理 XML 文件。

为了测试我故意的异常处理 编写了一个将失败的数据库插入。完整的数据库错误被写入日志文件,并抛出一个新的异常,并显示如下消息: 未能处理 BLAH 请求以完成 - 消息处理器 - 图像 ID:ABC 注释 ID:XYZ。 运行 XML 文件时,应用程序抛出错误 在预期的位置,错误在测试编辑器中被捕获。我能够在测试编辑器功能中序列化错误消息。

但是,当从 BizTalk 运行时,我得到了错误。已使用以下属性定义了相关集: BTS.ReceivePortName,ErrorReport.ErrorType,ErrorReport.InboundTransportLocation。
分配形状中的代码如下。

msgFail = InputMsg;
msgFail(ErrorReport.ErrorType) = "FailedMessage";
msgFail(ErrorReport.Description) = ex.Message;
msgFail(ErrorReport.FailureCategory) = 0;
msgFail(ErrorReport.FailureCode) = "";
msgFail(ErrorReport.InboundTransportLocation) = InputMsg(BTS.InboundTransportLocation);
msgFail(ErrorReport.RoutingFailureReportID) = System.Convert.ToString(System.Guid.NewGuid());

msgFail 是我要发送的消息。

InputMsg 是来自初始接收形状的活动消息类型。它是一种多部分消息类型,与验证模式相关联。

ex 是 catch 形状中的 exception object 名称。它是 System.Exception 类型。

我已经阅读了很多关于如何设置范围属性和捕获形状以便能够使用异常对象的帖子,但它仍然无法正常工作。
我假设,因为我可以在从 XML 文件运行时序列化错误消息,所以我的问题在于我的编排如何获取异常。

【问题讨论】:

  • 你确定这是一个普通的例外吗?
  • @SOreadytohelp,谢谢。不知道你所说的“香草”是什么意思。如果我对传入消息所做的唯一更改是将注释文本置于数据库列的最大值下,则编排运行完成并将其消息发送到外部系统,所以我很确定何时以及如何异常正在被抛出。
  • 您只需要在处理程序本身中定义异常对象,例如,而不是在范围级别。但是,序列化警告不是关于异常(标题),而是关于很好理解的 XmlDocument。你能澄清一下吗?
  • @Johns-305,谢谢。不知道你想澄清什么。是的,ex 在 Catch Exception 形状中定义 - Exception Object Name = ex。异常对象类型 = System.SystemException。我不知道它指的是什么 xmlDocument 。是从接收形状传入的消息吗?
  • 它将是任何不在原子范围/编排中的 XmlDocument。在标题中,您问的是 System.Exception 不可序列化,但这就是帖子要问的内容。

标签: c# serialization exception-handling biztalk biztalk-2010


【解决方案1】:

如果您安装了 ESB 工具包,则可以使用它来创建错误消息。

例如

eSBFault = Microsoft.Practices.ESB.ExceptionHandling.ExceptionMgmt.CreateFaultMessage();
eSBFault.FailureCategory= "General System Exception";
eSBFault.FaultCode = "500";
eSBFault.FaultDescription = orchestrationName + ": " + ex.Message;
eSBFault.FaultSeverity = Microsoft.Practices.ESB.ExceptionHandling.FaultSeverity.Error;
eSBFault.Scope = "Scope Name";   
Microsoft.Practices.ESB.ExceptionHandling.ExceptionMgmt.AddMessage(eSBFault, InputMsg);

注意 1:orchestrationName 是早先在 Orchestration 中设置的变量

orchestrationName = Microsoft.XLANGs.Core.Service.RootService.Name;

注意 2:在此示例中,您的 msgFail 为 eSBFault,但您也可以将其称为 msgFail。它是消息类型 Microsoft.Practices.ESB.ExceptionHandling.Schemas.Faults.FaultMessage

【讨论】:

    猜你喜欢
    • 2015-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 2020-12-28
    相关资源
    最近更新 更多