2010-07-20 34 views
2

我對BizTalk相當陌生並且創建了一個自定義管道組件。我看過類似於以下示例的代碼:在BizTalk管道組件中配置一個流?

public void Disassemble(IPipelineContext pContext, IBaseMessage pInMsg) 
{ 

    Stream originalDataStream = pInMsg.BodyPart.GetOriginalDataStream(); 
    StreamReader strReader = new StreamReader(originalDataStream); 

    string strOriginalData = strReader.ReadToEnd(); 

    byte[] bufferOriginalMessage = new byte[strOriginalData.Length]; 
    bufferOriginalMessage = ASCIIEncoding.Default.GetBytes(strOriginalData); 

    Stream ms = new MemoryStream(); 
    ms.Write(bufferOriginalMessage, 0, strOriginalD 

    //other stuff here 

    ms.Seek(0, SeekOrigin.Begin); 
    pInMsg.BodyPart.Data = ms; 
} 

但是在該方法中沒有任何地方是關閉或丟棄StreamReader。該方法只是退出。

通常,當使用StreamReader和其他類時,最好使用using語句以便自動處理流。

是否有一個特定的原因(也許在BizTalk中)爲什麼你不會處理這個StreamReader?

我還沒有找到關於這一點的任何信息。誰能幫忙?

+0

爲了教育,我注意到你提到的例子使用StreamReader和MemoryStream類。請注意,強大的企業級管道組件最好通過使用*只讀* *只向* *非可搜索*流來編寫。你可以閱讀更多關於流媒體管道組件:http://blogs.objectsharp.com/cs/blogs/nbarden/archive/2008/04/14/developing-streaming-pipeline-components-part-1.aspx。 – 2010-12-18 21:48:29

回答

3

一般來說,是的,關閉您不再需要的讀取器和數據流是一種很好的做法。也就是說,每次都可能不需要100%。例如,關閉閱讀器通常會關閉底層的流,但有可能,其他的東西可能已經意識到這個流,並會在正確的時間關閉它。

但是,最好的做法是將您在流水線組件中使用的任何流添加到與resource tracker消息匹配的生命週期中,以便BizTalk在流水線執行完成時自動處置它們,並且消息具有已被處理。

+0

謝謝,那正是我的想法,但我找不到任何文檔。我認爲如果關閉流是有害的,那麼文檔會強調這一點! – 2010-07-21 16:52:31