2009-04-30 61 views
1

我正在調用一個webservice,它以字節數組的形式返回未知數量的圖像。 (我不能改變這一點)在頁面上動態顯示從字節數組派生的圖像

我需要在一個aspx網頁上顯示每個圖像。

我目前使用的是Microsoft.Web.GeneratedImage控件; http://www.codeplex.com/aspnet/Release/ProjectReleases.aspx?ReleaseId=16449 顯示圖像。

我遇到的問題是,由於控件調用一個單獨的代碼文件來加載圖像內容,我使用會話狀態來存儲bytearray,我不是過分高興。

下面是我測試項目中的一些代碼;

 Private Sub btnGetChart_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnGetChart.Click 
    Dim reportHub As New HubWrapper 

    Dim repCharts() As ReportHub.Chart = reportHub.ReportHubChart(Me.ddlReports.SelectedValue, ViewState("params")) 

    For Each chart As ReportHub.Chart In repCharts 
     Dim sessionKey As String = "img" & System.Guid.NewGuid().ToString 

     Dim imgParam As New Microsoft.Web.ImageParameter() 
     imgParam.Name = "sessionVar" 
     imgParam.Value = sessionKey 

     Session(sessionKey) = chart.ChartData 

     Dim img As New Microsoft.Web.GeneratedImage 
     img.ImageHandlerUrl = "~/chartImageHandler.ashx" 
     img.Parameters.Add(imgParam) 

     phChart.Controls.Add(img) 
    Next 
    End Sub 

<%@ WebHandler Language="VB" Class="chartImageHandler" %> 

Imports System 
Imports System.Collections.Specialized 
Imports System.Drawing 
Imports System.Web 
Imports Microsoft.Web 

Public Class chartImageHandler 
    Inherits ImageHandler 

    Implements IRequiresSessionState 

    Public Sub New() 
    MyBase.New() 
    'Set caching settings and add image transformations here 
    'EnableServerCache = True 

    End Sub 

    Public Overrides Function GenerateImage(ByVal parameters As NameValueCollection) As ImageInfo 
    Dim byteArry As Byte() = CType(HttpContext.Current.Session(parameters("sessionVar")), Byte()) 

    HttpContext.Current.Session.Remove(parameters("sessionVar")) 

    Return New ImageInfo(byteArry) 

    End Function 
End Class 

什麼是實現這一目標的最優雅的方式?

任何輸入歡迎!

編輯:其他信息;

  • 來自web服務的圖像是來自SQL Reporting Services的 。
  • 圖像一般會變化 所有時間都在變化(沒有真正的 緩存要求)。
  • 圖像將是用戶特定的。
  • webservice每頁僅調用一次。
  • 我從 會話狀態的產生 圖像後實際處置圖像的使用它,因爲不會 所需的圖像獲得 而再次觀看。

回答

1

您可以使用data: URI方案將圖像數據直接嵌入到頁面源中。 Here's the Wikipedia description。這不適用於8之前的IE版本,這可能會導致您的情況無法接受。

+0

哦,IE <8的問題沒有打擾我。 – GordonB 2009-05-15 07:27:52

+0

工作很好.... IE唯一的問題是數據uri的大小限制。 Convert.ToBase64String(imageToDisplay).Length <32768 etc等 – GordonB 2009-05-15 09:56:51

2

我想你只想每頁請求調用一次你的web服務。實際上,以某種方式緩存字節數組會很好,這樣在用戶暫時離開頁面然後又回來的情況下,Web服務不會再被調用。在這種情況下,在會話中保存字節數組是不可避免的。如果你沒有使用GeneratedImage控件,你仍然需要將字節數組保存在某個地方。

我瞭解您對大型會議的擔憂。根據你的應用程序的細節,你可以做一些事情來避免它。所有圖像是指單個用戶還是一些圖像在用戶之間共享?圖像經常變化嗎?如果所有圖像屬於單個用戶並經常更改,則將其保存在會話中是唯一的解決方案。但是,如果有些用戶共享圖像或圖像預計不會頻繁更改,則可以在Web服務和Web應用程序之間創建代理。代理會將圖像保存在內存或數據庫(或者文件系統)中,並通過URL映射將它們作爲資源提供。您需要根據應用程序的內部定義此映射。這可能是這樣的:

http://imageproxy/username/photo123123 

您還需要創建一個URL返回可用圖像的數量:

http://imageproxy/username/imagecount 

將沒有必要使用GeneratedImage組件。您可以使用標準img標籤輕鬆構建頁面的html源代碼。

+0

來自web服務的圖像來自SQL Reporting Services。圖像通常會一直在變化。圖像將是用戶特定的。 網頁服務每頁僅調用一次。緩存可能是一個好主意,我可能會在很短的時間內使用web.caching。 我實際上是在生成的圖像使用它之後從會話狀態中處理圖像,因爲希望不需要再次查看圖像。 – GordonB 2009-05-14 08:09:14

0

在asp.net中,您可以直接使用響應對象編寫圖像,並且主要的瀏覽器將能夠顯示它。但是你不能傳遞一個字節數組,你需要傳遞一個內存流。

讓你System.Web.HttpContext

Dim ms as New Io.MemoryStream(yourarray) 
httpcontext.Response.OutputStream.Write(ms.ToArray,0,ms.Length) 

你把在display.aspx頁,如果「yourarray」是代表一個圖像瀏覽器將顯示它的字節數組。

然後,您可以在任何頁面上使用圖像控件(甚至是純HTML),並將圖像源設置爲「display.aspx」,您的圖像將顯示出來。

現在,由於您有多個圖像,您可能需要創建一個控件併爲其創建多個實例,每個圖像傳遞一個對應的字節數組。

相關問題