Compactar Arquivo Txt, Flat File, em Pipeline Decoder Customizado.
quinta-feira, 22 de abril de 2010
|
|
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:
A classe Sharpziplib, o decoder pipeline, e o exemplo de como utilizar o componente, pode ser baixado em: http://samplezipdecoder.codeplex.com/
Enjoy!
Seja o primeiro a comentar ;)
Postar um comentário