ASP.NET图表控件在生产服务器上无法工作

8
我有一个应用程序,其中图表功能非常重要。目前,在ASP.Net开发服务器上可以正常工作,但是当我尝试将其发布到我的服务器上(Win 2008 Server R2,IIS 7)时,图表就无法显示。

使用Firebug调试工具,我发现对ChartImg.axd的调用返回了404错误,并且在IE中只能看到空白的图像占位符,在Firefox中则什么也没有。我已经搜索了大约3或4个小时,尝试了推荐的几乎所有方法,但似乎都没有起作用。

我想使用memory/HttpImageHandler而不是ImageLocation配置。

以下是我的Web.Config:

    <appSettings>
    <!--<add key="ChartImageHandler" value="storage=file;timeout=20;dir=c:\TempImageFiles\;" />-->
    <add key="ChartImageHandler" value="storage=memory;timeout=20;deleteAfterServicing=false" />
  </appSettings>
  <system.webServer>
    <handlers>
      <remove name="ChartImageHandler" />
      <add name="ChartImageHandler" preCondition="integratedMode" verb="GET,HEAD,POST"
        path="ChartImg.axd" type="System.Web.UI.DataVisualization.Charting.ChartHttpHandler, System.Web.DataVisualization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
    </handlers>
  </system.webServer>
  <system.web>
    <httpHandlers>
      <add path="ChartImg.axd" verb="GET,HEAD,POST" type="System.Web.UI.DataVisualization.Charting.ChartHttpHandler, System.Web.DataVisualization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
        validate="false" />
    </httpHandlers>
    <pages>
      <controls>
        <add tagPrefix="asp" namespace="System.Web.UI.DataVisualization.Charting"
          assembly="System.Web.DataVisualization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
      </controls>
    </pages>
    <compilation debug="true" targetFramework="4.0">
      <assemblies>
        <add assembly="System.Web.DataVisualization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
      </assemblies>
    </compilation>
    <customErrors mode="Off"/>
  </system.web>

有没有人有任何想法,我在服务器上做错了什么导致它不能工作?


你为什么不使用Fusion Charts呢?它非常棒而且免费。 - Bastardo
@bastardo 现在不行。请查看 http://www.fusioncharts.com/goodies/fusioncharts-free/。 - Zerotoinfinity
6个回答

6

我找到了解决问题的方法,但我认为我的问题是由于代码运行方式特定引起的。

一旦我在ChartImageHandler的appSettings下设置了privateImages=false,我的图片就可以正常显示,使用文件存储的ImageLocation或内存存储的HttpHandler都可以。

我查看了这里的列表,意识到我的代码没有以下任何内容:

  • 身份验证
  • SessionID
  • AnonymousID

因此,隐式默认设置privateImages=true阻止了我下载图片。当我将privateImages=false设置后,就没有问题了,图表也可以正常工作。我将应用程序设置为使用Windows身份验证,并设置privateImages=true,现在我的图表已经使用Image Location设置或HttpHandler设置生成了。

希望这有所帮助。我知道我花了很长时间四处搜寻,却毫无进展。


2

这个配置对我有效。你需要将内存用作存储。

< add key="ChartImageHandler" value="storage=memory;deleteAfterServicing=true;timeout=20;"/>

我知道这篇文章有些老了,但你能告诉我你在哪里插入了上面那行代码吗?谢谢。 - htm11h
在 App.Config 文件中的 <appSettings> 部分。 - Dave Lucre
我认为这是真正的答案。问题似乎在于,如果您将存储保留其默认值(“file”),则处理程序会尝试创建一个文件并将其提供给客户端。如果用户没有权限在 char image 处理程序应用设置中指定的服务器位置上创建文件,则整个过程将失败。但是我们可能希望服务器在内存中创建图像,并从那里向客户端提供它。无需创建物理文件,避免出现文件授权问题。 - user4843530

1

看起来像是安全/权限问题。您是否将图表保存到本地文件夹,然后为IIS用户和/或网络服务用户分配该文件夹的写入权限。


尽管我试图不使用图像位置,但我确实为我的c:\TempImageFiles\文件夹授予了网络服务修改权限,并且图像确实被放置在该文件夹中,这让我相信它按预期工作,但它们没有出现在我的应用程序中。当我这样做时,仍然似乎会出现404错误。 - Adam
尝试在您的IIS文件夹下创建“tempimagefile”文件夹,并尝试直接从Web访问它,例如“www.yourdomain.com/Tempimagefile/char.jpg”,看看是否有效。然后在您的网页中使用此位置。 - dpac
或者,在应用程序设置中更改ChartImageHandler规格,以在内存中创建图像而不是文件。 - user4843530

0

试试这个,它已解决了 web.config 运行时错误的问题

<pre>
<add key="ChartImageHandler" value="storage=memory;timeout=20;deleteAfterServicing=true;Url=~\temp\"

/>


0
  <controls>
        <add tagPrefix="asp" namespace="System.Web.UI.DataVisualization.Charting"
          assembly="System.Web.DataVisualization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
  </controls>

尝试这个:将 Version=4.0.0.0 更改为 Version=3.5.0.0。

这只适用于您使用 .Net 3.5,是吗? - Dave Lucre

0

在您的 Web 服务器上安装 Microsoft Chart Controls 或尝试以下方法:

ASP.Net Chart Control On Shared Hosting Environment

同时,在 IIS 7 下运行时,请检查您的 web.config 中是否已在 system.webServer 中注册了 HttpHandler。


我相信图表控件已经内置在.NET 4.0框架中。在IIS管理器中的处理程序映射下,该处理程序存在于应用程序的列表中。 - Adam

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