Pregunta

He estado golpeando mi cabeza contra la pared con este extraño comportamiento en Chrome

Tengo archivos almacenados encriptados en el disco en un estado sin nombre ni orden. cuando el usuario descarga los archivos, el cliente se redirige a un controlador de descarga (.ashx), los datos se cargan en una secuencia, se descifran y se envían al cliente. Ahora esto ha funcionado bien hasta hace poco,

¿Funciona bien en todos los navegadores, excepto Chrome, donde el archivo se descarga como un archivo .gz y no se puede leer?

He eliminado las partes de búsqueda de flujo y criptografía por brevedad (tenga en cuenta que esto funciona perfectamente en IE, Firefox, etc.)

    Private Function StreamFile(ByVal context As System.Web.HttpContext) As Boolean

    context.Response.Clear()
    context.Response.ClearHeaders()
    context.Response.BufferOutput = False
    context.Response.ContentType = "application/octet-stream"
    context.Response.AddHeader("content-disposition", "attachment;filename=""" & _sFileName & """")
    context.Response.AddHeader("content-length", _iSize)
    context.Response.Cache.SetNoServerCaching()
    context.Response.Cache.SetMaxAge(System.TimeSpan.Zero)

    Dim oInputStream As System.IO.Stream = GetStream()
    Dim oBufferedStream As New BufferedStream(oFileStream, context.Response.OutputStream)
    oBufferedStream.ProcessStreams(True)

    context.ApplicationInstance.CompleteRequest()

    Return True

End Function

Public Class BufferedStream
    Private _oInputStream As Stream
    Private _oOutputStream As Stream
    Private _bBuffer() As Byte
    Public Const DEFAULT_BUFFER_SIZE As Integer = 8192

    Public Sub New(ByRef oInputStream As Stream, ByRef oOutputStream As Stream)
        _oInputStream = oInputStream
        _oOutputStream = oOutputStream
        _bBuffer = GetStreamBuffer(ToInteger(_oInputStream.Length))
    End Sub

    Public Function ProcessStreams(ByVal bCloseStreams As Boolean) As Boolean

        Dim iRead As Integer = 0
        Dim iStreamLength As Integer = ToInteger(_oInputStream.Length)

        Try
            iRead = _oInputStream.Read(_bBuffer, 0, _bBuffer.Length)
            While iRead > 0
                _oOutputStream.Write(_bBuffer, 0, _bBuffer.Length)
                iRead = _oInputStream.Read(_bBuffer, 0, _bBuffer.Length)
                If iRead < _bBuffer.Length Then System.Array.Resize(_bBuffer, iRead)
            End While

            If bCloseStreams Then
                Close()
            End If
            Return True

        Catch
            Return False
        End Try
    End Function

    Public Shared Function GetStreamBuffer(ByVal iStreamSize As Integer) As Byte()
        Dim iBufferSize As Integer = iStreamSize - 1
        If iBufferSize > DEFAULT_BUFFER_SIZE Then iBufferSize = DEFAULT_BUFFER_SIZE
        Dim bBuffer As Byte() = New Byte(iBufferSize) {}
        Return bBuffer
    End Function

End Class

Cualquier ayuda sería muy apreciada.

Aquí está el encabezado HTTP del fiddler cuando el archivo se descarga en Chrome

HTTP/1.1 200 OK
Date: Fri, 30 Oct 2009 00:01:45 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
content-disposition: attachment;filename="codeKiwi.txt"
Content-Length: 349
Cache-Control: private, max-age=0
Content-Type: application/octet-stream

Tenga en cuenta que el nombre de archivo es codekiwi.txt y el contenido es texto simple, el archivo se guarda como codekiwi.txt.gz y contiene galimatías.

¿Fue útil?

Solución

Ok, lo resolví yo mismo. Resulta que Chrome (y Firefox) REALMENTE no me gusta la respuesta. Llamada de ClearHeaders, por alguna razón IE estuvo bien con esto, una vez que lo eliminé, las descargas funcionaron como se esperaba nuevamente ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top