Я попытался создать собственный конвейер BizTalk 2013 R2 (получение или отправка), который может распаковывать файл xxx.GZ, содержащий несколько файлов txt, на порт отправки.
Вот что я пробовал до сих пор:
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 и отправить все распакованные файлы на порт отправки, это указывает на папку, в которую необходимо поместить файлы для распаковки.
Я безуспешно пытался использовать Google, и существующие образцы, похоже, не работают для меня.
Так может ли кто-нибудь помочь мне или сказать, что я делаю неправильно в своем коде. Я просто хочу реализовать собственный конвейер C# BizTalk 2013 R2 (получение или отправка), который может распаковывать полученный файл GZ, содержащий некоторые файлы txt, в порт отправки (указать папку)?
Обновление:
Поскольку версия 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? Поэтому, когда сообщение отправляется на порт отправки, оно должно записать файл с правильным именем.