我遇到了问题。我有一个BizTalk 2010应用程序,它引用了第三方Schema dll。我们的架构师告诉我们不要直接引用它,因为它需要更多的时间来序列化这个巨大的9MB dll,这将导致Biztalk工作更多。
由于此第三部分dll是架构dll,因此在任何其他应用程序部署之前,它将在任何应用程序下部署到MgmtDb。我们的业务流程消息具有从此模式dll引用的消息类型。
我想知道的是,这个外部dll的序列化发生在这个dll已经部署的地方,而Orchestration实例可以针对任何请求消息引用它。
每个创建业务流程实例的消息都会发生序列化。
请分享您的想法。
感谢。
答案 0 :(得分:2)
虽然引用的程序集将被添加到MgmtDB中,但AFAIK只是关于程序集及其中添加的工件的元数据,例如。
use BizTalkMgmtDb
select * from dbo.bts_assembly
... dbo.bts_orchestration
... dbo.bt_DocumentSpec
etc.
他/她可能正在引用从程序集中的模式类创建的消息实例(并存储在消息框中)。但是消息的大小将由其中的数据大小决定,而不是由程序集的大小决定。
由于您似乎需要引用的消息模式,因此没有太多选择,只能在您的新项目中引用它(例如,除非您有第三方程序集的源代码,您可以在其中重构它并将其拆分为几个较小的组件)。需要在您的BizTalk服务器上部署第三方程序集并签名和GAC。
但是,如果此引用的模式程序集还包含其他工件(如编排中使用的自定义类作为变量),则只要编排符合脱水点,这些类也需要为serializable(为避免这种情况,您需要在脱水之前调出变量的范围和/或使用原子范围来防止BizTalk完全脱水,但这通常是一个坏主意,因为它会限制可伸缩性)
答案 1 :(得分:0)
您的架构师对BizTalk何时根据其定义的架构执行文档验证做出了错误的假设。
针对大量架构验证大型文档(例如EDIFACT或OASIS)可能会占用大量资源。因此,BizTalk不会根据其相关模式验证传入的文档,除非您明确要求它在接收管道中执行此操作。默认情况下,大多数Pipeline组件的“ValidateDocument”属性设置为“False”。因此,BizTalk将仅基于命名空间和根节点执行文档识别,这是在流读取文档流的前几百个字节时完成的。
因此,您可以自由地“引用”第三方DLL,唯一的性能损失将在编译和部署时。如果由于某种原因,您需要针对此架构验证文档,则无论如何都需要将其置于管理数据库中。