2

現在、xml ファイルを受け入れて Excel に変換する BizTalk カスタム送信パイプラインを開発しています。残念ながら、パイプラインをデプロイした後、System.OutOfMemoryException. IComponentインターフェイスの Execute メソッドのコードを含めました。すべての提案を歓迎します。

public Microsoft.BizTalk.Message.Interop.IBaseMessage Execute(IPipelineContext pContext, Microsoft.BizTalk.Message.Interop.IBaseMessage inmsg)
    {

        MemoryStream outMemStream = new MemoryStream();
        try
        {

            if (inmsg.BodyPart.Data != null)
            {
                // Read the source message coming from the messaging engine and convert it to memory stream 
                byte[] buffer = new byte[16 * 1024];
                using (MemoryStream ms = new MemoryStream())
                {
                    int read;
                    while ((read = inmsg.BodyPart.Data.Read(buffer, 0, buffer.Length)) > 0)
                    {
                        ms.Write(buffer, 0, read);
                    }
                    buffer = ms.ToArray();
                }

                if (buffer != null)
                {
                    var binaryWriter = new BinaryWriter(outMemStream);
                    binaryWriter.Write(buffer);
                }

                OpenXMLOffice oOffice = new OpenXMLOffice();
                outMemStream.Position = 0;
                oOffice.XMLToExcel(outMemStream, TemporaryFileLocation);
                inmsg.BodyPart.Data.Position = 0;
                inmsg.BodyPart.Data = outMemStream;
                pContext.ResourceTracker.AddResource(outMemStream);
            }

            return inmsg;
        }
        catch (Exception ex)
        {
            throw new ApplicationException(String.Format("Error converting XML to Excel:{0} - Stack Trace: {1}", ex.Message, ex.StackTrace));
        }
    }

受信した最新のエラーは次のとおりです。

ログ名: アプリケーション
ソース: BizTalk Server
日付: 2012 年 2 月 14 日午前 9:29:00
イベント ID: 5754
タスク カテゴリ: BizTalk Server
レベル: エラー
キーワード: クラシック
ユーザー: なし
コンピューター: IASDev-PC
説明:
URI "C:\SeleneFTPFile\Excel\%MessageID%.xml" で送信ポート "ExcelSendPort" のアダプター "FILE" に送信されたメッセージが中断されました。
 エラーの詳細: 送信パイプラインの実行中にエラーが発生しました: "IAS.SeleneFTPFile.ExcelEncodePipeline, IAS.SeleneFTPFile, Version=1.0.0.0, Culture=neutral, PublicKeyToken=2add433e7764165f" ソース: "Excel ファイル エンコーダー" 送信ポート: "ExcelSendPort" URI: "C:\SeleneFTPFile\Excel\%MessageID%.xml" 理由: XML から Excel への変換中にエラーが発生しました: タイプ 'System.OutOfMemoryException' の例外がスローされました。- スタック トレース: System.IO.MemoryStream.set_Capacity(Int32 値) で
   System.IO.MemoryStream.EnsureCapacity (Int32 値) で
   System.IO.MemoryStream.Write (Byte[] バッファー、Int32 オフセット、Int32 カウント) で
   IAS.SeleneFTPFile.Components.ExcelPipeline.EncodeExcel.Execute (IPipelineContext pContext、IBaseMessage inmsg) で  
 MessageId: {ED37CDD1-EF0C-46E7-9519-061AF3D4F8A4}
 インスタンス ID: {B0E448B3-3DAD-4E52-8F87-07C5D5AA5224}
4

2 に答える 2

1

私も同じ問題に直面しています。inmsg.BodyPart.Dataその理由は、以下のステートメントが実行された後でも、ストリームの位置が進まず、ストリームの 0 のままであることがわかります。

read = inmsg.BodyPart.Data.Read(buffer, 0, buffer.Length)
于 2012-09-29T22:03:42.363 に答える
1

MemoryStreamバッファの事前割り当てを試すことができます(ここで提案されているように)。エラー メッセージには、バッファリングされた書き込みの実行時にラインに十分なメモリを割り当てることができないことが示されています ( ms.Write(buffer, 0, read);)。

using (MemoryStream ms = new MemoryStream(buffer.Length))

あなたが抱えているもう1つの問題は、bufferオーバーフローする可能性があるということです -MemoryStreamが( )に書き込まれたときにこの正確なエラーが発生しますms.Write(buffer, 0, read)

byte[] buffer = new byte[2 * 1024 * 1024]; // try increasing to 2MB buffer
于 2012-02-15T15:06:56.727 に答える