我正在 BizTalk 中创建一个自定义接收管道,该管道将接收包含作为 base64 字符串的 word 文档的消息。这将从管道配置中的节点集中提取字符串到 memoryStream 并将其传递给 Apose.Words 以将其转换为 PDF 并将其保存到文件中。
从消息中删除 base64 字符串,然后将更新的消息分配回消息正文。然后在消息中提升新创建文件的路径。
我的问题是运行此管道的主机在内存中增加并且似乎没有释放任何资源。目前它以 250MB 运行,并且没有下降。这会导致问题,因为后续调用无法及时处理。
我的代码
管道组件:
public Microsoft.BizTalk.Message.Interop.IBaseMessage Execute(IPipelineContext pContext, Microsoft.BizTalk.Message.Interop.IBaseMessage pInMsg)
{
string fileName = GenerateFileName();
XmlTextReader reader = new XmlTextReader(pInMsg.BodyPart.GetOriginalDataStream());
var removeNodeReader = new StoreAndRemoveReader(reader, nodeNameOfEncodedFileContents, fileName);
XmlTranslatorStream translatorStream = new XmlTranslatorStream(removeNodeReader);
pInMsg.Context.Write(contextKeyForDocumentFilePath, contextNSForDocumentFilePath, fileName);
pInMsg.BodyPart.Data = translatorStream;
return pInMsg;
}
StoreAndRemoveReader:(取自http://biztalkmessages.vansplunteren.net/articles/dealing-with-base64/)
public class StoreAndRemoveReader : XmlReader
{
private bool inAttribute;
private XmlReader wrappedReader;
private string nodeNameOfEncodedFileContents;
private string documentFilePath;
public StoreAndRemoveReader(XmlReader wrappedReader,
string nodeNameOfEncodedFileContents,
string documentFilePath)
{
this.wrappedReader = wrappedReader;
this.nodeNameOfEncodedFileContents = nodeNameOfEncodedFileContents;
this.documentFilePath = documentFilePath;
}
public override bool Read()
{
Boolean result = wrappedReader.Read();
if (wrappedReader.IsStartElement() && wrappedReader.LocalName == nodeNameOfEncodedFileContents)
{
if (wrappedReader.IsEmptyElement)
{
wrappedReader.Read();
}
else
{
Base64DecodeDocument(wrappedReader);
}
}
return result;
}
private void Base64DecodeDocument(XmlReader reader)
{
byte[] buffer = new byte[1000];
int readBytes = 0;
//FileStream outputFile = new FileStream(this.documentFilePath, FileMode.CreateNew, FileAccess.Write, FileShare.Write);
using (var outputStream = new MemoryStream(307200))
{
BinaryWriter bw = new BinaryWriter(outputStream);
while ((readBytes = reader.ReadElementContentAsBase64(buffer, 0, 1000)) > 0)
{
bw.Write(buffer, 0, readBytes);
}
//File.WriteAllText(this.documentFilePath, "test");
WordToPDFConversion.ConvertWordDocumentToPdf(outputStream, this.documentFilePath);
}
}
尝试修复
我尝试在 XmlTextReader 和 StoreAndRemoveReader 的管道组件中使用语句,但这不起作用,因为我假设它关闭了传入消息的流。
我尝试过独立运行 Aspose,它确实使用了大量内存,但之后它确实会清除它。
总之:
我可以在我的管道组件中处理 Readers,还是有更好的方法来提取数据?