更新应用程序和项目过程中的已知问题

更新应用程序

删除或删除项目不会将其从所有位置删除

从 BizTalk Server 数据库移除或删除项目,使之不再显示在管理控制台中或由 BTSTask ListApp 命令生成的应用程序的项目列表中。 它不会从 Windows 注册表、全局程序集缓存 (GAC) 、虚拟目录或文件系统(如果存在这些位置)中删除该项目。 如果是只存在于 BizTalk 管理数据库中的发送端口、发送端口组、接收端口和接收位置,此操作将完全删除项目。

更新项目

删除或更改项目的状态可能会导致应用程序无法工作

从一个应用程序向另一个应用程序添加引用,并更改另一个应用程序所依赖的项目的状态,或者删除该项目时,具有依赖项的应用程序将无法正常工作。 有关更改项目状态的详细信息,请参阅 管理 项目 (https://go.microsoft.com/fwlink/?LinkID=154725) 中有关相应项目的部分。

不支持 .NET 策略文件

BizTalk Server不支持使用 .NET 策略文件。 原因在于策略文件可能不会以预期方式工作。 策略文件会将 .NET 重定向至 GAC 中指定的程序集版本,但 BizTalk Server 通常会从缓存或 BizTalk 管理数据库访问程序集和项目数据。 策略文件可能不会执行预期操作,具体情况视项目类型、缓存情况和主机实例是否重新启动而定。

更新程序集

如果主机未停止,对程序集的更改可能不会生效

BizTalk 程序集必须遵循 .NET 版本控制规则。 其主要含义是:根据特定版本的其他 .NET 项目或程序集(包括 BizTalk 项目)生成 BizTalk 项目后,该 BizTalk 项目将继续使用该版本,直到根据更高的版本重新生成该 BizTalk 项目。

如果在没有停止和启动加载类型的 BizTalk 主机实例的情况下,没有更改 BizTalk 项目上的版本号而重新部署了程序集,则在进行与 .NET 版本控制有关的开发过程中会出现一个常见问题。

再次运行该进程时,更改不会生效。 这是由 .NET 程序集加载到内存中的方式造成的。 由于主机已具有程序集的内存中副本,因此当新副本 (GAC) 放入全局程序集缓存时,主机不会重新加载程序集。 例如,部署并运行带有业务流程的版本 1.0.0.0 的程序集,如果对业务流程进行了更改而未更改版本号,则这些更改不会生效。 停止主机实例后将释放该程序集的内存中副本,重新启动该主机实例时,将重新加载该程序集的新副本并获取更改。 如果部署了新版本(例如版本 2.0.0.0),并且已加载,则更改将生效。

更改程序集版本可能会破坏程序集与按版本引用它的项之间的关系

在.NET Framework开发中,通常会在生成时将程序集版本号更新为当前内部版本号。 但在开发 BizTalk 解决方案时,更改程序集版本号会中断程序集与通过其程序集版本号引用 DLL 的依赖项之间的关系。 下表列出了引用BizTalk Server程序集的版本号和更改程序集版本号的效果的项。

实体 更改程序集版本号的影响
绑定文件 更改程序集版本号会导致引用该程序集的所有现有绑定文件失败。 这是因为绑定文件通过包括版本号在内的属性来引用程序集。

可以使用记事本或其他编辑器更新绑定文件中的版本信息。 还可以重新部署解决方案,然后使用 BizTalk Server 管理控制台重新生成绑定文件。 最后,可以使用脚本来进行自动化部署和版本控制。 有关部署的详细信息,请参阅 部署和管理 BizTalk 应用程序 (https://go.microsoft.com/fwlink/?LinkID=154210) 。
BAM 跟踪配置文件定义 (.btt) 文件 更改程序集版本号会导致所有现有 BAM 跟踪配置文件定义文件失败。 BAM 跟踪文件采用二进制文件格式,因此不能进行编辑,而只能重新生成。 如果需要 BAM 跟踪文件,则可能需要执行以下任一操作:

- 避免在生成过程中频繁更新版本号
- 延迟生成 BAM 跟踪配置文件,直到版本号稳定
通过使用 Web Services 发布向导发布的 Web Services 使用 Web 服务发布向导生成 ASP.NET Web 接口时,BizTalk Server程序集的程序集版本将包含在 ASP.NET 源代码中。 程序集版本号在运行时由 ASP.NET 接口用作 Web 服务操作的 bodyTypeAssemblyQualifiedName 属性的一部分。 如果在不更新 bodyTypeAssemblyQualifiedName 属性的情况下更改BizTalk Server程序集的版本号,则后续的 Web 服务操作将被BizTalk Server拒绝。

如果接收位置使用 XmlDefaultPipeline,则订阅依赖于文档类型。 订阅使用嵌入的程序集信息,并会在程序集不存在时失败。 如果使用 PassThruPipeline(公开某一端口并让向导创建接收位置时的默认值),则订阅会忽略此嵌入的程序集信息。