在 BizTalk 中,为啥要同时导入和安装 MSI 文件?

Posted

技术标签:

【中文标题】在 BizTalk 中,为啥要同时导入和安装 MSI 文件?【英文标题】:In BizTalk why is an MSI file both imported and installed?在 BizTalk 中,为什么要同时导入和安装 MSI 文件? 【发布时间】:2011-06-21 17:09:14 【问题描述】:

我正在处理一个 BizTalk 项目,不明白为什么需要安装(双击)和导入(使用 biztalk 管理控制台)。

我有一个 BizTalk 项目,我向它的资源添加了绑定并导出了一个 msi 文件。现在我想在另一台服务器上安装应用程序。

据我所知,这是 MSI 安装的作用:

    将文件复制到文件系统 将程序集注册到 GAC 中 将应用程序添加到“添加/删除程序”小程序中

但是,这是我的问题:

    使用 msi 安装不会将应用程序添加到 Biztalk 管理控制台。我们需要导入 msi。 使用 msi 卸载不会从 GAC 中删除程序集。它只删除它复制到文件系统的文件。卸载是否也可以删除 GAC 程序集? 如果我只是导入 MSI,我可以启动我的 biztalk 应用程序,而且它似乎运行良好。结合问题 #1 和 #2,为什么根本需要 MSI?我可以看到仅导入不会将其添加到 GAC,因此如果其他应用程序依赖它,它们将无法工作。

我确定我缺少 msi 提供的功能/配置,但有人可以帮助我理解为什么 msi 需要安装并导入到 biztalk 中,以及为什么当你卸载它时没有完全卸载它安装的所有内容?

【问题讨论】:

【参考方案1】:

部署 BizTalk 解决方案时需要执行两项操作。

为什么部署 BizTalk 解决方案需要两步操作?

    将 BizTalk 解决方案注册到 BizTalk 管理数据库 将 BizTalk Artefacts 和依赖项安装到文件系统

首先,构成您的解决方案的 BizTalk 程序集必须注册到 BizTalk 管理数据库。这将使 BizTalk 知道可用的架构、地图、管道和编排。

这是通过将 Windows 安装程序包导入 BizTalk 来完成的。

请记住,典型的 BizTalk 平台通常由许多物理服务器组成。但是,BizTalk Group 中的所有服务器共享一个 BizTalk 管理数据库。

因此,需要为整个 BizTalk Group 执行一次导入操作

其次,已注册到 BizTalk 的 BizTalk 程序集需要物理存在某处。因此,它们必须安装到文件系统中。

这是通过双击 Windows Installer 包来完成的。

请注意,需要在属于 BizTalk Group 的任何物理服务器上重复安装操作。而且,由于 BizTalk 管理数据库中只有一个关于解决方案的程序集是哪些程序集的定义,这就解释了为什么必须将 BizTalk 程序集安装到全局程序集缓存 (GAC)。

请注意,到目前为止,规则很简单:

BizTalk 程序集必须安装在 BizTalk 组中每台服务器的 GAC 中 BizTalk 程序集必须在 BizTalk 管理数据库中导入(或注册)一次

但是,我们只处理了 BizTalk 程序集。 BizTalk 解决方案在运行时需要的所有其他程序集或其他依赖项(业务规则定义、COM 对象、绑定、配置文件等)不包含在此两步操作中。

跨环境部署

但是,当解决方案运行时,这些依赖项还必须酌情存在于每个 BizTalk 服务器上。

这就是为什么大多数这些人工制品也注册到 BizTalk 管理数据库的原因。但是这一次,这样做只是为了在创建 BizTalk 解决方案的 Windows Installer 程序包时引入依赖项,以便可以在目标服务器上正确安装这些依赖项。

为什么 BizTalk 程序集在卸载时没有从 GAC 中删除?

一般来说,assemblies that are registered to the Global Assembly Cache are considered shared resources。因此,出于安全原因,卸载时不会从 GAC 中删除 BizTalk 程序集。考虑当多个应用程序使用自定义 BizTalk 管道时会发生什么。在这种情况下,BizTalk 管道必须是单独的、通用的 BizTalk 应用程序的一部分。卸载此共享 BizTalk 应用程序会破坏依赖此管道的所有其他应用程序...

adding resources to the BizTalk Management Database 时,您可以选择在 importinstall 时将程序集安装到 GAC。我强烈建议不要使用“GacOnImport”功能,这在大多数典型的多服务器 BizTalk 组中没有意义

但是,对于 Windows Installer 程序包,有一种更简单、最灵活的方法可以自定义可以对 BizTalk 程序集或其他依赖项执行的操作。这是通过Pre Processing and Post Processing Scripts 完成的。

这些脚本允许在导入/安装操作期间在四个特定时间运行任意应用程序。

导入前 导入后 安装前 安装后

如果您希望在卸载时从 GAC 中删除程序集,只需在操作的“安装前”阶段安排适当的命令行即可。

【讨论】:

【参考方案2】:

导入 MSI 文件会将 MSI 中的程序集添加到 BizTalk 数据库中。如您所述,运行 MSI 会将程序集添加到 GAC。两者都是“安装” BizTalk 应用程序的必要条件。只有 BizTalk 程序集必须导入 BizTalk 管理数据库。 BizTalk 使用的所有 DLL 都必须在 GAC 中。

可能值得一看 http://msdn.microsoft.com/en-us/library/aa578463(v=BTS.10).aspx 以了解您可以自定义 BizTalk 应用程序中每个资源的安装和导入行为。这将允许您只导入 MSI 并将程序集添加到数据库中并将它们安装到 GAC 中,这样您就不会在添加/删除程序中产生额外的混乱。

至于为什么当您卸载已安装的 MSI 时 DLL 没有从 GAC 中删除,我可以告诉您这是设计使然。如果您查看 MSDN http://msdn.microsoft.com/en-us/library/aa562001(v=bts.10).aspx 上的此页面,您会看到此行为按预期进行了描述。该 MSDN 文章还包括如何从 GAC 中删除程序集下的链接,该链接解释了如何使用后处理脚本让您的 MSI 在卸载 MSI 时实际从 GAC 中删除您的程序集。

【讨论】:

以上是关于在 BizTalk 中,为啥要同时导入和安装 MSI 文件?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 BizTalk Orchestration 多次从消息框中接收相同的消息

使用现有 wsdl 创建 BizTalk WCF 终结点

为啥 BizTalk Scope 没有捕获此 MissingPropertyException

Biztalk 适配器包安装 - 没有看到 WCF-SQL 适配器

为啥我不能通过 BizTalk SMTP 适配器更改正文部分的附件名称?

CentOS7在建立VPN时为啥要从文件导入?