2010-01-05 23 views
5

Tengo problemas con Crystal Reports cuando uso gráficos e imágenes que usan CrystalImageHandler.aspx. La imagen no puede mostrarse y sospecho que esto se debe a un problema con el enrutamiento MVC.Crystal Reports Images y ASP.Net MVC

La ruta de la imagen trayectoria es similar a esto:

src = "/ crystalimagehandler.aspx dynamicimage = cr_tmp_image_a8301f51-26de-4869-be9f-c3c9ad9cc85e.png?"

Con la URL similar a esto:

localhost:? 01.234/ViewCrystalReports.aspx id = 50

La imagen no se puede encontrar de manera prudente porque está buscando en un directorio inexistente. ¿Cómo puedo cambiar la ruta en la que se encuentra CrystalImageHandler.aspx? Creo que si tuviera que hacer referencia desde la raíz, el problema se resolvería, pero cualquier cosa que cambie en Web.Config no funciona.

debo mencionar esto es en una página aspx convencional, no es una vista etc

+1

¿Puedes crear la imagen desde el código? Sería más fácil simplemente crear una página que generará la imagen en el controlador y la devolverá como un FileResult/StreamResult/WhateverResult. – Will

+0

Hola Damien, esto podría estar un poco fuera de tema, pero ¿cómo fue tu experiencia al usar MVC con Crystal Reports? Estamos a punto de crear una gran aplicación en MVC con algunos informes extensos. ¿Crees que es una solución viable? también usó informes en formularios web (al lado de mvc) o informes transmitidos en tiempo de ejecución? – neebz

+0

Posible duplicado de [CrystalImageHandler.aspx no encontrado] (http://stackoverflow.com/questions/11357854/crystalimagehandler-aspx-not-found) – bummi

Respuesta

2

descubierto. El enrutamiento estaba interfiriendo con el enlace CrystalImageHandler.aspx que se estaba generando. Global.aspx tiene la siguiente línea para decirle al motor de enrutamiento de ignorar archivos de recursos:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

pero esto no es un archivo de recursos convencionales, es un archivo aspx por alguna razón (Alguien sabe por qué?)

la adición de este arreglaron:

routes.IgnoreRoute("{resource}.aspx/{*pathInfo}"); 
2
public class CrystalImageHandlerController : Controller 
{ 
    // 
    // GET: /Reports/CrystalImageHandler.aspx 

    public ActionResult Index() 
    { 
     return Content(""); 
    } 

    protected override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 

     var handler = new CrystalDecisions.Web.CrystalImageHandler(); 
     var app = (HttpApplication)filterContext.RequestContext.HttpContext.GetService(typeof(HttpApplication)); 
     if (app == null) return; 

     handler.ProcessRequest(app.Context); 

    } 
} 

este controlador invocará el controlador. Simplemente agregue una ruta a esto como CrystalImageHandler.aspx, también se puede usar con cualquier ruta secundaria que desee (en este caso/informes). Algo que NUNCA podría hacer que el controlador haga a través de la configuración.

6

puedo solucionar este problema editando el archivo Web.Config

Inserte la siguiente línea:

<system.web> 
... 
<httpHandlers> 
    <add path="CrystalImageHandler.aspx" verb="GET" type="CrystalDecisions.Web.CrystalImageHandler, CrystalDecisions.Web, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"></add> 
</httpHandlers> 
... 

* tener cuidado con escribir su número de versión (versión = xx.x.xxxx.x)

+0

Necesitaba agregar dos cosas más para hacerlo funcionar. De alguna manera incluí Crystal en mi proyecto y agregó el httpHandler, pero agregó el siguiente bit al final: 'preCondition =" integratedMode, runtimeVersionv4.0' Cambié esto a runtimeVersion2.0 La otra cosa era la carpeta 'C : \ inetpub \ wwwroot \ aspnet_client \ system_web' tenía una carpeta para 2_0_50727, y dupliqué su contenido en 4_0_30319 Supongo que runtimeVersion2.0 se refiere al hecho de que CrystalDecisions.Web.CrystalImageHandler es un ensamblado .Net 2, mientras que el archivo La carpeta 4_0_30319 es referenciada por ASP.NET 4.0 – erict

0

Para ver en la máquina local, agregará el siguiente código en la configuración web

<httpHandlers> 
<add verb="GET" path="CrystalImageHandler.aspx" type="CrystalDecisions.Web.CrystalImageHandler, CrystalDecisions.Web,Version=10.2.3600.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" /> 
</httpHandlers> 

...............................

<appSettings>  
<add key="CrystalImageCleaner-AutoStart" value="true" /> 
<add key="CrystalImageCleaner-Sleep" value="60000" /> 
<add key="CrystalImageCleaner-Age" value="120000" />  
</appSettings> 

El código siguiente es para la visualización en el servidor

<system.webServer>  
<handlers>     
    <add name="CrystalImageHandler.aspx_GET" verb="GET" path="CrystalImageHandler.aspx" type="CrystalDecisions.Web.CrystalImageHandler, CrystalDecisions.Web, Version=10.2.3600.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" preCondition="integratedMode"/> 
</handlers> 
</system.webServer> 

:) voy a resolver ese problema en la adición de web.config

0

es porque el enrutamiento estaba interfiriendo con la crystalimagehandler.aspx.Entonces, en Global.asax o en el archivo routeConfig, podemos ignorar la ruta de los archivos de extensión .aspx. Puede ignorar la ruta de extensión .aspx agregando la siguiente línea.

routes.IgnoreRoute ("{allaspx}", nuevo {allaspx = @ ". .aspx (/.*)?"});

Cuestiones relacionadas