Я попытался создать настраиваемый конвейер BizTalk 2013 R2 (прием или отправку), который может распаковать файл xxx.GZ, который содержит некоторые файлы txt на порт отправки.Как я могу распаковать файл gzip в настраиваемом конвейере
Вот что я не пытался до сих пор:
PS. Я использовал классы IO GZip .Net.
Создано приложение 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 без везения, и образцы, которые существуют, кажется, не работают для меня.
Так может кто-нибудь помочь мне или сказать, что я делаю неправильно в своем коде. Я просто хочу реализовать конвейер BizTalk 2013 R2 (прием или отправку) C#, который может распаковать полученный GZ-файл, содержащий некоторые файлы txt, на порт отправки (указать на папку)?
Update:
В версии 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? Поэтому, когда сообщение отправляется на порт отправки, он должен записать файл с правильным именем файла.
Привет, Он не вызывает никаких ошибок, но просто отправьте файл GZ без его распаковки в порт отправки. Я использую реализованный конвейер в порту получения. Вот как это работает: Когда BizTalk получает упакованный файл GZ в своем месте приема, он просто отправляет файл на порт отправки, который подписывается в этом месте приема. Похоже, что конвейер ничего не делает для потока GZ. Что нужно сделать, так это распаковать GZ-файл и отправить все распакованные файлы на порт отправки, hvis указывает на папку, в которую должны быть размещены файлы распаковки. – Balatharan
Мне просто интересно, нужно ли мне реализовать часть дизассемблирования или декодера в конвейере для распаковки gz-файла? – Balatharan
Затем отредактируйте свой вопрос и добавьте эти детали в вопрос. Я был бы склонен помещать его в часть декодирования конвейера, так как после этого вы можете использовать компонент конвейера плоского файла или xml дизассемблера, если это необходимо, вы НЕ можете иметь два компонента, которые выполняются на этапе дизассемблера «If этот этап содержит более одного компонента, только первый компонент, который распознает формат сообщения, запускается. Если ни один из компонентов на этапе не распознает формат сообщения, обработка сообщений терпит неудачу ». https://msdn.microsoft.com/en-us/library/ee268059(v=bts.10).aspx – Dijkgraaf