2009-04-30 3 views
1

バイト配列のコレクションの形で未知の量のイメージを返すWebサービスを呼び出しています。 (私はこれを変更することはできません)バイト配列から派生したイメージをページ上に動的に表示する

それぞれの画像を単一の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 

これを達成するための最もエレガントな方法は何ですか?

任意の入力歓迎!!!

EDIT:追加情報;

  • Webサービスからのイメージは、SQL Reporting Servicesからの です。
  • 通常、画像は常に になります(実際にはキャッシングの必要はありません。 )。
  • 画像はユーザー固有のものです。
  • Webサービスは1ページにつき1回しか呼び出されません。私は実際に生成 画像後 セッション状態から画像を廃棄してい
  • 画像が しばらく再び見られることを を必要とされないので、それを使用しています。

答えて

1

data: URIスキームを使用して、画像データをページソースに直接埋め込むことができます。 Here's the Wikipedia description。それはあなたの状況のた​​めに容認できないかもしれないかもしれない8までのIEバージョンでは動作しません。

+0

ああ、IE <8号問題は私を気にしなかった。 – GordonB

+0

うまく機能しています.... IEの唯一の問題は、データURIのサイズ制限です。 Convert.ToBase64String(imageToDisplay).Length <32768など – GordonB

2

ページリクエストごとに1回だけウェブサービスを呼び出すとします。実際には、何らかの形でバイト配列をキャッシュするとよいでしょう。そのため、ユーザーがページから離れて戻ってきた場合に、Webサービスが再度呼び出されることはありません。その場合、バイト配列をセッションに保存することは避けられません。 GeneratedImageコントロールを使用しなかった場合でも、バイト配列をどこかに保存する必要があります。

大きなセッションについてのご心配をお伝えします。アプリケーションの詳細に基づいて、アプリケーションを回避するためにできることがいくつかあります。すべての画像が1人のユーザーを参照しているのですか、またはいくつかの画像がユーザー間で共有されていますか?画像は頻繁に変わるのですか?すべての画像が1人のユーザーに属し、頻繁に変更される場合は、セッションに保存することが唯一の解決策です。一部のユーザーがイメージを共有したり、イメージが頻繁に変更されることが予想されない場合は、WebサービスとWebアプリケーションの間にプロキシを作成できます。プロキシは、イメージをメモリまたはデータベース(またはファイルシステム)に保存し、URLマッピングを使用してイメージをリソースとして使用できるようにします。このマッピングは、アプリケーションの内部構造に基づいて定義する必要があります。あなたはまた、可能な画像の数を返すようにURLを作成する必要が

http://imageproxy/username/photo123123 

http://imageproxy/username/imagecount 

GeneratedImageコンポーネントを使用する必要はないであろうことは、このようなものである可能性があります。標準のimgタグを使って簡単にページのhtmlソースを構築できます。

+0

Webサービスからのイメージは、SQL Reporting Servicesからのものです。画像は一般的に常に変化しています。画像はユーザー固有のものになります。 Webサービスは1ページにつき1回しか呼び出されません。キャッシングは良いアイデアかもしれない、私はちょうど非常に短い時間のためにweb.cachingを使用するかもしれない。 私は実際には、生成されたイメージがそれを使用した後にセッション状態からイメージを廃棄します。イメージはしばらくの間、再度表示する必要はないでしょう。 – GordonB

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"に設定すると、イメージが表示されます。

複数のイメージがあるので、コントロールを作成して、複数のインスタンスを作成する必要があります。各インスタンスは対応するバイト配列を渡します。

+0

以前はデータベースから画像を表示するためにこのメソッドを使用していましたが、最初は画像を表示するための「より良い」方法を見つけたかったので、microsoft.generatedimageコントロール....その欠点もある。 – GordonB