none
Bajar Archivo ASP.Net / ASMX / Jquery Ajax RRS feed

  • Pregunta

  • Hola Amigos,

    1.- Creo un reporte en excel con excelpackage - epplus y retorno un arreglo de bytes

    2.- Desde El ASMX(Es Mi vinculo entre mis javascript y asp.net) hago lo siguiente

    listaDocumentos = (List<DocumentosEO>)System.Web.HttpContext.Current.Session["ConsultaDocumentos"];
    
                    paramsExc = new ExcelParamsEO();
                    paramsExc.Autor = HelperITO.ExcelAut;
                    paramsExc.TituloExcel = HelperITO.ExcelRep;
                    paramsExc.NombreArchivo = HelperITO.ExcelArc + DateTime.Now.ToString("ddMMMyyyy") + ".xlsx";
                    paramsExc.NombreHoja = HelperITO.ExcelHoj + DateTime.Now.ToString("ddMMMyyyy");
                    paramsExc.NombreReporte = HelperITO.ExcelRep;
    
                    if (listaDocumentos.Count > 0)
                    {
                        archivoResult = GeneraExcelBO.GeneraExcel<DocumentosEO>(paramsExc, listaDocumentos);
    
                        if (!archivoResult.TieneError)
                        {
                            System.Web.HttpContext.Current.Response.Clear();
                            System.Web.HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
                            System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + paramsExc.NombreArchivo);
                            System.Web.HttpContext.Current.Response.BinaryWrite(archivoResult.Archivo);
    
                            jsonResultado = new GenericaEO();
                            jsonResultado.TieneError = resultado.TieneError;
                            jsonResultado.Mensaje = "Se Ha Generado Correctamente El Reporte En Excel De Transacciones";
                            jsonResultado.Contenido = resultado.Resultado.Count.ToString();
                        }
                        else
                        {
                            jsonResultado = new GenericaEO();
                            jsonResultado.TieneError = true;
                            jsonResultado.Mensaje = archivoResult.Mensaje;
                            jsonResultado.Contenido = resultado.Resultado.Count.ToString();
                        }
                    }
                    else
                    {
                        jsonResultado = new GenericaEO();
                        jsonResultado.TieneError = true;
                        jsonResultado.Mensaje = "No Se Encontraron Registros Para Los Criterios De Búsqueda Ingresados.";
                        jsonResultado.Contenido = resultado.Resultado.Count.ToString();
                    }

    3.- Devuelvo un json diciendo que se genero o no

    4.- Jquery me devuelve error en Token P Json y nunca me descarga archivo

    Pueden ayudarme con esto?


    • Editado Don Nestorin jueves, 31 de agosto de 2017 14:37 Ingreso Mas Codigo
    jueves, 31 de agosto de 2017 14:12

Todas las respuestas

  • 3.- Devuelvo un json diciendo que se genero o no

    Pero con las líneas de código que has mostrado no estás devolviendo un JSON. Estás devolviendo en binario el contenido del archivo. Ese contenido binario casi con toda seguridad no será un JSON, por lo que no es de extrañar que jquery se queje de que no puede deserializarlo.
    jueves, 31 de agosto de 2017 14:27
  • 3.- Devuelvo un json diciendo que se genero o no

    Pero con las líneas de código que has mostrado no estás devolviendo un JSON. Estás devolviendo en binario el contenido del archivo. Ese contenido binario casi con toda seguridad no será un JSON, por lo que no es de extrañar que jquery se queje de que no puede deserializarlo.

    Cuando Realizo Pruebas Se va por ql bloque de OK o sea (HelperITO.Serializa(jsonResultado)

    *

    "Se Ha Generado Correctamente El Reporte En Excel De Transacciones SRI";

    *


    jueves, 31 de agosto de 2017 14:36
  • Si se sale lo de "Se Ha Generado Correctamente El Reporte ..." quiere decir que previamente ha ejecutado las líneas de código que hay encima. Y una de esas líneas es

    System.Web.HttpContext.Current.Response.BinaryWrite(...)

    Con esa línea se machaca el Response y se inyectan en la respuesta los datos binarios, con lo que esa respuesta que se devuelve al navegador ya no se podrá deserializar como JSON, con independencia de cualquier cosa que devuelvas en otro sitio del programa.

    jueves, 31 de agosto de 2017 17:27
  • Y como podría descargar mi excel y mostrar la respuesta de que ha sido un exito?

    Néstor Dávila Muñoz

    jueves, 31 de agosto de 2017 18:55
  • Si quieres hacerlo con una única llamada al servidor, entonces por ejemplo podrías devolver el binario del fichero en el Response, tal como lo estás haciendo, y el éxito/fallo devolverlo en el Status de HTTP (Si tiene éxito la generación del fichero, se devuelve un 200 OK en el status y el cuerpo del Response trae el binario del fichero; si algo falla, se devuelve un Status 500 Internal Error, y el cuerpo del Response trae el mensaje con la explicación del error).

    Esto implica que no hay JSON por ninguna parte. Desde la llamada con el ajax de jquery te llega el "data" con el binario si hay un "success", y te llega el data con el mensaje de error si hay un "error".

    En el lado servidor, te quedaría más limpio con un .ashx que con el .asmx. Basta que pongas el fichero en el Response.BinaryWrite, como ya estás haciendo, y que en el Response.Status y .StatusCode pongas el valor correspondiente para éxito/error.

    jueves, 31 de agosto de 2017 20:25
  • Entocnes Cuando ME Caiga Por Error Valido el 200 u OK?


    Néstor Dávila Muñoz

    jueves, 31 de agosto de 2017 20:40