0

Я попытался создать настраиваемый конвейер BizTalk 2013 R2 (прием или отправку), который может распаковать файл xxx.GZ, который содержит некоторые файлы txt на порт отправки.Как я могу распаковать файл gzip в настраиваемом конвейере

Вот что я не пытался до сих пор:

PS. Я использовал классы IO GZip .Net.

  1. Создано приложение BTS, настроено местоположение приема и порт отправки.

  2. Приемный расположение использует пользовательский трубопровод, который я создал, вот мой код пользовательского трубопровода я попытался:

    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? Поэтому, когда сообщение отправляется на порт отправки, он должен записать файл с правильным именем файла.

+0

Привет, Он не вызывает никаких ошибок, но просто отправьте файл GZ без его распаковки в порт отправки. Я использую реализованный конвейер в порту получения. Вот как это работает: Когда BizTalk получает упакованный файл GZ в своем месте приема, он просто отправляет файл на порт отправки, который подписывается в этом месте приема. Похоже, что конвейер ничего не делает для потока GZ. Что нужно сделать, так это распаковать GZ-файл и отправить все распакованные файлы на порт отправки, hvis указывает на папку, в которую должны быть размещены файлы распаковки. – Balatharan

+0

Мне просто интересно, нужно ли мне реализовать часть дизассемблирования или декодера в конвейере для распаковки gz-файла? – Balatharan

+0

Затем отредактируйте свой вопрос и добавьте эти детали в вопрос. Я был бы склонен помещать его в часть декодирования конвейера, так как после этого вы можете использовать компонент конвейера плоского файла или xml дизассемблера, если это необходимо, вы НЕ можете иметь два компонента, которые выполняются на этапе дизассемблера «If этот этап содержит более одного компонента, только первый компонент, который распознает формат сообщения, запускается. Если ни один из компонентов на этапе не распознает формат сообщения, обработка сообщений терпит неудачу ». https://msdn.microsoft.com/en-us/library/ee268059(v=bts.10).aspx – Dijkgraaf

ответ

1

Похоже, что вы внедрили компонент конвейера в качестве этапа дизассемблирования, он должен быть компонентом конвейера этапа декодирования по двум причинам.

  1. На этапе демонтажа вы можете использовать только один компонент, который выполняет. Это означает, что вы не можете также иметь плоский файл, XML или JSON dissasembler.
  2. Если это компонентный компонент для демонтажа, вам также необходимо внедрить зонд, чтобы узнать, распознано ли сообщение, иначе оно не будет выполнено.

См MSDN Receive Pipelines

Decode Стадии

  • Этот этап используется для компонентов, которые декодируют или расшифровать сообщение.
    • Компонент конвейера MIME/SMIME декодера или пользовательский компонент декодирования должен быть размещен на этом этапе, если входящие сообщения необходимо декодировать из одного формата в другой.
  • Эта стадия принимает одно сообщение и выдает одно сообщение.
  • Этот этап может содержать от нуля до 255 компонентов.
  • Все компоненты на этом этапе запускаются.

Разберите этап

Этот этап используется для компонентов, которые анализируют или разбирать сообщение.

  • Компоненты на этом этапе исследуют сообщение, чтобы узнать, распознан ли формат сообщения. Основываясь на распознавании формата, один из компонентов разбирает сообщение.
  • Если этот этап содержит более одного компонента, запускается только первый компонент, который распознает формат сообщения. Если ни один из компонентов на этапе не распознает формат сообщения, обработка сообщений завершается с ошибкой.
  • Этот этап должен включать любые пользовательские компоненты, которые реализуют специальное поведение для демонстрации содержимого сообщения.
  • Этот этап может содержать от нуля до 255 компонентов. Если на этапе нет компонентов, сообщение передается.

Update: С обновлением вас вопрос становится немного сложнее. Если вам нужно разделить сообщение на несколько сообщений, единственным этапом, на котором вы можете это сделать, является этап дизассемблирования. Поэтому вам придется вернуться к этой версии и отладить ее и решить, почему она не выполняет распаковку.

Существует старый образец кода для дизассемблера Zip UnzipDisassembler - A custom pipeline component for BizTalk Server 2004, который предназначен для Zip-файла, а не для Gzip. Но он следует тому же виду. Вам также понадобится метод, подобный GetNextEntry, чтобы опубликовать сообщение, а затем проанализировать следующий файл. На этапе создания outmsg вы можете установить свойства контекста, такие как имя файла.

+0

Привет, спасибо. Я нашел образец из BizTalk 2006 SDK и создал конвейер декодирования, как вы упомянули, и теперь он работает нормально. Но у меня есть некоторые проблемы с получением правильного имени файла, кажется, что он использует имя файла gzip для всех файлов. Я просто изменил пример кода выше. – Balatharan

Смежные вопросы