2016-03-24 13 views
0

我正在测试我的BizTalk 2010业务流程的异常处理。业务流程有一个范围形状,并附有一个捕捉形状。 范围形状的事务类型设置为'NONE',因此我可以使用.NET异常。 catch内部是一个带有消息分配形状的构造消息形状。消息分配形状使用接收形状中的活动消息类型。为什么system.exception在发送消息形状中不可序列化?

当编排运行时,它暂停在发送消息的形状上。错误是:

类型System.Xml.XmlDocument在Assembly System.Xml,版本= 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是来自初始接收形状的活动消息类型。它是一个多部分消息类型绑定到验证的模式。

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

我读过很多关于如何设置范围的属性和捕捉形状以便能够使用异常对象的帖子,但它仍然不起作用。
我做了一个假设,因为我可以从XML文件运行时序列化错误消息,我的问题是如何我的编排得到异常。

+0

你确定它是一个香草异常吗? –

+0

@SOreadytohelp,谢谢。不确定你的意思是“香草”。如果我对传入消息进行的唯一更改是将注释文本置于数据库列的最大值以下,则编排会运行至完成状态,并将其消息发送到外部系统,因此我非常确定何时以及如何执行异常正在被抛出。 – ktri

+0

您只需要在hander本身中定义Exception对象ex,而不是在Scope级别。但是,序列化警告不是关于异常(标题)它是关于XmlDocument这是很好理解。你能澄清吗? –

回答

0

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

e。摹

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是先前在编排

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

注2设置一个变量:您msgFail是eSBFault在这个例子中,但你可以把它叫做msgFail为好。它是消息类型Microsoft.Practices.ESB.ExceptionHandling.Schemas.Faults.FaultMessage