lunes, 6 de febrero de 2012

CoreHandler .ashx, Controladores Personalizados WebReportViewer

Hoy les comparto una forma de generar Controladores personalizados, este tema esta ligado a Datadynamics debido a que el "WebReportViewer", o el visor de reportes web. ¿por qué?. Este control de GrapeCity us un core handler para el manejo de eventos y según lo entiendo, lo usa también como archivo de recursos para imágenes y cultura (Quizás otras cosas más), entonces debido a múltiples inconvenientes que podrían ocurrirle (como a mí), presento una compilación de información que me ha ayudado a sacar adelante algunos de los posibles problemas que vas a encontrar.

Al adicionar un control WebReportViewer, tendremos que adicionar un controlador, normalmente llamado "CoreHandler.ashx", cuyo contenido es el siguiente:

<% @ WebHandler language="C#" class="DataDynamics.Reports.Web.CoreHandler, DataDynamics.Reports.Web, Version=1.6.2084.14, Culture=neutral, PublicKeyToken=A597G2F42D260XS3" codebehind="CoreHandler.cs" %>

Muchas veces este código es suficiente para que el control pueda ubicar el controlador; los datos que vemos como version, culture, token lo obtenemos del mismo web.config en la sesión de assemblies.

Otra manera que he encontrado es usando este codigo dentro del dentro del web.config en una etiquta httphandler, por ejemplo:

<% add verb="GET" path="Page/CoreHandler.ashx" type="DataDynamics.Reports.Web.CoreHandler, DataDynamics.Reports.Web, Version=1.6.2084.14, Culture=neutral, PublicKeyToken=D557F2F30A260DA2"  %>

además de localización dentro de las etiquetas de configuration, también dentro del web.config
        
 <location path="CoreHandler.ashx">
    <system.web >
      <authorization>
        <allow users="*"/>
      </authorization>
    </system.web>
  </location>


Aún así es posible que tengas un problema en el que actualmente estoy trabajando, y se trata que al correr la aplicación y todo parece correr perfectamente, al generar el reporte este carga, pero las imágenes que van dentro del reporte no aparecen.  Es decir que el src de la imagen es incorrecto y nos encontramos algo parecido a esto:




Al inspeccionar las imágenes el src debería tener la siguiente estructura:

src=/misitio/CoreHandler.ashx?rs:Command=GetResourceItem&ResourceName=Plus.PNG       

pero en mi código al inspeccionar lo encuentro así:

src=/CoreHandler.ashx?rs:Command=GetResourceItem&ResourceName=Plus.PNG       

es decir que está buscando el corehandler.ashx en la raiz de mi localhost y porsupuesto que JAMÁS lo va a encontrar. En los foros de datadynamics se encuentra el siguiente foro  creado en el 2004 y aceptando el error como propio de Datadynamics y cuya solución debía salir en el siguiente release; pues para la fecha de hoy (año 2012, cerca del fín del mundo) y teniendo la última versión me sucede lo mismo. Lo cierto es que la versión anterior si muestra las imágenes correctamente, por lo que he venido pensando que hay alguna configuración que he hecho mal, pero sé con certeza que hallaremos una solución, así sea muy recursiva.

Por lo pronto les comparto un tutorial del tema de los manejadores que podría darle una luz para hallar la solución.....  ///parece que ya puedo ofrecerles una ayuda !!!



Aunque siendo sincero no es la mejor de las opciones fue una "práctica" que me ingenié para solucionar este tedioso error, pero igual hasta conseguir la correcta les comparto mi solución:


Se trata de una función javascript con la cual buscamos las imágenes dentro del iframe que carga el reporte; obteniendo el nombre de nuestro sitio "path", buscamos las imágenes que no tenga este path dentro de su src, entonces les creamos una nueva url con nuestro path y se lo adicionamos a su src. La función es la siguiente:



function CorregirImagenes()
         <               
            // obtiene el nombre de nuestro sitio
            var path =  '<%=Context.Request.ApplicationPath %>'; 
            // Obtiene el iframe donde se presenta el reporte
            var ifReport = document.getElementById('CorePanelWebReportViewer1$coreViewer');
           // obtiene el document del iframe
            var doc =  ifReport.contentDocument || ifReport.contentWindow.document;
           // obtiene el body del iframe
            var iFContent = doc.body; 
            // obtiene todas las imágenes dentro del body, es decir las img del reporte
            var imagenes = iFContent.getElementsByTagName('img');
               for( i=0; i < imagenes. length; i++)
                <    
                    var imagen = imagenes[i].src;
                    var urlimg = imagen.split("/");
                    // debido a que la url de la imagen viene con "/" (http://localhost/sitio/corehandl**), hacemos un split y buscamos en la posición 4 el nombre del sitio, es decir [3], esto nos devolvería la palabra "sitio", si esto es DIFERENTE a nuestro path "/sitio" (al cual le hacemos un substring para compararlo si el "/"), entonces le añadimos nuestro path.
                    if(urlimg[3] != path.substring(1,path.length))
                     <   
                        var newurl = imagen.substring(0, imagen.indexOf("/CoreHandler")) + path +              imagen.substring(imagen.indexOf("/CoreHandler"), imagen.length);                       
                       
                        imagenes[i].src = newurl;                  
                    >
               >           
            return false;
        >



Una vez entendida la función, lo que debemos hacer es implementarla a través de un evento después de cargado el reporte, y aunque a mí nunca me funcionó les comparto este blog para que tengan mejor idea de como lograrlo.


Debido no encontrar forma de implementar mi función para corregir el src de estas imágenes, opté por implementar con la ayuda de mi compañero una función en el HOVER del DIV del Reporte, y obtenemos un solución casi transparente para el usuario.


Espero les funcione...

No hay comentarios:

Publicar un comentario