如何部署自定义适配器

完整的适配器安装过程包括以下步骤:

  1. 检查依赖项。 例如,MSMQ 适配器安装程序检查是否存在本地 MSMQ 服务,因为适配器运行时依赖于它。

  2. 设置本地文件系统。 这包括创建安装文件夹以及复制二进制文件和支持文件。 确保正确配置对文件夹和文件访问权限的访问。

  3. 将托管程序集安装到系统全局程序集缓存中。

  4. 为适配器创建注册表项。

    注释

    对于 32 位适配器,BizTalk Server 管理控制台使用注册表中的 HKEY_CLASSES_ROOT 分支来获取自定义适配器配置。 如果在 64 位服务器上安装了 32 位适配器,BizTalk 服务器管理控制台将使用 HKEY_CLASSES_ROOT\Wow6432Node\ 分支来处理适配器配置数据。

  5. 将适配器添加到 BizTalk Server。 这意味着在 BizTalk 管理数据库中涉及适配器的新条目,以及用于体现适配器所标识的属性的属性架构的新条目。 此步骤有时是使用 BizTalk Server 管理控制台手动完成的。

例外

适配器安装程序可能不需要检查部分 BizTalk Server 安装中的依赖项。 例如,在仅管理工具安装中,适配器安装程序不需要检查适配器运行时依赖项,因为不使用适配器运行时。 在仅运行时的 BizTalk Server 安装中也是如此,其中适配器安装程序不需要检查设计时的依赖项。

在多个 BizTalk Server 环境中,上一个列表中的最后一步(将适配器添加到 BizTalk Server)仅在第一个 BizTalk Server 上的适配器安装中发生。 这是因为所有 BizTalk Server 服务实例共享相同的 BizTalk 管理数据库(默认名称 BizTalkMgmtDB)。 如果将适配器添加到同一组中的其他 BizTalk 服务器,则其他步骤会失败。

将适配器程序集安装到全局程序集缓存中

若要支持具有不同适配器安装路径的多个 BizTalk Server 主机环境,必须将适配器程序集安装到系统全局程序集缓存中。

在适配器安装和配置期间,将在 BizTalk 管理数据库的adm_adapter表中(默认名称为 BizTalkMgmtDB)中创建一个新适配器条目。 此条目包含 BizTalk Server 在运行时和设计时使用的所有参考信息。

BizTalk Server 运行时使用 InBoundAssemblyPathOutboundAssemblyPath 字段来找出加载适配器二进制文件的位置。 由于 BizTalk Server 组只有一个 BizTalk 管理数据库,因此该组中的所有 BizTalk 服务器必须共享相同的信息片段。 如果要在组内的不同 BizTalk 服务器上安装适配器,则必须在每个服务器上使用相同的安装路径。 如果本地安装路径与 BizTalk 管理数据库中存储的路径不同,BizTalk Server 无法加载适配器二进制文件。

始终使用强名称对适配器的程序集进行签名,并在适配器安装过程中使用 Gacutil.exe 将适配器程序集放入系统全局程序集缓存中。 请确保将 InBoundAssemblyPathOutboundAssemblyPath 字段保留为 null 或为空。

使用适用于适配器配置的框架

BizTalk Server 提供了一种机制,用于为适配器配置用户界面(UI)生成属性表。 它基于配置属性的 XML 架构定义 (XSD) 定义。 此框架的使用为适配器开发人员带来了重大挑战。 本部分为其中一些问题提供了有效的解决方法。

请考虑为您所有关键属性使用自定义属性编辑器

无法将重要的属性验证放在属性表中的属性之上。 框架尝试使用 XML 架构定义 (XSD) simpleType 限制来定义 UI 的验证规则。 应用最大值和最小值的简单规则,但不支持字符串字段的正则表达式限制。 此外,在应用限制之前,数据将转换为公共语言运行时 (CLR) 类型。 这意味着 UI 的用户有时会收到一个神秘的类型转换错误,而不是超出范围的错误。 总之,验证逻辑非常薄弱。

许多适配器开发人员采用的解决方案是为其属性表上的主属性编写自定义属性编辑器。 如果有许多跨依赖属性(如常所示),则自定义属性编辑器可以将结果合并为单个字段,运行时稍后可以将它们分开。 这是在接口中获取必要的自定义代码(尽管仍通常很简单)的唯一方法。

自定义属性编辑器相对简单易写,可以注释 XSD 中的属性以使用它们。 注释引用了一个程序集,该程序集负责将属性编辑器入口点暴露出来,并通过编程显示一个 CLR 表单。 现在可以编写常规用户界面,并使用 Visual Studio 提供的传统界面生成工具。

以下代码演示如何使用 XSD 添加自定义属性编辑器:

<xs:element name="queueDetails" type="xs:string" minOccurs="0">  
    <xs:annotation>  
        <xs:appinfo>  
           <baf:designer>  
               <baf:displayname _locID="queueName">Queue Definition</baf:displayname>  
               <baf:description _locID="receiveQueueDesc">Details of MQSeries Server, Queue Manager and Queue from where you want to receive messages.</baf:description>  
               <baf:category _locID="mqsCategory">MQSeries</baf:category>  
               <baf:editor assembly="Microsoft.BizTalk Server.Adapter.MQSAdmin.dll">Microsoft.BizTalk Server.Adapter.MQSAdmin.MQSUITypeEditor</baf:editor>  
            </baf:designer>  
        </xs:appinfo>  
    </xs:annotation>  
</xs:element>  
  

引用的代码应如下所示:

public class MQSUITypeEditor : System.Drawing.Design.UITypeEditor  
{  
public override System.Drawing.Design.UITypeEditorEditStyle GetEditStyle  
(System.ComponentModel.ITypeDescriptorContext context)   
{  
return System.Drawing.Design.UITypeEditorEditStyle.Modal;  
}  
public override object EditValue (System.ComponentModel.ITypeDescriptorContext context,  
System.IServiceProvider provider, object value)   
{  
Form qdForm = new QueueDefinitionForm(value);  
IWindowsFormsEditorService service =   
(IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));  
DialogResult dialogResult = service.ShowDialog(qdForm);  
//…  
}  
}  
class QueueDefinitionForm : System.Windows.Forms.Form   
{  
//  traditional UI code goes here!  
}  
  

管理运行时必须能够找到 XSD 中引用的程序集,因此应将其添加到全局程序集缓存。