質問

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

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

現在、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

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

どんな入力でも歓迎!!!

編集:追加情報;

  • ウェブサービスからの画像は SQL Reporting Servicesから提供されます。
  • 画像は一般的に 常に変化する キャッシュ要件)。
  • 画像はユーザー固有のものです。
  • Webサービスは、ページごとに1回だけ呼び出されます。
  • 実際に画像を破棄しています 生成後のセッション状態 画像はそれを使用します。画像は 再び表示する必要がありました while。
役に立ちましたか?

解決

data: URIスキームを使用して、画像データをページソースに直接埋め込むことができます。 Wikipediaの説明をご覧ください。ただし、8より前のIEバージョンでは機能しないため、状況によっては受け入れられない可能性があります。

他のヒント

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

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

http://imageproxy/username/photo123123

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

http://imageproxy/username/imagecount

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

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でも)で画像コントロールを使用して、画像ソースを&quot; display.aspx&quot;に設定できます。画像が表示されます。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top