gchq
gchq

Reputation: 1775

Dynamic images loading very slowly

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

Answers (0)

Related Questions