Tudo bem amigos? Vou escrever este primeiro artigo sobre um assunto relativamente novo, porém muito interessante para os companheiros que trabalham com o WCF (Windows Communication Foundation), e necessitam enviar arquivos de grande porte via Web utilizando o ASPX.
Para fazermos um rápido comentário sobre o WCF e seu funcionamento, podemos mencionar que este apareceu no Framework 3.0 como uma excelente alternativa para implementação de serviços web.
A estrutura de um serviço web utilizando tecnologia WCF é muito parecida com a estrutura utilizada na criação de componente (DLL) feita no Visual Studio 2008. Veja o por que:
Neste tipo de implementações, é normal encontrarmos uma estrutura onde temho uma classe de negócio (onde realizamos validações, por exemplo), uma classe chamada classe de contrato, que nada mais é do que o local onde vamos expor os métodos públicos que queremos disponibilizar via web e um arquivo de serviço, que serve para expor a classe na web. Podemos ver nas figuras abaixo:

A estrutura utilizada
Aqui utilizaremos a seguinte estrutura para desenvolver uma solução para o WCF. Temos um projeto do tipo Visual C# \ WCF Service Application com o nome de “AppExemplo” e um projeto do tipo ASP.NET Web Site com o nome de “Web“. Podemos atribuir o nome da solução como “AppExemplo” também:

No Projeto WCF
Dentro do nosso Projeto WCF, vamos criar um arquivo XML de configuração (web.config) onde vamos manipular as opções para podermos fazer a transferência de arquivos de grande porte (verifiquei que por padrão o WCF permite a transmissão de apenas alguns Kb não chegando nem a 1Mb).
No exemplo abaixo, estamos criando um nó de configuração chamado “ConfigBinding“, que vincularemos no nó “service”, que serve para expor as classes da DLL gerada pelo projeto WCF.
Abaixo segue o código do arquivo de configuração que implementei para envio de Currículos por exemplo:

No projeto do site
Na tela do site vamos ter um componente para obter o arquivo e fazer o upload do mesmo, como o exemplo abaixo:

Temos um objeto de valor (classe onde informamos os atributos) e temos um atributo chamado Arquivo, do tipo byte[], conforme segue abaixo:
FileStream fs = null;
// Verifica se upArquivo (componente que lista arquivos a serem enviados)
// está vázio, ou se possui algum arquivo a ser enviado.
if (upArquivo.UploadedFiles.Count > 0)
{
// Faz conversão dos arquivos para um Array de Bytes
FileInfo fi = new FileInfo(upArquivo.UploadedFiles[0].FileName);
byte[] arqByte = new byte[Convert.ToInt32(fi.Length)];
fs = new FileStream(upArquivo.UploadedFiles[0].FileName, FileMode.Open, FileAccess.Read, FileShare.Read);
fs.Read(arqByte, 0, Convert.ToInt32(fi.Length));
// Atribui o arquivo em um objeto de valor que será gravado
objetoOv.Arquivo = arqByte;
}
else
{
objetoOv.ArquivoResolucaoConep = null;
}
//Se foi gravado com sucesso fecha a janela e atualiza a RadGrid
if (servico.Gravar(objetoOv))
{
// SUCESSO!
}
else
{
// FALHOU!
}O pulo do gato
Alem de alterarmos a configuração de envio dos arquivos no WCF temos que fazer o mesmo no ASPX, no arquivo web.config pois sem essa configuração, de nada adianta toda a configuração do WCF.
<configuration>
<system.web>
<httpRuntime maxRequestLength="2097151" executionTimeout="3600"/>
</system.web>
</configuration>Agora é só executar se site e testar com arquivos grande o envio do mesmo.
Neste mini-tutorial não me prendi a detalhes estruturais, apenas a pontos chaves para o envio de arquivos de grande por via WCF por meio de um website. Caso haja interesse dos leitores, posso postar artigos sobre conversão para leitura e gravação de arquivos via WEB, a partir de um banco de dados SQL, detalhes e algumas dicas.
Fica aí minha contribuição, e espero ter tempo de escrever mais. Quaisquer dúvidas, podem me enviar um e-mail ou postar suas dúvidas. Abração a todos!







