Frage

Ich rufe eine Webservice, die eine unbekannte Menge von Bildern in Form einer Sammlung von Byte-Arrays zurückkehrt. (Ich kann das nicht ändern)

muß ich auf einer einzigen aspx Homepage jedes Bild angezeigt werden soll.

Ich verwende derzeit die Microsoft.Web.GeneratedImage Kontrolle; http://www.codeplex.com/aspnet/Release/ProjectReleases. aspx? RELEASEID = 16449 um die Bilder anzuzeigen.

Das Problem ich habe, ist, dass, da die Steuerung über eine separate Code-Datei ruft den Bildinhalt zu laden, ich Sitzungszustand bin mit dem bytearray zu speichern, die ich über nicht allzu glücklich bin.

Hier ist ein Code von meinem Testprojekt;

     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

Was ist die eleganteste Art und Weise, dies zu erreichen?

Jeder Eingang willkommen !!!

EDIT: Zusätzliche Informationen;

  • Die Bilder der webservice sind Kommen von SQL Reporting Services.
  • Die Bilder würden in der Regel sein die ganze Zeit ändert (keine wirkliche Caching-Anforderung).
  • Bilder würden Benutzer spezifisch sein.
  • Der Webservice wird nur einmal pro Seite aufgerufen.
  • Ich Entsorgung tatsächlich von dem Bild aus Sitzungszustand nach dem generierten Bild verwendet sie, wie das Bild nicht sein erforderlich für eine gesehen wieder zu während.
War es hilfreich?

Lösung

Sie können die Bilddaten direkt in die Seite Quelle einbetten data: URI-Schema verwendet wird. Hier ist die Wikipedia Beschreibung . Das bedeutet nicht vor 8 mit IE-Versionen arbeiten, obwohl, was es für Ihre Situation nicht akzeptabel machen kann.

Andere Tipps

Ich nehme an, dass Sie Ihren Web-Service anrufen möchten nur einmal pro Seite Anfrage. In der Tat wäre es gut, irgendwie den Byte-Array cachen, so dass der Web-Service nicht wieder in dem Fall aufgerufen wird der Benutzer für einen Moment weg von der Seite bewegt und kommt dann zurück. In diesem Fall den Byte-Array in der Sitzung zu speichern ist unvermeidlich. Wenn Sie nicht die GeneratedImage Kontrolle verwenden, würden Sie noch irgendwo die Byte-Array speichern müssen.

ich Ihre Sorgen in Bezug auf große Sitzungen verstehen. Basierend auf den Angaben Ihrer Anwendungen, gibt es einige Dinge, die Sie tun könnten, es zu vermeiden. Sind alle Bilder auf einen einzelnen Benutzer beziehen, oder werden einige Bilder von Benutzern gemeinsam genutzt? oft verändern sich die Bilder? Wenn alle Bilder zu einem einzigen Benutzer gehören und häufig ändern, dann sie in der Sitzung zu speichern ist die einzige Lösung. Wenn jedoch einige Benutzer Bilder teilen oder die Bilder nicht zu häufig ändern zu erwarten, dann könnten Sie einen Proxy zwischen dem Web-Service und der Web-Anwendung erstellen. Der Proxy wird die Bilder speichern, entweder im internen Speicher oder in einer Datenbank (oder vielleicht im Dateisystem) und wird sie als Ressourcen, über ein URL-Mapping. Sie müßten diese Zuordnung definieren, basierend auf dem Interna Ihrer Anwendungen. Es könnte so etwas wie diese:

http://imageproxy/username/photo123123

Sie müssen auch eine URL erstellen, um die Anzahl der verfügbaren Bilder zurück:

http://imageproxy/username/imagecount

Es gäbe keine Notwendigkeit, die GeneratedImage Komponente zu verwenden. Sie könnten die HTML-Quelle der Seite mit Standard-img-Tags leicht bauen.

In asp.net können Sie schreiben und Bild direkt mit dem Response-Objekt und dem wichtigsten Browser in der Lage, um es anzuzeigen. Aber man kann nicht eine Reihe von Bytes übergeben, müssen Sie einen Speicherstrom zu übergeben.

erhalten Sie Ihre System.Web.HttpContext

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

Sie setzen, dass in einer display.aspx Seite und wenn „yourarray“ ist ein Array von Bytes, die der Browser ein Bild darstellt, wird es angezeigt werden soll.

Sie können mit dann ein Bild-Steuerelement auf jeder Seite (auch einfache HTML) und stellen Sie die Bildquelle auf „display.aspx“ und das Bild wird sich zeigen.

Nun, da Sie mehrere Bilder haben, müssen Sie ein Steuerelement erstellen und mehrere Instanz davon, eine für jedes Bild erstellen das entsprechende Byte-Array übergeben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top