2

我目前正在开发一个接受 xml 文件并将其转换为 Excel 的 BizTalk 自定义发送管道。不幸的是,在部署管道后,我收到了一个System.OutOfMemoryException. IComponent我已经包含了接口执行方法的代码。欢迎所有建议。

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 服务器
日期:2012 年 2 月 14 日上午 9:29:00
事件编号: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(字节 [] 缓冲区,Int32 偏移量,Int32 计数)
   在 IAS.SeleneFTPFile.Components.ExcelPipeline.EncodeExcel.Execute(IPipelineContext pContext,IBaseMessage inmsg)  
 消息 ID:{ED37CDD1-EF0C-46E7-9519-061AF3D4F8A4}
 实例 ID:{B0E448B3-3DAD-4E52-8F87-07C5D5AA5224}
4

2 回答 2

1

您可以尝试预先分配MemoryStream缓冲区(如此处建议)。ms.Write(buffer, 0, read);错误消息指出,在执行缓冲写入 ( )时,它无法为该行分配足够的内存。

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

您遇到的另一个问题是您可能会溢出 -写入 ( )buffer时会产生这个确切的错误。MemoryStreamms.Write(buffer, 0, read)

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

即使我面临同样的问题。我可以发现原因是流位置没有前进并且流的位置保持为 0 inmsg.BodyPart.Data,即使在执行以下语句之后也是如此:

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