创建自定义解析程序

Microsoft BizTalk ESB 工具包中的冲突解决程序和适配器提供程序框架实现使用名为 Dispatcher 的管道组件,以及名为 ItineraryReceive 和 ItinerarySend 的管道。

调度程序管道组件有四个属性: Validate、Enabled、EndPointMapNameEndPoint 属性可以包含具有如下值的解析程序连接字符串,其中 UDDI:\\ 表示要使用的解析类型 (根名字对象) 。

UDDI:\\serverUrl=http://localhost/uddi;serviceName=OrderPurchaseToOrderPost;serviceProvider=Microsoft.Practices.ESB

其他支持的名字对象包括 XPATH:\\、STATIC:\\和BRE:\\。 每个名字对象类型都使用实现 IResolveProvider 接口的特定类。 可以为其他名字对象类型创建自己的自定义解析程序,并注册它们以供动态解析系统使用。

名字对象等同于解析程序连接字符串。 单个架构定义参数及其根名字对象。 解析程序将解析程序连接字符串,对其进行验证,并使用结果来查询和填充可用于路由、转换、行程选择或特定于服务的一些其他用途的 Dictionary 对象。

冲突解决程序配置

必须在 Esb.config 配置文件中注册所有解析程序。 以下 XML 演示配置文件内容的示例。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
     <configSections>
          <section name="esb" type="Microsoft.Practices.ESB.Configuration.ESBConfigurationSection, Microsoft.Practices.ESB.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=c62dd63c784d6e22"/>
          <!-- Other Section Definitions Here -->
     </configSections>

     <esb>
          <resolvers cacheManager= "Resolver Providers Cache Manager"  absoluteExpiration="3600">
               <resolver name="UDDI" type="Microsoft.Practices.ESB.Resolver.UDDI.ResolveProvider, Microsoft.Practices.ESB.Resolver.UDDI, Version=2.0.0.0, Culture=neutral, PublicKeyToken=c62dd63c784d6e22">
                    <resolverConfig>
                         <add name="cacheTimeoutValue" value="120" />
                         <add name="cacheName" value="UDDI Cache Manager" />
                    </resolverConfig>
               </resolver>
               <resolver name="XPATH" type="Microsoft.Practices.ESB.Resolver.XPATH.ResolveProvider, Microsoft.Practices.ESB.Resolver.XPATH, Version=2.0.0.0, Culture=neutral, PublicKeyToken=c62dd63c784d6e22"/>
               <!-- Other Resolver Definitions Here -->
          </resolvers>
          <!-- Other ESB Configuration Settings Here -->
     </esb>
     <!-- Other Configuration Sections Here -->
</configuration>

通过每个 解析程序节点下的 resolverConfig 部分,可以配置解析程序在特定环境中运行所需的其他属性。 若要访问配置,解析程序必须公开一个构造函数,该构造函数采用 类型为 Microsoft.Practices.ESB.Configuration.Resolver 的参数。 在解析程序实现中,可以使用 ResolverConfigHelper 类的 ReadResolverConfigByKey 方法访问配置属性;为此,请传入最初传递给构造函数的参数,然后传入有问题的值的名称。 如果未在 resolverConfig 节点中指定名称/值对,则将使用默认无参数构造函数来实例化解析程序。

配置中定义了两个通用说明、发现和集成 (UDDI) 3 解析程序:UDDI 3 和 UDDI 3-SOASOFTWARE。 这两个解析程序使用相同的基础程序集,但它们提供了不同的配置来支持具有不同统一资源标识符 (URI) 格式和安全要求的不同 UDDI 3.0 兼容注册表。 如果需要为符合 UDDI 3.0 的注册表配置其他名字对象(除了已支持的注册表之外),可以使用以下配置属性:

IResolveProvider 接口

所有解析程序都必须实现 IResolveProvider 接口。 位于 Microsoft.Practices.ESB.Resolver 项目中的 IResolveProvider 接口由 Resolve 方法的三个重载组成,这些重载返回 Dictionary 类的实例,其中包含具体解析程序类的实例提供的解析事实。 下面的代码示例演示这些方法重载的签名。

