我尝试创建一个自定义 BizTalk 2013 R2(接收或发送)管道,该管道可以将包含一些 txt 文件的 xxx.GZ 文件解压缩到发送端口。
这是我到目前为止所尝试的:
PS。我使用了 .Net 的 IO GZip 类。
创建一个 BTS 应用程序,配置接收位置和发送端口。
接收位置使用我创建的自定义管道,这是我尝试的自定义管道的代码:
public void Disassemble(IPipelineContext pc, IBaseMessage inmsg) { IBaseMessagePart bodyPart = inmsg.BodyPart; if (bodyPart != null) { Stream originalStream = bodyPart.GetOriginalDataStream(); if (originalStream != null) { using (GZipStream gZipInputStream = new GZipStream(new MemoryStream(originalStream.ReadByte()), CompressionMode.Decompress)) { MemoryStream memStream = new MemoryStream(); byte[] buffer = new Byte[1024]; int bytesRead = 1024; while (bytesRead != 0) { bytesRead = gZipInputStream.Read(buffer, 0, buffer.Length); gZipInputStream.CopyTo(buffer, 0); memStream.Write(buffer, 0, bytesRead); } IBaseMessage outMessage; outMessage = pc.GetMessageFactory().CreateMessage(); outMessage.AddPart("Body", pc.GetMessageFactory().CreateMessagePart(), true); memStream.Position = 0; outMessage.BodyPart.Data = memStream; outMessage.Context = PipelineUtil.CloneMessageContext(inmsg.Context); _msgs.Enqueue(outMessage); } } } }
此代码似乎无法按我的意愿工作。只需发送 GZ 文件而不将其解压缩到发送端口。我在接收位置端口中使用实现的管道。以下是它的工作原理:当 BizTalk 在其接收位置接收到 GZ 打包文件时,它只是将文件发送到订阅此接收位置的发送端口。管道似乎对 GZ 流没有任何作用。它应该做的是解压GZ文件并将所有解压后的文件发送到发送端口,这指向一个需要放置解压文件的文件夹。
我试图在没有运气的情况下进行谷歌搜索,并且现有的样本似乎对我不起作用。
所以任何人都可以帮助我或告诉我在我的代码中做错了什么。我只想实现一个 C# 自定义 BizTalk 2013 R2(接收或发送)管道,该管道可以将包含一些 txt 文件的接收到的 GZ 文件解压缩到发送端口(指向文件夹)?
更新:
由于 Dissambler 版本不起作用,我创建了一个解码版本。
这是管道中的解码代码:
#region IComponent members
/// <summary>
/// Implements IComponent.Execute method.
/// </summary>
/// <param name="pc">Pipeline context</param>
/// <param name="inmsg">Input message</param>
/// <returns>Original input message</returns>
/// <remarks>
/// IComponent.Execute method is used to initiate
/// the processing of the message in this pipeline component.
/// </remarks>
public Microsoft.BizTalk.Message.Interop.IBaseMessage Execute(Microsoft.BizTalk.Component.Interop.IPipelineContext pc, Microsoft.BizTalk.Message.Interop.IBaseMessage inmsg)
{
if (null == pc) throw new ArgumentNullException("pContext", "Pipeline context can not be null");
if (null == inmsg) throw new ArgumentNullException("pInMsg", "Input message can not be null");
IBaseMessagePart bodyPart = inmsg.BodyPart;
if (bodyPart != null)
{
GZipStream strm = new GZipStream(bodyPart.GetOriginalDataStream(), CompressionMode.Decompress);
bodyPart.Data = strm;
pc.ResourceTracker.AddResource(strm);
}
return inmsg;
}
#endregion
如何获取 GZip 文件中每个文件的正确文件名?所以当消息被发送到发送端口时,它应该用正确的文件名写入文件。