2010-01-04 63 views
0

我有一个Web应用程序,用户可以在其中配置报告(ASP.NET MVC,无Reporting Services或任何其他)。然后该配置被表示为以JSON形式发送到服务器的JavaScript对象,以检索数据并实际生成报告。提交HTML外观与此类似:在网页中包含动态图像

<form method="post" action="/RenderReport" target="_blank"> 
    <input type="hidden" name="reportJson"/> 
</form> 

这很适合在新的浏览器窗口中打开报告。但是,在本报告中,我想包含从数据中生成的图像。这怎么能以好的方式完成?想到的显而易见的方式是:

  1. 嵌入在URL中生成图像所需的元数据,如<img src="/GenerateImage/?metadata1=2&metadata2=4"/>。然而,这不起作用,因为元数据很可能使URL在IE中超过2083个字符。
  2. 使用ajax POST请求,然后当响应返回时,创建一个图像元素,如<img src="data:image/png;base64,{data_in_json_response}"/>。但这是不可能的,因为我的应用程序必须在不支持数据URI的IE6中工作。
  3. 生成图像,同时生成报告,为每个图像创建一个唯一键,然后使用<img src="/GetCachedImage?id=23497abc289"/>格式的URL。这是我目前最好的想法,但确实会引发图像缓存的问题。我能想到的地方是:

    • 在会话中。优点:当会话被放弃时,缓存的项目会自动删除。缺点:访问会话会在一个会话中序列化对页面的访问。对我而言这很糟糕。
    • 在数据库中:优点:运作良好。缺点:不必要的开销,缓存的项目必须删除一段时间。
    • 在Application/Cache对象中。我没有真正考虑过这个的所有优点和缺点。

    它也引发了何时删除缓存项目的问题。如果在图像显示后立即将其删除,看起来页面无法刷新或打印,图像不会变为红色。其他选项意味着额外的复杂性。

这个问题怎么解决好,或者至少有一个不坏?

回答

0

你可以很容易地做一个旋转磁盘缓存的图像...谷歌“ASP.NET图像调整模块”,源代码包括一个磁盘缓存模块可配置的大小。

然而,

如果报告是HTML,并包含图像引用,你不知道还要多久该报告将游逛的方式。这些图像可能会永远需要......说某人复制并粘贴到电子邮件中......这些链接将继续存在,并在清除缓存时突然中断。

+0

我宁可不写文件,因为这会导致更多的维护问题(这将是写入文件的应用程序中的唯一位置)。 关于图像需要永久保留的好处,我想我必须通过返回一个图像说“抱歉,不起作用”而不是在提供错误密钥时返回500错误来解决此问题。 – erikkallen 2010-01-04 23:00:50

0

如果您只有一台服务器,则可以使用混合方法。创建一个缓存图像字典,其中“字符串”是您的示例中的ID值。对象是您需要创建图像的参数集合。然后,您可以向yourserver/generate/image/123456发出请求并返回相应的类型。

这不适用于服务器场,除非您有一些方法可以共享代表参数的“对象”。你仍然必须以某种方式清理这本字典,否则就冒着无限制的增长风险。

+0

这接近于使用Application对象来存储密钥。 – erikkallen 2010-01-04 22:58:55