水晶报表中的图片和ASP.Net MVC

5
我在使用图表和图片时遇到了Crystal Reports的问题,这些图表和图片使用了CrystalImageHandler.aspx。图片无法显示,我怀疑这是由于MVC路由的问题。
图片路径类似于:
src="/CrystalImageHandler.aspx?dynamicimage=cr_tmp_image_a8301f51-26de-4869-be9f-c3c9ad9cc85e.png"
URL类似于: localhost:01234/ViewCrystalReports.aspx?id=50
由于它正在查找不存在的目录,所以找不到图片。我该如何更改CrystalImageHandler.aspx的位置?我认为如果我从根目录引用,问题就会解决,但是我在Web.Config中进行的任何更改都无法生效。
需要说明的是,这是一个传统的aspx页面,而不是视图等。

1
你能否通过代码创建图像?也许更容易的方法是创建一个页面,在处理程序中生成图像并将其作为FileResult/StreamResult/WhateverResult返回。 - user1228
你好,达米安。这可能略微偏离主题,但是你使用MVC和Crystal Reports的经验如何?我们正要在MVC上创建一个大型应用程序,并进行一些广泛的报告。你认为这是一个可行的解决方案吗? 此外,你是否在WebForms中使用了报告(与MVC并排)或在运行时流传递报告? - neebz
可能是[CrystalImageHandler.aspx未找到]的重复问题 (https://dev59.com/-WXWa4cB1Zd3GeqPQcth)。 - bummi
5个回答

7
我通过编辑Web.Config文件解决了这个问题。
请插入以下一行内容:
<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>
...

请注意在编写您的版本号时进行正确填写(Version=xx.x.xxxx.x)。

我需要添加两个东西才能让它正常运行。我不知怎么把Crystal包含在我的项目中,并且它添加了httpHandler,但是在结尾处添加了以下内容:preCondition="integratedMode,runtimeVersionv4.0"。我将其更改为runtimeVersion2.0。另一件事是文件夹C:\inetpub\wwwroot\aspnet_client\system_web中有一个2_0_50727的文件夹,我将其内容复制到了4_0_30319中。我认为runtimeVersion2.0指的是CrystalDecisions.Web.CrystalImageHandler是一个.NET 2程序集,而文件夹4_0_30319被ASP.NET 4.0引用。 - erict

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

    }
}

该控制器将调用处理程序。只需将路由添加为CrystalImageHandler.aspx,它也可以与您想要的任何子路径一起使用(在这种情况下为/reports)。这是我无论如何都无法通过配置让处理程序执行的操作。

2
我搞定了。路由与生成的CrystalImageHandler.aspx链接发生了干扰。Global.aspx文件中有以下代码行,用于告诉路由引擎忽略资源文件:
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

但这不是传统的资源文件,出于某种原因,它是一个aspx文件(有人知道为什么吗?)

添加这个修复了问题:

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

0

要在本地机器上查看,您需要在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>

以下代码用于在服务器上显示

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

:) 我会在 web config 中解决那个问题


0

这是因为路由与CrystalImageHandler.aspx发生了冲突。因此,我们可以在Global.asax或routeConfig文件中忽略.aspx扩展名的路由。您可以通过添加以下行来忽略.aspx扩展名路由。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接