private static void ExecutarThreadSolicitacaoRelatorio(object dt, enumTipoSaidaRelatorio saida, ListItemCollection items, string nomeRelatorio, string nomeAmigavel, string diretorioDeUploadComArquivo, string nomeAleatorioDoArquivoParaUploadCriptografado, Usuario usuario, ManterSolicitacaoRelatorio manterSolicitacao, ManterFileServer manterFileServer, int quantidadeRegistro, object totalizador = null) { _thread = new Thread(() => { var solicitacao = new SolicitacaoRelatorio { DataSolicitacao = DateTime.Now, Nome = nomeRelatorio, NomeAmigavel = nomeAmigavel, Saida = saida.ToString(), Usuario = usuario, QuantidadeRegistros = quantidadeRegistro }; // Salvar pedido inicial, para consulta do status da solicitação do relatório. manterSolicitacao.Salvar(solicitacao); try { dynamic list = dt; dt = DataUtil.ToDataTable(list); var rv = WebFormHelper.GerarRelatorio(nomeRelatorio, dt, items, totalizador); // Obtém o arquivo. Super lento em relatórios grandes. Por isso está em uma Thread dããã, senhor óbvio var arquivoBytes = rv.LocalReport.Render(saida.ToString()); // Escrever o arquivo na pasta. File.WriteAllBytes(diretorioDeUploadComArquivo, arquivoBytes); FinalizarSolicitacaoRelatorio(nomeAmigavel, nomeAleatorioDoArquivoParaUploadCriptografado, manterSolicitacao, manterFileServer, solicitacao); Thread.CurrentThread.Abort(); } catch (ThreadAbortException) { // ignored } catch (Exception ex) { // Informa que houve falha na geração do relatório. solicitacao.Falha = true; solicitacao.Descricao = ex.ToString(); manterSolicitacao.Salvar(solicitacao); _thread.Abort(); } }) { IsBackground = true }; // Let the chaos COMMENCE! _thread.Start(); }
private static void FinalizarSolicitacaoRelatorio(string nomeAmigavel, string nomeAleatorioDoArquivoParaUploadCriptografado, ManterSolicitacaoRelatorio manterSolicitacao, ManterFileServer manterFileServer, SolicitacaoRelatorio solicitacao) { // Obtém o MIME da Request. var mime = ""; var extensao = ""; switch (solicitacao.ObterSaidaEnum()) { case enumTipoSaidaRelatorio.PDF: mime = "application/pdf"; extensao = "pdf"; break; case enumTipoSaidaRelatorio.WORD: mime = "application/msword"; extensao = "doc"; break; case enumTipoSaidaRelatorio.EXCEL: mime = "application/vnd.ms-excel"; extensao = "xls"; break; } var nomeOriginalArquivo = nomeAmigavel + "_" + solicitacao.DataSolicitacao.ToShortDateString() + "_" + solicitacao.DataSolicitacao.Hour.ToString().PadLeft(2, '0') + solicitacao.DataSolicitacao.Minute.ToString().PadLeft(2, '0') + "." + extensao; nomeOriginalArquivo = nomeOriginalArquivo.Replace(" ", "_"); // Prepara o cadastro do arquivo na tabela do Media Server. var fileServer = new FileServer { NomeDoArquivoNoServidor = nomeAleatorioDoArquivoParaUploadCriptografado, NomeDoArquivoOriginal = nomeOriginalArquivo, TipoArquivo = mime, MediaServer = true }; // Salva no FileServer. manterFileServer.IncluirFileServer(fileServer); solicitacao.Arquivo = fileServer; solicitacao.DataGeracao = DateTime.Now; // Salvar novamente, com o arquivo. manterSolicitacao.Salvar(solicitacao); }
private static void ExecutarThreadSolicitacaoRelatorioRequisicao(HttpWebRequest webRequest, enumTipoSaidaRelatorio saida, string nomeRelatorio, string nomeAmigavel, string diretorioDeUploadComArquivo, string nomeAleatorioDoArquivoParaUploadCriptografado, Usuario usuario, ManterSolicitacaoRelatorio manterSolicitacao, ManterFileServer manterFileServer, int quantidadeRegistro) { _thread = new Thread(() => { var solicitacao = new SolicitacaoRelatorio { DataSolicitacao = DateTime.Now, Nome = nomeRelatorio, NomeAmigavel = nomeAmigavel, Saida = saida.ToString(), Usuario = usuario, QuantidadeRegistros = quantidadeRegistro }; // Salvar pedido inicial, para consulta do status da solicitação do relatório. manterSolicitacao.Salvar(solicitacao); try { var myReq = webRequest; var myResp = myReq.GetResponse(); using (var stream = myResp.GetResponseStream()) { if (stream == null) { throw new Exception( "Stream nulo não pode ser utilizado para ler o relatório. Tente novamente."); } using (var ms = new MemoryStream()) { int count; do { var buf = new byte[1024]; count = stream.Read(buf, 0, 1024); ms.Write(buf, 0, count); } while (stream.CanRead && count > 0); // Escrever o arquivo na pasta. É aqui que a mágica acontece. File.WriteAllBytes(diretorioDeUploadComArquivo, ms.ToArray()); } } FinalizarSolicitacaoRelatorio(nomeAmigavel, nomeAleatorioDoArquivoParaUploadCriptografado, manterSolicitacao, manterFileServer, solicitacao); Thread.CurrentThread.Abort(); } catch (ThreadAbortException) { // ignored } catch (Exception ex) { // Informa que houve falha na geração do relatório. solicitacao.Descricao = "Erro ao escrever " + diretorioDeUploadComArquivo + " - Mensagem de erro: " + ex; solicitacao.Falha = true; manterSolicitacao.Salvar(solicitacao); _thread.Abort(); } }) { IsBackground = true, Name = nomeRelatorio + Guid.NewGuid() }; // Let the chaos COMMENCE! _thread.Start(); }