[筆記][Biztalk]Message的處理

在Biztalk中進行Orchestration設計時,一定會牽涉到Message的處理。Message就是資料在Orchestration中的載體,可以定義各種基本型別,複雜型別則是XML的格式。Receive Port會帶入Message,而Send Port則需要建立(Construct)合乎Send Port Type型別的Message以正確的送出。這裡紀錄Message的建立及內容修改的方式。

Construct Message

除了透過Recevie Port傳進來的Message之外,所有的Message都需要使用Construct Message shape以進行建立(Construct)後,才能在Orchestration中使用。

Construct Message shape只是用來宣告該Message能在Orchestration中使用,還需要實質的建立Message實體才行。建立方式有以下幾個:

透過Biztalk Map

最常見的方式,就是透過Map將來源Message轉換成目標Message。

在Orchestration中使用Transform shape以指定要使用的Map

也可以設定多個來源Message 轉換到一個目標Message中,方法是先在Transform shape中的Source中指定多個Message,然後使用New Map的方式建立一個新的Map

這樣就可以看到在Map編輯器中,多個來源Message的Schema被合併為一個來源Schema,並用它來進行Mapping。

Assign Message

如果兩個message是同樣的型別,則可以使用Message Assign Shape,直接透過Assign的方式初始化另一個message

msgA = msgB;

使用System.XML.XMLDocument variable

先在Orestration中建立一個System.XML.XMLDocument型別的Message

Message Assign Shape中,初始化該Message,並透過LoadXml()直接Assign XML,然後再Assign給目標Message。

msgXmlDoc = new System.Xml.XmlDocument();
msgXmlDoc.LoadXml("<ns0:Root xmlns:ns0=\"http://SqlRead\"><ns0:ReadConfig Key=\"AAA\" /></ns0:Root>");
msgRequest = msgXmlDoc;

修改Messages內容

Orcestration的Message是所謂的immutable 物件,在Construct Shape之外就不能修改了。所以如果要修改的話,只能複製一份原先的Message之後,再進行修改。

Construct Shape之內,則可以透過Message Assignment Shape進行Message的內容修改。簡單型別的Message可以直接Assign 值給它,複雜型別的Message,由於其本質是XML,所以可以透過xpath method進行修改。

xpath(msgA,"/*[local-name()='Root' and namespace-uri()='http://Lab.TypeA']/*[local-name()='AAA' and namespace-uri()='']") = "ValueA";

另外,也可以使用Distinguished Fields的方式修改Message內容。Distinguished FieldsPromoted Properties的觀念可以參考:Distinguished Fields vs. Promoted Properties