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.Clear
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.Flush()
context.Response.WriteFile(fullPath)
context.Response.Flush()
context.Response.End()
Else
context.Response.StatusCode = 200
context.Response.Write("No data located for this request.")
context.Response.End()
End If
End If
End Sub