我正在调用一个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
实现这一目标最优雅的方式是什么?
欢迎任何欢迎!!!
编辑:其他信息;
答案 0 :(得分:2)
我想您只想在每个页面请求时调用您的Web服务一次。实际上,以某种方式缓存字节数组会很好,这样在用户暂时离开页面然后返回的情况下,不会再次调用Web服务。在这种情况下,在会话中保存字节数组是不可避免的。如果你没有使用GeneratedImage控件,你仍然需要在某处保存字节数组。
我理解您对大型会议的担忧。根据您的应用程序的详细信息,您可以采取一些措施来避免它。所有图像是指单个用户,还是用户之间共享的图像?图像经常变化吗?如果所有图像都属于单个用户并经常更改,则将其保存在会话中是唯一的解决方案。但是,如果某些用户共享图像或者图像不会经常更改,则可以在Web服务和Web应用程序之间创建代理。代理将保存图像,无论是在内存中还是在数据库中(或者可能在文件系统中),并通过URL映射将它们作为资源提供。您需要根据应用程序的内部结构定义此映射。它可能是这样的:
http://imageproxy/username/photo123123
您还需要创建一个URL来返回可用图像的数量:
http://imageproxy/username/imagecount
不需要使用GeneratedImage组件。您可以使用标准的img标签轻松构建页面的html源代码。
答案 1 :(得分:1)
您可以使用data:
URI方案将图像数据直接嵌入到页面源中。 Here's the Wikipedia description。但这不适用于8之前的IE版本,这可能使您的情况无法接受。
答案 2 :(得分: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”,您的图像就会显示出来。
现在,由于你有多个图像,你可能需要创建一个控件并创建它的多个实例,每个图像一个传递相应的字节数组。