RadCompression + ashx + Content-Length Header + Flush

3 posts, 1 answers
  1. Chuck
    Chuck avatar
    30 posts
    Member since:
    Sep 2010

    Posted 26 Jan 2012 Link to this post

    After implementing the RadCompression model on a previously working ashx page I was using for secure file downloads, itstopped working in Firefox, Chrome, & Safari, but continued to work in IE (tested v9).  I found 2 possible places for the error, but due to time constraints had to stop and simply remove the RadCompression module.

    1.    On my development box, Win 7, IIS 7, flushing the data (context.Response.Flush()) between the header and the content caused the browsers listed above to report an invalid compression.

    2. On my production server, Windows Server 2003, IIS 6, the browsers just sit there and spin, as if they are waiting for more content.  I think this is due to my manually adding a "Content-Length" based on the size of the uncompressed content.  Is there a sample showing the correct parameters to set when using RadCompression in this scenario?  My page, based on parameters, may return any of the following, and so I am also setting the content type and content-disposition headers manually:

        a.    HTML (text/html)
        b.    Text (text/plain)
        c.    Zip (application/zip)
        d.    Excel (application/vnd.ms-excel)
        e.    Excel 2007 (application/vns.openxmlformats-officedocument.spreadsheetml.sheet)
        f.    Jpg (image/jpeg)

    These files are dynamically generated, so I would also like to specify "no-cache" in the sample as well.

    The following is my working (without RadCompression) sample. (Again, it works in IE, but not others.)

    Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
            '''The following 2 lines do not seem to make a difference, but were added when trying to test
            context.Response.BufferOutput = True
            'Get the filename
            Dim fileName As String = context.Request.QueryString("i")
            'Get the file type
            Dim fileType As String = context.Request.QueryString("t")
            'Get the project name
            Dim projectName As String = Managers.SessionManager.ProjectName(context.Session)
            'Get the userId
            Dim userId As Integer = Managers.SessionManager.UserId(context.Session)
            'Make sure the project and user name are valid
            If IsProjectAndUserValid(projectName, userId) = True Then
                Dim securePath As String = Utilities.IO.GetSecureDirectory(Managers.ConfigManager.SecureOutput, projectName, userId)
                'Create the full physical path to the file       
                Dim fullPath As String = IO.Path.Combine(securePath, fileName)
                'See if the file exist
                If IO.File.Exists(fullPath) Then
                    'Open a fileinfo object for the file
                    Dim currentFileInfo As New IO.FileInfo(fullPath)
                    Select Case fileType.ToLower
                        Case "zip"
                            context.Response.AddHeader("Content-Disposition", "attachment;filename=MyZip.zip")
                            context.Response.ContentType = "application/zip"
                        Case "export"
                            'Get the fileextension
                            Dim fileExtension As String = IO.Path.GetExtension(fullPath)
                            If fileExtension = ".html" OrElse fileExtension = ".htm" Then
                                context.Response.AddHeader("Content-Disposition", "attachment;filename=Export.htm")
                                context.Response.ContentType = "text/html"
                            ElseIf fileExtension = ".txt" Then
                                context.Response.AddHeader("Content-Disposition", "attachment;filename=Export.txt")
                                context.Response.ContentType = "text/plain"
                            ElseIf fileExtension = ".xls" Then
                                context.Response.AddHeader("Content-Disposition", "attachment;filename=Export.xls")
                                context.Response.ContentType = "application/vnd.ms-excel"
                            ElseIf fileExtension = ".xlsx" Then
                                context.Response.AddHeader("Content-Disposition", "attachment;filename=Export.xlsx")
                                context.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
                            End If
                        Case "print"
                            context.Response.ContentType = "text/html"
                        Case "image"
                            context.Response.AddHeader("Content-Disposition", "inline;filename=Print.jpg")
                            context.Response.ContentType = "image/jpeg"
                    End Select
                    '''The following line has had inconsistant results in some browsers
                    'context.Response.CacheControl = "no-cache"
                    '''Is the following line is another (unconfirmed) problem for RadCompression?
                    context.Response.AddHeader("Content-Length", currentFileInfo.Length.ToString)
                    context.Response.StatusCode = 200
                    ''''The following line breaks RadCompression in IIS7
                    context.Response.StatusCode = 200
                    context.Response.Write("No data located for this request.")
                End If
            End If     
        End Sub

  2. Answer
    Johny avatar
    80 posts
    Member since:
    Aug 2008

    Posted 31 Jan 2012 Link to this post


    I suspect that you have to manually exclude your handler from being compressed. Telerik says how to achieve it here:


    I hope this helps.
  3. Chuck
    Chuck avatar
    30 posts
    Member since:
    Sep 2010

    Posted 31 Jan 2012 Link to this post

    Thank you for the response.  That would be another work-around that would not be as dramatic as simply removing the control enitrely.
Back to Top