我正在寻找基于预定义 XSD 模式创建新消息实例的最佳解决方案,以便在 Biztalk 业务流程中使用。
额外的投票用于带有清晰有效示例的答案或带有质量参考链接的答案。
当想要在 BizTalk 业务流程中创建消息的新实例时,有几个选项。
我已经描述了我通常最终使用的三个,并在答案的底部添加了一些链接。
如何定义哪个是最好的方法实际上取决于 - XMLDocument 方法在某些方面是最整洁的,除非您的架构发生更改,这可能会在您不知情的情况下中断。Scott Colestock描述了一些减轻这种风险的方法。
BizTalk 映射方法可能是最容易理解的方法,并且在架构更改时不会中断。对于小型架构,这可能是一个不错的选择。
对于所有这些方法,要记住的重要一点是,如果您想使用可区分字段或提升的属性,您将需要创建空元素来填充。XLANG
如果您尝试为缺少的元素赋值(即使这些元素可能是可选的),您将遇到运行时错误
最简单的选择是只使用 BizTalk 映射 - 您甚至不必将任何内容映射到创建的实例中。
要创建空元素,您只需映射一个带有空字符串参数的字符串连接functoid。
如果要创建消息的新实例,只需将一条消息复制到具有相同架构的另一条消息,采用消息分配形状。
为此,您创建一个类型的编排变量,XMLDocument
然后message assignment
使用该LoadXML
方法加载与您的架构匹配的 XML 片段。然后将 分配XMLDocument
给所需的 BizTalk 消息。
varXMLDoc.LoadXml(@"<ns0:SomeXML><AnElementToPopulate></AnElementToPopulate></SomeXML>");
msgYourMessage = varXMLDom;
包含AnElementToPopulate
允许您使用属性提升来分配给它。
我很少会突然想起执行此操作的语法,这是我的博客条目,用于提醒自己语法。
此处的另一个链接详细介绍了一些方法。
你到底在找什么?它只是创建具有固定内容的新消息(如某种模板)吗?还是基于别的东西?您确实需要澄清问题并更具体地获得正确的答案。
如果您指的是仅基于某种硬编码内容(或接近)从头开始创建消息,那么我发现将它们作为嵌入式资源放入辅助 C# 程序集中是一种非常干净的方法。
要创建新消息,您可以简单地创建一个System.Xml.XmlDocument
新消息并将其分配给消息变量。您可以使用它Load
或LoadXml
方法来加载符合架构的所需内容。
本教程可能会有所帮助:
BizTalk Server 2006 教程 - 过程演练 使用 BizTalk Server 2006 R2 和 Windows Communication Foundation 创建具有合同优先设计的服务
查看我的博客文章 -在 BizTalk 中创建消息的乐趣- 了解各种选项之间的基本性能比较。
xsd.exe /classes /namespace:MyNamespace myschemafile.xsd
您可以使用它为给定的模式文件生成 c# 类。结果是一个 .cs 文件,您可以将其包含在您的一个解决方案项目中。
在“消息分配形状”中使用时,您可以实例化这些生成的类之一,为其所有属性填写值,然后最终将消息部分分配给您的实例。Biztalk 将为您自动神奇地序列化实例。尼斯和OO。不需要任何花哨的 xlang 东西。
对于其他一些解决方案,例如使用硬编码的 XML 加载临时 XmlDocument,或者全力以赴并使用其他人建议的 documentSpecification.GetDocSchema().CreateXmlInstance(),我真的没有太多运气。