消息的是由一个或多个部分的消息内容和一个属性集组成,这个属性集称为消息上下文属性(context properties),这些属性的值是从消息本身提取或不来自消息本身但与消息本身相关的值。
在设计消息schema时,在promote消息属性时,除了可以promote消息的Property fields,还有个选择就是promote消息的Distinguished fields。消息的Property fields是被包含在消息的上下文属性(context properties)中,而消息的Distinguished fields只是指向消息中的某个element或者attribute的一个xpath指针。
一. Property fields
Property fields必须有一个单独的属性架构定义属性,定义的每个属性都有一个GUID来标识这个属性。
Property fields的有两种类型,一种从是基类Microsoft.XLANGs.BaseTypes.MessageContextPropertyBase继承的属性,这类属性的属性值不是直接从消息中来的,但是跟这个消息相关的一些属性,比如接收此消息的接收位置,适配器类型以及其他系统(与适配器相关)属性等等,这类属性在接收端口的适配器中被升级到消息的上下文中。Biztalk本身预定义了许多属性架构,称为系统属性,这些系统属性都是MessageContextPropertyBase类型的属性。
另一种是从基类Microsoft.XLANGs.BaseTypes.MessageDataPropertyBase继承的属性,这种属性的属性值直接来自消息本身,开发者使用属性架构定义属性,在消息架构中指定使用这个属性架构,并通过xpath指定消息架构中的某个元素对应属性架构中定义的属性。在接收管道中,xml拆装器匹配消息类型,并根据匹配到的消息的schema设置的promotion properties升级用户定义的属性。在系统提供的拆装器中只有xml拆装器具有升级消息属性的功能,如果使用定制拆装器,要用户自己实现属性升级的功能。如果不是使用xml拆装器,或者使用定制拆装器而没有实现属性升级功能的,schema中设置的升级属性将不会被升级到上下文中。
开发者也可以在自定义的属性架构中定义MessageContextPropertyBase类型的属性。自定义的属性架构中的属性类型默认为MessageDataPropertyBase。
Property fields属性既可以是用Microsoft.BizTalk.Message.Interop. IbaseMessageContext接口的Write方法写入到消息上下文,这时属性的状态是not promoted,未升级。也可以用Microsoft.BizTalk.Message.Interop. IbaseMessageContext接口的Promote方法升级到消息上下文,这时属性的状态是promoted,已升级。
这说明Property fields属性在消息上下文中并不都是升级的属性,只有已升级的属性才能用于路由消息。
Property fields属性有一个名称空间和一个属性名来标识,名称空间和属性名都是在属性架构中被定义。
Property fields属性的值一旦被升级到上下文,将被保存在消息的上下文中,当这些属性被访问时,直接在消息上下文中获取属性值。修改Property fields属性时同时会修改上下文中保存的值和实际消息中跟此属性对应的元素(在属性是从消息本身升级的时候)
Property fields属性的值有长度限制,限制在255个字符。
Property fields属性(已升级的属性)可以用来据以路由消息,跟踪消息,可以在pipeline、端口和orchestration中被访问。
消息路由的时候,首先把这个消息上下文中的已升级的Property fields属性写入到messagebox的MessageProps 表中,这个表是这样的结构:
[uidMessageID ] |
uniqueidentifier |
消息的uid |
uidPropID |
uniqueidentifier |
消息的一个属性,用属性的guid来标识 |
vtPropValue |
sql_variant |
这个属性的值 |
用一系列的消息属性GUID – 属性值 来表示这个消息。然后根据这个表跟订阅的订阅条件进行匹配(订阅条件是由属性GUID、订阅谓词和属性值组成),如果消息的这些属性匹配到相关订阅,则消息被发送到订阅这个消息的服务实例。
Property fields属性的访问方法:
MyMessage(Namespace.PropertyName)
Property fields属性是在消息后面的圆括号中以属性架构的名称空间和属性名称构成的属性标识来进行访问。
二. Distinguished fields
Distinguished fields不需要有单独的属性架构来定义,Distinguished fields属性其实就是在一个消息schema中用xpath标识出需要提取的消息元素的位置,Distinguished fields相当于这个元素的xpath的别名。当需要访问Distinguished fields属性时,Distinguished fields根据这个属性对应的xpath,即时的到消息中读取值返回。
Distinguished fields属性使用公共的名称空间:http://schemas.microsoft.com/BizTalk/2003/btsDistinguishedFields
Distinguished fields属性的值不会保存到消息上下文中,所有属性值长度没有限制。
Distinguished fields属性不能用于路由消息的条件,不能用于消息跟踪,只能在orchestration中被访问。
Distinguished fields属性的访问方法:
MyMessage.MyRecord.MySubrecord.MyDistinguishedField
是由消息后面跟子记录(可以有多层子记录),最后到达设置的Distinguished fields属性名称。。