【问题标题】:What's in scope inside a BizTalk Expression shape?BizTalk 表达式形状内的范围是什么?
【发布时间】:2016-10-23 08:09:23
【问题描述】:

在 BizTalk 表达式形状中,我看到了一个空白文本编辑器,上面有一些粗略的“示例”,嘲笑我。 “这太容易了”他们高呼。尽我所能,我只是没有建立联系。也许我想多了。我是 BizTalk 新手。来自多年丰富的 .NET 和软件工程经验,我的想法似乎没有头脑......

具有丰富 BizTalk 经验的人能否在这个问题上启发我:在表达式形状内的范围和可用范围是什么?以及随后的 MessageAssignment 形状?

通过范围,我的意思是像在实际编程中一样:变量名、命名空间等。

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

假设我知道“MyMessage”是在哪里创建、实例化和访问的。我不知道在哪里初始化它,用什么形状标识符命名,等等。

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

非常感谢任何专家的见解。

【问题讨论】:

    标签: scope biztalk biztalk-orchestrations


    【解决方案1】:

    @Dijkgraaf 的回答非常好,但从技术上讲,表达式编辑器允许您访问XLANG/s language。 AFAIK 您仍然必须按照他的说明声明变量(使用编排工具箱窗口)。但是,该语言本身与 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. 始终正确命名/标记。不要让自己试图弄清楚 Expression_2 实际在做什么,将其命名为“增量循环计数器”之类的有用名称
    2. 避免冗长的表达。编辑器不是很友好(智能感知非常有限,没有高亮,没有自动格式化)。不止一次我通过点击Esc 而不是点击OK 并且没有立即意识到我做了什么而丢失了表达式形状的代码。这对于 XLANG/s 特定的事情非常有用(比如使用xpath 函数,或者访问可区分的字段,或者做一些简单的事情)。如果您要处理更复杂的逻辑,请让您的代码调用编排项目引用的 C# 帮助程序库。

    【讨论】:

    • 在 XLANG 或代码中是否曾引用过形状名称?例如,他们是否需要遵循严格的变量命名模式?还是它们仅用于显示,并且可以像您的示例一样进行描述而不会产生不良影响? “递增循环计数器”
    • 形状名称只是描述性的。
    【解决方案2】:

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

    地图选项

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

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

    非地图选项

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

    1. 需要调用外部类,例如ESB 故障处理eSBFault = Microsoft.Practices.ESB.ExceptionHandling.ExceptionMgmt.CreateFaultMessage(); 其中 eSBFault 定义为消息类型 Microsoft.Practices.ESB.ExceptionHandling.Schemas.Faults.FaultMessage
    2. 从另一个现有消息分配它,例如xTempDoc= wcfFault.fault; 在此示例中,wcFault 是在 Catch Exception 中设置的异常对象名称,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 视图并创建该消息名称的 Message 变量,并将其设置为您要构建的消息的消息类型。它需要在您构建它的范围内或封闭范围内。注意:它仅在您定义它的范围内或定义它的范围的子范围内可用。

    表情形状的其他限制

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

    【讨论】:

    • 感谢您的回答。这确实有助于我解决“凭空创建消息”的子问题,但我仍然需要知道在您的示例中,“xmlDocMessage”是在哪里实例化的。如果我将您的代码粘贴到我的 MessageAssignment 形状中,它会给出以下错误消息:“标识符 'xmlDocMessage' 在 'catch' 中不存在;您是否缺少程序集引用?”
    • 您需要进入编排视图并创建一个具有该名称的消息变量并将其设置为您要构建的消息的消息类型。它需要在您构建它的范围内或封闭范围内。
    • 伟大的编辑!这绝对帮助我把事情拼凑起来。通过您的示例,我现在看到在编排级别或 ___Scope 级别(如果我在该范围内)定义的任何内容都可通过 XLANG 用于 Expression/MessageAssignment 形状。这很有帮助!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    相关资源
    最近更新 更多