在流中的图像控件中显示图片

时间:2018-06-22 15:58:37

标签: vb.net caching outputstream cache-control system.drawing

我创建了一个通用处理程序ImageResizer.ashx,该处理程序调用函数ResizeImage(bmSource, intWidth)并调整图像的大小,并将输出返回为image/jpeg

<%@ WebHandler Language="VB" Class="ImageResizer" %>

Imports System.Drawing

Public Class ImageResizer : Implements IHttpHandler

Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
    Try
        Dim strImageName As String = configurationmanager.AppSettings("BasePath").ToString & "/" & context.Request.QueryString("image").Replace(configurationmanager.AppSettings("LivePath").ToString, "")
        Dim intWidth As Integer = CInt(context.Request.QueryString("w"))
        Dim bmSource As New Bitmap(strImageName)

        context.Response.Clear()
        context.Response.ClearHeaders()
        context.Response.AppendHeader("content-disposition", "attachment;filename=" & DateTime.UtcNow().ToString("yyyyMMddHHmmss") & ".jpg")
        context.Response.ContentType = "image/jpeg"

        Using resizedImage As Bitmap = ResizeImage(bmSource, intWidth)
            bmSource.Dispose()
            resizedImage.Save(context.Response.OutputStream, Imaging.ImageFormat.Jpeg)
        End Using

        context.Response.Flush()
    Catch ex As Exception
    End Try
End Sub

Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
    Get
        Return False
    End Get
End Property

Private Function ResizeImage(bmSource As Bitmap, TargetWidth As Int32) As Bitmap
    Dim nSourceAspectRatio = bmSource.Width / bmSource.Height
    Dim TargetHeight = TargetWidth / nSourceAspectRatio
    Dim bmDest As New Bitmap(bmsource, TargetWidth, TargetHeight)
    Return bmDest
End Function

End Class

例如,我使用此处理程序的输出作为img的来源:

<img alt="" src="ImageResizer.ashx?image=[path_to_image]&w=100" />

在本地计算机上运行时,此代码可以正常工作并正确显示图像!

我将此逻辑应用于主页,该主页遍历数据库记录并加载大约30张图像(每个For循环中一张图像)。大约加载了90%的图像,其余10%显示为空白图像(随机排列)。未加载的10%已分配(在For循环中不连续)。例如,可能如下:

Image #1
Image #2 (Loads as blank)
Image #3
.
.
.
Image #27
Image #28
Image #29 (Loads as blank)
Image #30

在另一页加载中,它可以按以下方式加载:

Image #1
Image #2 
Image #3 
.
.
.
Image #27 (Loads as blank)
Image #28 (Loads as blank)
Image #29 
Image #30

在Chrome的控制台日志中,空白图片返回403错误。请注意,如果我右键单击这些图像并在新选项卡中将其打开,它们将正确显示!我尝试使用不同的浏览器,但结果相同。

其背后的原因是什么?

  • 可能是内存问题吗?
  • 页面加载速度是否可能快于另一个页面?
  • 可能与缓存有关吗?就像图像名称存储为时间戳一样,也许CDN缓存正在尝试从先前的Page_Load加载图像?
  • 例如,处理程序ImageResizer.ashx的加载速度可能比显示图像的页面快吗?

我的代码中是否缺少任何内容,例如清除内存流或处置其他任何东西?

0 个答案:

没有答案
相关问题