1

バイト配列のコレクションの形式で未知の量の画像を返すWebサービスを呼び出しています。(これは変更できません)

各画像を単一のaspxWebページに表示する必要があります。

現在、Microsoft.Web.GeneratedImageコントロールを使用しています。 http://www.codeplex.com/aspnet/Release/ProjectReleases.aspx?ReleaseId=16449 を使用して、画像を表示します。

私が抱えている問題は、コントロールが画像コンテンツをロードするために別のコードファイルを呼び出すため、セッション状態を使用してバイト配列を格納していることです。これはあまり満足していません。

これが私のテストプロジェクトからのコードです。

     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サービスからの画像は、SQLReportingServicesからのものです。
  • 通常、画像は常に変化します(実際のキャッシュ要件はありません)。
  • 画像はユーザー固有です。
  • Webサービスは、ページごとに1回だけ呼び出されます。
  • しばらくの間、画像を再度表示する必要がないため、生成された画像が使用した後、実際にセッション状態から画像を破棄しています。
4

3 に答える 3

2

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

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

http://imageproxy/username/photo123123

また、利用可能な画像の数を返すURLを作成する必要があります。

http://imageproxy/username/imagecount

GeneratedImageコンポーネントを使用する必要はありません。標準のimgタグを使用して、ページのhtmlソースを簡単に作成できます。

于 2009-05-14T06:35:46.313 に答える
1

data:URIスキーム を使用して、画像データをページソースに直接埋め込むことができます。これがウィキペディアの説明です。ただし、8より前のバージョンのIEでは機能しないため、状況に応じられない場合があります。

于 2009-05-15T03:54:54.567 に答える
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」に設定すると、イメージが表示されます。

ここで、複数の画像があるため、コントロールを作成し、対応するバイト配列を渡す画像ごとに 1 つずつ、複数のインスタンスを作成する必要がある場合があります。

于 2009-05-15T06:44:33.317 に答える