2010-01-05 21 views
5

Si verificano problemi con Crystal Reports quando si utilizzano grafici e immagini che utilizzano CrystalImageHandler.aspx. L'immagine non può essere visualizzata e presumo che ciò sia dovuto a un problema con il routing MVC.Immagini di report Crystal e ASP.Net MVC

Il percorso dell'immagine percorso è simile a questo:

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

con l'URL simile a questo:

localhost:/ViewCrystalReports.aspx id = 50

L'immagine non può essere trovata prontamente perché sta guardando in una directory inesistente. Come posso modificare il percorso di CrystalImageHandler.aspx in? Penso che se dovessi fare riferimento alla radice il problema sarebbe risolto, ma tutto ciò che cambio in Web.Config non funziona.

Devo dire questo è in una pagina aspx convenzionale, non una vista ecc

+1

È possibile creare l'immagine dal codice? Potrebbe essere più facile creare semplicemente una pagina che genererà l'immagine nel gestore e restituirla come un FileResult/StreamResult/WhateverResult. – Will

+0

Ciao Damien, potrebbe essere leggermente fuori tema, ma qual è stata la tua esperienza con MVC con Crystal Reports? Siamo sul punto di creare un'enorme applicazione su MVC con alcuni rapporti estesi. Pensi che sia una soluzione praticabile? hai utilizzato report in Webform (parallelamente a mvc) o report in streaming in fase di esecuzione? – neebz

+0

Possibile duplicato di [CrystalImageHandler.aspx non trovato] (http://stackoverflow.com/questions/11357854/crystalimagehandler-aspx-not-found) – bummi

risposta

2

capito. Il routing stava interferendo con il collegamento CrystalImageHandler.aspx che veniva generato. Global.aspx ha la seguente riga per dire al motore di routing di ignorare i file di risorse:

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

ma questo non è un file di risorse convenzionali, è un file aspx per qualche motivo (qualcuno sa perché?)

aggiungendo questo ha riparato:

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); 

    } 
} 

questo controller sarà richiamare il gestore. Basta aggiungere un percorso a questo come CrystalImageHandler.aspx, può anche essere utilizzato con qualsiasi percorso secondario desiderato (in questo caso/report). Qualcosa che non potrei MAI far fare al gestore tramite la configurazione.

6

posso risolvere questo problema modificando il file Web.Config

Inserire la seguente riga:

<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> 
... 

* prendersi cura con scrivere il numero di versione (versione = xx.x.xxxx.x)

+0

Avevo bisogno di aggiungere altre due cose per farlo funzionare. In qualche modo ho incluso Crystal nel mio progetto e aggiunto httpHandler, ma alla fine ho aggiunto il seguente bit: 'preCondition =" integratedMode, runtimeVersionv4.0' Ho cambiato questo in runtimeVersion2.0 L'altra cosa era la cartella 'C : \ inetpub \ wwwroot \ aspnet_client \ system_web' aveva una cartella per 2_0_50727 e ne ho duplicato il contenuto in 4_0_30319 Presumo che runtimeVersion2.0 si riferisca al fatto che CrystalDecisions.Web.CrystalImageHandler è un assembly .Net 2, mentre il file la cartella 4_0_30319 è referenziata da ASP.NET 4.0 – erict

0

Per visualizzare nel computer locale, aggiungere il seguente codice nella configurazione 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> 

Il seguente codice è per la visualizzazione dei server

<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> 

:) io risolvere il problema in aggiunta in web config

0

E 'perché il percorso è stato interferire con il CrystalImageHandler.aspx.Quindi nel file Global.asax o routeConfig possiamo ignorare il percorso per i file di estensione .aspx. È possibile ignorare il percorso di estensione .aspx aggiungendo la seguente riga.

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

Problemi correlati