更新应用程序和项目过程中的已知问题
更新应用程序
删除或删除项目不会将其从所有位置删除
从 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(公开某一端口并让向导创建接收位置时的默认值),则订阅会忽略此嵌入的程序集信息。 |