Compactar Arquivo Txt, Flat File, em Pipeline Decoder Customizado.


Olá Pessoal.

Recentemente tive que criar uma solução para que fosse possível trafegar um arquivo txt grande (mais de 5mb) dentro do BizTalk. Essa transmissão deveria ser de forma rápida e sem comprometer o desempenho do servidor. Esse arquivo não precisaria ser tratado, a tarefa era somente pegar o seu conteúdo e enviar para o WebService em um dos parâmetros como string.

Com essa definição desenvolvi um componente do tipo Pipeline Receiver Decoder, onde compacta o conteúdo, cria uma mensagem em XML e transforma o conteúdo compactado em Base64 passando essa informação em um dos campos da mensagem.

Base64 é um método para codificação de dados para transferência na Internet. É constituído por 64 caracteres ([A-Za-z0-9], "/" e "+") que deram origem ao seu nome.
Para saber mais sobre Base64 leia: http://pt.kioskea.net/contents/base/base64.php3

Criação da Solution

  • Crie um novo projeto do tipo Decoder. Se não sabe nem por onde começar, esse artigo pode dar uma ajuda.
  • Crie três propriedades do tipo string (recomendo criar as propriedades com a ajuda do wizard, utilizando o artigo mencionado), sendo eles:
    • FullNameSchema – Nome completo do schema que vai ser utilizado. Deve receber o Name + “,” + Assembly do schema.
    • TargetNamespace – Propriedade TargetNamespace do schema.
    • TypeAdapter – Tipo do Adapter que será utilizado. Valores testados: ftp e file.
  • Sobrescreva o método Execute com o código abaixo:
public IBaseMessage Execute(IPipelineContext pc, IBaseMessage inmsg)
{
  if ((TypeAdapter != "") &&
     (FullNameSchema != "") &&
      (TargetNamespace != ""))
  {
    Stream originalStrm = null;
    MemoryStream memStrm = new MemoryStream();
    try
     {
      if (inmsg.BodyPart != null)
       {
        originalStrm = inmsg.BodyPart.GetOriginalDataStream();
        //Recuperando nome do arquivo recebido
        string originalFileName = inmsg.Context.Read("ReceivedFileName",
        "http://schemas.microsoft.com/BizTalk/2003/" + TypeAdapter + "-properties") as string;
        System.IO.FileInfo file = new System.IO.FileInfo(originalFileName);
        string fileName = file.Name;
        //Compactar o arquivo e tranformar em Base64
        string arqZipBase64 = CompactarArquivo(originalStrm, fileName);
        //Criando Nova Mensagem XML
        string strReplace = @"<ns0:ArqInfo xmlns:ns0='" + TargetNamespace + "'><ArqData>" + arqZipBase64 + "</CnabData> <ArqName>" + fileName + "</CnabName></ns0:ArqInfo>";
        StreamWriter swriter = new StreamWriter(memStrm, System.Text.Encoding.Default);
        swriter.Write(strReplace);
        swriter.Flush();
        memStrm.Seek(0, System.IO.SeekOrigin.Begin);
        //Promovendo propriedades
        inmsg.Context.Promote("MessageType", "http://schemas.microsoft.com/BizTalk/2003/system-properties", TargetNamespace);
        inmsg.Context.Promote("SchemaStrongName", "http://schemas.microsoft.com/BizTalk/2003/system-properties", FullNameSchema);
        //Alterando o corpo da mensagem
        inmsg.BodyPart.Data = memStrm;
        pc.ResourceTracker.AddResource(memStrm);
       }
     }
     catch (Exception ex)
     {
      System.Diagnostics.EventLog.WriteEntry("SampleZipDecodePipeline", "Ocorreu um erro ao executar ZipFileDecode. Detalhe: " + ex.Message + "\n" + ex.StackTrace, System.Diagnostics.EventLogEntryType.Error);
      throw (ex);
     }
 }
 else
   System.Diagnostics.EventLog.WriteEntry("SampleZipDecodePipeline", "Pipeline ZipFileDecode não executado. Parametros obrigatórios não foram preenchidos. \nValores: TypeAdapter "+TypeAdapter+", FullNameSchema "+FullNameSchema+" e TargetNamespace "+TargetNamespace, System.Diagnostics.EventLogEntryType.Warning);
  return inmsg;
} 
  • Crie a Função CompactarArquivo, usando as classes da biblioteca SharpZipLib:
       public string CompactarArquivo(Stream strmFile, string sNomeArq)
        {
            MemoryStream ms = new MemoryStream();
            ZipOutputStream arqZip = new ZipOutputStream(ms);
            arqZip.SetLevel(9); //Nível de Compressão - 9 máximo
            ZipEntry entry = new ZipEntry(sNomeArq);
            entry.DateTime = DateTime.Now;
            arqZip.PutNextEntry(entry);
            byte[] oBuffer = new byte[strmFile.Length];
            strmFile.Read(oBuffer, 0, oBuffer.Length);
            arqZip.Write(oBuffer, 0, oBuffer.Length);
            arqZip.Finish();
            arqZip.Close();
            byte[] bArqComp = ms.ToArray();
            return Convert.ToBase64String(bArqComp);
        }

A biblioteca SharpZipLib é um conjunto de classes que permite compactar e descompactar arquivos nos seguintes formatos: zip, Gzip, tar. É escrito em C#.NET e desenvolvido pela SharpDevelop, e é OpenSource. Visite o site da empresa para maiores informações.
  • Compile o projeto e coloque a dll gerada na pasta \Microsoft BizTalk Server 2006\Pipeline Components
  • Crie um novo projeto de Biztalk.
  • Adicione um receiver pipeline.
  • Adicione o novo Decoder para a área de Decode.
  • E configure os paramentros como a figura. Segue:

image

A classe Sharpziplib, o decoder pipeline, e o exemplo de como utilizar o componente, pode ser baixado em: http://samplezipdecoder.codeplex.com/
Enjoy! Wink

Seja o primeiro a comentar ;)

Postar um comentário

BizTalk 360

Visitas

Arquivo do blog