문제

바이트 배열 모음의 형태로 알려지지 않은 수량의 이미지를 반환하는 웹 서비스를 호출합니다. (나는 이것을 바꿀 수 없다)

단일 ASPX 웹 페이지에 각 이미지를 표시해야합니다.

현재 Microsoft.web.generatedImage Control을 사용하고 있습니다.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

이것을 달성하는 가장 우아한 방법은 무엇입니까?

모든 의견을 환영합니다 !!!

편집 : 추가 정보;

  • 웹 서비스의 이미지는 SQL보고 서비스에서 나옵니다.
  • 이미지는 일반적으로 항상 변경됩니다 (실제 캐싱 요구 사항 없음).
  • 이미지는 사용자 구체적입니다.
  • 웹 서비스는 페이지 당 한 번만 호출됩니다.
  • 생성 된 이미지가 사용한 후에도 이미지를 사용한 후에도 이미지를 처리하고 있습니다. 이미지는 잠시 동안 다시 볼 필요가 없기 때문입니다.
도움이 되었습니까?

해결책

이미지 데이터를 data: URI 계획. 위키 백과 설명은 다음과 같습니다. 그것은 8 이전에는 IE 버전과는 작동하지 않으므로 상황에 대해 용납 할 수 없습니다.

다른 팁

페이지 요청 당 한 번만 웹 서비스를 호출하고 싶다고 생각합니다. 실제로, 바이트 배열을 어떻게 든 캐시하는 것이 좋습니다. 따라서 사용자가 순간적으로 페이지에서 멀어지고 다시 돌아 오는 경우 웹 서비스가 다시 호출되지 않도록합니다. 이 경우 세션에서 바이트 배열을 저장하는 것은 불가피합니다. GeneratedImage 컨트롤을 사용하지 않은 경우에도 어딘가에 바이트 배열을 저장해야합니다.

나는 큰 세션에 관한 당신의 걱정을 이해합니다. 응용 프로그램의 세부 사항에 따라 응용 프로그램을 피하기 위해 할 수있는 일이 있습니다. 모든 이미지는 단일 사용자를 참조합니까, 아니면 일부 이미지가 사용자간에 공유됩니까? 이미지가 자주 변경됩니까? 모든 이미지가 단일 사용자에 속하고 자주 변경되면 세션에 저장하는 것이 유일한 솔루션입니다. 그러나 일부 사용자가 이미지를 공유하거나 이미지가 자주 변경 될 것으로 예상되지 않으면 웹 서비스와 웹 응용 프로그램간에 프록시를 만들 수 있습니다. 프록시는 메모리 또는 데이터베이스 (또는 파일 시스템)에 이미지를 저장하고 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)을 사용하여 이미지 소스를 "display.aspx"로 설정하면 이미지가 나타납니다.

이제 여러 이미지가 있으므로 해당 바이트 배열을 전달하는 각 이미지마다 컨트롤을 생성하고 여러 인스턴스를 만들어야 할 수도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top