BizTalk 表达式形状内的范围是什么?

What's in scope inside a BizTalk Expression shape?

在 BizTalk 表达式形状中,我看到了一个空白的文本编辑器,上面有一些粗糙的 "examples",嘲笑我。 "It's so easy" 他们高呼。尽我所能,我只是没有建立联系。也许我想多了。我是 BizTalk 新手。来自多年繁重的 .NET 和软件工程经验,我的想法似乎没有脑...

有丰富 BizTalk 经验的人能否就这个问题启发我:表达式形状内的范围和可用范围是什么?随后,MessageAssignment 形状也是如此吗?

关于作用域,我的意思是像在实际编程中一样:变量名、命名空间等。

我在 BizTalk 上看到的每个示例都假定您了解这些内容的来源。例如,请参阅此 MSDN 页面:Using Distinguished Fields and Property Fields

它假定我知道 "MyMessage" 的创建、实例化和访问位置。我不知道在哪里初始化它,给什么形状标识符命名等等

我的设计看起来很简单:当错误发生时,捕获它,凭空创建一个ErrorMessage,将字符串值分配给一个可区分的字段"Reason",然后发送到一个发送端口。除了表达正确,我什么都可以。

非常感谢任何专家见解。

您只能在 Construct Message 形状中创建消息,然后 MapAssignment 形状。您不能构造表达式形状的消息。

地图选项

对于异常块中的映射,您可以映射的唯一消息是那些在异常块所在的范围之前创建的消息。因此对于整个 Orchestration 的异常块,我从收到的消息映射在初始激活接收(应该在范围之前)以及错误消息模式中。然后,您可以在地图后的 Construct 形状中进行消息分配。

注意:如果范围涵盖除初始接收以外的所有消息,则此初始接收消息是唯一您可以确定在编排中具有的消息。我只在涉及格式错误的 MIME 消息的边缘案例中遇到过一次,该消息导致 Orchestration 启动但没有此初始消息。

非地图选项

在没有地图的情况下仅使用分配形状创建它

  1. 需要调用外部 class 例如ESB 故障处理 eSBFault = Microsoft.Practices.ESB.ExceptionHandling.ExceptionMgmt.CreateFaultMessage();,其中 eSBFault 定义为消息类型 Microsoft.Practices.ESB.ExceptionHandling.Schemas.Faults.FaultMessage
  2. 从另一个现有消息中分配它,例如xTempDoc= wcfFault.fault; 在此示例中,wcFault 是在捕获异常中设置的异常对象名称,xTempDoc 是类型为 System.Xml.XmlDocument 的变量,然后分配给消息变量。

  3. 手动创建消息,例如下面来自 creating a new message in the Message Assign shape

示例

xmlDocMessage = new System.Xml.XmlDocument();
xmlDocMessage.LoadXml("<Out><ErrorCode>4711</ErrorCode></Out>");

创建消息变量

对于以上所有内容,您需要进入 Orchestration 视图并创建一个消息名称的消息变量,并将其设置为您要构造的消息的消息类型。它需要在您构造它的范围内或封闭范围内。注意:它只会在您定义它的范围或定义它的范围的子范围内可用。

表达式形状的其他限制

有关表达式形状的其他限制,请参阅 Requirements and Limitations for Expressions

@Dijkgraaf 的回答非常好,但从技术上讲,表达式编辑器允许您访问 XLANG/s language。据我所知,您仍然必须按照他的说明声明变量(使用编排工具箱 window)。但是,该语言本身有点类似于 C# 和 .NET,从技术上讲,您可以使用适当的关键字在表达式形状中执行几乎可以在其他形状中执行的任何操作。

例如,可以 construct 像这样的表达式形状的消息(取自此 blog):

construct OutboundMessage {

    XmlDocument.LoadXml(
      @"<?xml version='1.0' standalone='yes' ?>
        <Root id='012345' xmlns='http://schemas.sample.org/BizTalk/2010/input' />
    ");

OutboundMessage = XmlDocument;
}

通常,这是一个坏主意。您通常应该使用常规构造消息形状 - 为什么?因为当您在一年后(或其他人)查看您的编排时,您在何处构建消息将立即显而易见。决策形状也是如此——在某些情况下,决策形状可能有点矫枉过正,但对于未来的开发人员来说,决策逻辑是显而易见的(而不是在表达式中寻找 if 语句)。表达式形状应该:

  1. 永远正确named/labeled。不要让自己试图弄清楚 Expression_2 实际上在做什么,给它起一个有用的名字,比如 "Increment Loop Counter"
  2. 避免冗长的表达。编辑器不是很友好(智能感知非常有限,没有突出显示,没有自动格式化)。我不止一次通过点击 Esc 而不是点击 OK 而丢失了表达式形状中的代码并且没有立即意识到我做了什么。它非常适合 XLANG/s 特定的事情(比如使用 xpath 函数,或访问可区分的字段,或做简单的事情)。如果您要处理更复杂的逻辑,请让您的代码调用编排项目引用的 C# 帮助程序库。