2010-01-04 139 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