Reputation: 1775
This streams images from a DB to the top of a _Layout just below the Navbar, so they have to be reloaded each time the user navigates to a new page - but it's very slow, almost one second per image. Sooooo I decided to cache them and was very surprised to see that there was no noticeable difference - still almost a second per image. Call me confused?
Function ImageViewer(ImageId? As Integer, ImageType As String) As ActionResult
If Session("HOAID") Is Nothing Then
Return Content(BlankImage())
Else
If ImageId Is Nothing OrElse ImageId = 0 Then
Return Content(BlankImage())
Else
'Check to see if it's been cached
Dim vKey As String = ImageId & "_" & Session("HOAID")
Dim vCache As MemoryCache = MemoryCache.Default
Dim vObject() As Byte = vCache.Get(vKey)
If Not vObject Is Nothing Then
Dim vMemStream As New IO.MemoryStream(vObject)
Dim vCacheImage As System.Drawing.Image = System.Drawing.Image.FromStream(vMemStream)
If ImageFormat.Jpeg.Equals(vCacheImage.RawFormat) Then
vCacheImage.Save(vMemStream, System.Drawing.Imaging.ImageFormat.Jpeg)
ElseIf ImageFormat.Png.Equals(vCacheImage.RawFormat) Then
Using PNGMemStream As New IO.MemoryStream
vCacheImage.Save(PNGMemStream, System.Drawing.Imaging.ImageFormat.Png)
PNGMemStream.WriteTo(Response.OutputStream)
End Using
ElseIf ImageFormat.Gif.Equals(vCacheImage.RawFormat) Then
vCacheImage.Save(vMemStream, System.Drawing.Imaging.ImageFormat.Gif)
End If
vMemStream.WriteTo(Response.OutputStream)
vMemStream.Close()
vMemStream.Dispose()
vMemStream = Nothing
HttpContext.ApplicationInstance.CompleteRequest()
'End of return cached image
Return View()
End If
Select Case ImageType
Case "Main"
ImageType = "Image_Main"
Case "Thumbnail"
ImageType = "Image_Thumbnail"
Case "Icon"
ImageType = "Image_Icon"
Case Else
Return Content(BlankImage())
End Select
If ImageId = 99999 Then
Return Content(BlankImage())
End If
Dim vImage() As Byte = Nothing
Dim vMIMEType As String = ""
Dim vObj As Object = Nothing
strSQL = "SELECT " & ImageType & ", Image_MIMEType FROM HOA3_Images WHERE Image_ID = " & ImageId
Using DS As DataSet = ReturnDataSet_Data(strSQL, Session("HOAID"), True)
For Each Row As DataRow In DS.Tables(0).Rows
vObj = Row(ImageType)
If vObj.Equals(DBNull.Value) Then
Return Content(BlankImage())
End If
vImage = Row(ImageType)
If vImage.Equals(DBNull.Value) Then
Return Content(BlankImage())
End If
vMIMEType = Row("Image_MIMEType")
Next
End Using
Response.Clear()
Response.BufferOutput = True
Dim vRandom As String = RandomGenerator(8)
Select Case vMIMEType.ToLower
Case ".jpg"
Response.ContentType = "image/jpeg"
Response.AppendHeader("content-disposition", "filename=" & Session("HOAID") & "_" & ImageId & ".jpeg")
Case ".jpeg"
Response.ContentType = "image/jpeg"
Response.AppendHeader("content-disposition", "filename=" & Session("HOAID") & "_" & ImageId & ".jpeg")
Case ".gif"
Response.ContentType = "image/gif"
Response.AppendHeader("content-disposition", "filename=" & Session("HOAID") & "_" & ImageId & ".gif")
Case ".png"
Response.ContentType = "image/png"
Response.AppendHeader("content-disposition", "filename=" & Session("HOAID") & "_" & ImageId & ".png")
End Select
Dim MemStream As New IO.MemoryStream(vImage)
Dim vRetImage As System.Drawing.Image = System.Drawing.Image.FromStream(MemStream)
Dim FileExt As String = vMIMEType.ToLower
Select Case FileExt
Case ".png"
'png files need to write back to memory stream - different format!
Dim PNGMemstream As New IO.MemoryStream()
vRetImage.Save(PNGMemstream, System.Drawing.Imaging.ImageFormat.Png)
PNGMemstream.WriteTo(Response.OutputStream)
PNGMemstream.Close()
PNGMemstream.Dispose()
PNGMemstream = Nothing
Case ".gif"
vRetImage.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Gif)
Case ".jpeg"
vRetImage.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg)
Case ".jpg"
vRetImage.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg)
Case Else
Return Content(BlankImage())
End Select
Dim vPolicy As New CacheItemPolicy With {.AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(10)}
vCache.Add(vKey, vImage, vPolicy)
MemStream.WriteTo(Response.OutputStream)
MemStream.Close()
MemStream.Dispose()
MemStream = Nothing
HttpContext.ApplicationInstance.CompleteRequest()
End If
End If
Return View()
End Function
So, I must be making a glaring mistake somewhere! But where?
Upvotes: 0
Views: 20