// <summary>
// This is the main interface that is called from the
// ResolverMgr class.
// This interface supports being called from a Microsoft BizTalk
// Server pipeline component.
// </summary>
// <param name="config">Configuration string entered into
// pipeline component as argument</param>
// <param name="resolver">Moniker representing the resolver
// to load</param>.
// <param name="message">IBaseMessage passed from pipeline</param>.
// <param name="pipelineContext">IPipelineContext passed from
// pipeline</param>.
// <returns>Dictionary object fully populated</returns>.
        Dictionary<string, string> Resolve(string config, string resolver,
              IBaseMessage message, IPipelineContext pipelineContext);

// <summary>
// This is the main interface that is called from the ResolverMgr
// class.
// This interface supports being called from a Web service interface.
// </summary>
// <param name="config">Configuration string entered into Web
// service as argument</param>.
// <param name="resolver">Moniker representing the resolver
// to load</param>.
// <param name="message">XML document passed from Web
// service</param>.
// <returns>Dictionary object fully populated</returns>.
        Dictionary<string,string> Resolve(string config, string resolver, System.Xml.XmlDocument message);

// <summary>
// This is the main interface that is called from the
// ResolverMgr class.
// This interface supports being called from an orchestration.
// </summary>
// <param name="resolverInfo">Configuration string containing
// configuration and resolver</param>.
// <param name="message">XLANGMessage passed from
// orchestration</param>.
// <returns>Dictionary object fully populated</returns>.
        Dictionary<string, string> Resolve(ResolverInfo resolverInfo, XLANGs.BaseTypes.XLANGMessage message);

位于 Microsoft.Practices.ESB.Resolver 项目中的 Resolution 结构还定义 存储在 Dictionary 实例中的名称/值对。 Resolution 结构公开多个属性:下表列出了其中最相关的内容。 ResolutionHelper 类的 CreateResolverDictionary 方法可用于生成包含最常用的键和空字符串值的解析程序字典。 Dictionary 实例支持通过 Resolver 类的具体实现添加自定义冲突解决程序名称/值对。

属性 数据类型 数据类型 数据类型
TransformType String ActionField String
Success 布尔 EpmRRCorrelationTokenField String
TransportNamespace String InboundTransportLocationField String
TransportType String InterchangeIDField String
TransportLocation String ReceiveLocationNameField String
操作 String ReceivePortNameField String
MessageExchangePattern String InboundTransportTypeField String
EndpointConfig String IsRequestResponseField String
TargetNamespace String DocumentSpecStrongNameField String
FixJaxRPC 布尔 DocumentSpecNameField String
WindowUserField String MessageType String
CacheTimeout String OutboundTransportCLSID String
MethodNameField String

创建自定义解析程序

在运行时,管道检索解析程序连接字符串,并调用解析程序管理器 (ResolverMgr 类的实例) 。 解析程序管理器分析、填充和验证解析程序连接字符串。 它通过执行以下操作来执行此操作:

  • 它分析连接字符串以确定要加载的冲突解决程序类型。

  • 它将此类型与配置文件中定义的名字对象匹配, (键是根名字对象,例如 UDDI) 。

  • 它读取此名字对象的冲突解决程序的程序集名称。

  • 它加载指定的程序集。

    动态解析机制缓存 IResolveProvider 接口的所有加载实现,以避免在多个传入消息使用相同的解析程序时重复读取配置信息和加载程序集。

    最后,解析程序管理器执行具体 IResolveProvider 实现的 Resolve 方法,并返回填充的 Dictionary 实例。

    创建自定义冲突解决程序

  1. 使用实现 IResolveProvider 接口的类创建程序集,并包含 一个 Resolve 方法,该方法将解析程序事实作为 Dictionary 类的实例返回。

  2. 通过使用<包含根名字对象作为 name 属性和完全限定程序集名称作为类型属性的解析程序元素,将解析程序>添加到 Esb.config 配置文件来注册解析程序。

  3. (可选) 创建定义根名字对象和查询参数的架构,然后将其保存在 ESB 中。Schemas.Resolvers 文件夹。 名称应遵循现有的 ESB 命名约定;这意味着它应使用追加“_Resolution.xsd”的根名字对象的名称。

  4. (可选) 从新架构生成类并将其保存在自定义冲突解决程序程序集中。 这会在自定义冲突解决程序中公开类型化参数。

  5. 在全局程序集缓存中注册新程序集。