表示為 XLANGMessage 的訊息
XLANGMessage物件代表以 XLANG 服務宣告的訊息實例。 這個物件的取得方式,是在方法引動過程中將訊息的參考傳遞為參數。 XLANGPart物件代表 XLANG 服務內訊息實例中包含的訊息元件。 藉由在接收參數類型為 XLANGPart 的方法調用中傳遞元件參考,或藉由列舉 XLANGMessage的傳遞參考,來取得這個物件。
協調流程訊息變數可能會傳遞至使用者元件,並接收為 XLANGMessage 物件。 XLANGMessage物件允許存取元件和存取訊息屬性。使用者可能會「保留」XLANGMessage,進而將其存留期延長到宣告範圍之外。 接著, XLANGMessage 可以從 方法傳回,並指派給協調流程中的訊息變數。
建構 XLANGMessage
使用資料流程建構 XLANGMessage 時,資料流程類型必須實作 IStreamFactory 或 MemoryStream。 下列程式碼範例示範如何建構 XLANGMessage:
public class FileStreamFactory : IStreamFactory
{
string _fname;
public FileStreamFactory(string fname)
{
_fname = fname;
}
public Stream CreateStream()
{
return new FileStream
(
_fname,
FileMode.Open,
FileAccess.Read,
FileShare.Read
);
}
}
public static void AssignStreamFactoryToPart(XLANGMessage msg)
{
IStreamFactory sf = new FileStreamFactory( @”c:\data.xml” );
msg[0].LoadFrom( sf );
}
您有時可能會想要建立新的訊息,而不要轉換來源訊息。 您可以使用類型為System.Xml 的變數來執行此 動作。XmlDocument 和載入或建構適當的內容。 在下列範例中,XML 是使用XmlDocument的LoadXml方法從字串載入:
XmlVariable.LoadXml("<ns0:Root PONumber="047745351122111" xmlns:ns0="http://BTSHTTPSend.SimpleSchema"><MyChildRecord SubAttr1="Simple Attribute " /></ns0:Root>");
XLANGMessage XmlMsg = XmlVariable;
下列範例會使用XmlDocument的Load方法,從檔案載入 XML:
XmlVariable.Load("C:\MyData.xml");
XLANGMessage XmlMsg = XmlVariable;
注意
如果您想要建構較大的訊息,請使用上一節所示範的其中一個串流方法,或考慮在協調流程Designer中使用轉換圖形。
使用 XLANGMessage 和 XLANGPart 時的考量
在使用者程式碼中使用 XLANGMessage 和 XLANGPart 時,請考慮下列事項:
請勿將訊息元件當做 XLANGPart 引數傳遞,或傳回 XLANGPart類型的值。 您應該傳遞 XLANGPart 做為元件的類型。 例如:
Message String msg; Class.Test(msg); // or you can do the following Messagetype mt { String part; }; Message mt msg; Class.Test(msg,part);
您也可以將訊息本身當做 XLANGMessage 傳遞,並使用 XLANGMessage 下標運算子來存取函式呼叫內的元件。 不過,您不應該將 XLANGPart 放在存留期超過函式呼叫存留期的集合中。 相反地,您應該將 XLANGMessage 放在集合中。 例如:
void Test(XLANGMessage xlm) { try { XLANGPart xlp = xlm[0]; string sval = (string)xlp.RetrieveAs(typeof(string)); } finally { xlm.Dispose(); } }
請勿將協調流程參數定義為 XLANGMessage 或 XLANGPart。 如果您要傳遞訊息,請使用訊息類型參數來傳遞訊息。 如果您要傳遞某個部分,請改為傳遞訊息,然後再使用此部分。 如果您只想要此部分值,請使用此部分類型來傳遞此部分。
請勿傳回方法呼叫的 XLANGMessage 參數。 如果您傳回傳入的 XLANGMessage 參數,而且您無法在方法呼叫內的 參數上呼叫 Dispose 方法,它會直覺地違反存留期假設,也會擲回例外狀況。 透過 XLANGMessage 參數傳遞訊息至使用者程式碼時,您會將訊息參考至通常沒有參考訊息的特殊內容。 此內容的存留期間就是協調流程執行個體的存留期間。 這是因為 BizTalk Server 並不知道使用者程式碼是否會保留此訊息。
當協調流程執行個體結束時,該執行個體中建立的任何訊息便不再有效,所以這類集合的存留期間應該小於或等於此執行個體的存留期間。 不過,如果您想要在訊息通過與協調流程實例具有相同存留期的 XLANGMessage 引數時,在迴圈中釋放訊息參考,您可以呼叫 XLANGMessage.Dispose 以釋放參考。 此外,如果在使用者程式碼方法內, XLANGMessage 參數只會在本機使用,而且參數的存留期包含在函式呼叫中,您也可以呼叫 XLANGMessage.Dispose 以釋放根內容的參考,並將對應的訊息傳回一般存留期行為。 例如:
void Test(XLANGMessage xlm) { try { //XLANGMessage is only used locally } finally { xlm.Dispose(); } }
如果您將 xlm 放在集合中,則類別本身必須有 Dispose 方法來清除。 例如:
public class A { Hashtable h = new Hashtable(); public void Test(XLANGMessage xlm) { h[xlm] = 1; } //You can have more methods here public void Dispose() { foreach (XLANGMessage xlm in h.Keys) { xlm.Dispose(); } } }
當您完成XLANGMessages集合時,會呼叫A.Dispose。