(я уже давно использую эту технику - отсюда код vb.net!)
Хотя сжатие не поддерживается IIS 6.0, большинство браузеров поддерживают базовое сжатие gzip и уведомляют серверэтой способности, отправив заголовок в каждом запросе.В следующем фрагменте кода показано, как использовать пространство имен System.IO.Compression для добавления фильтра к выходному потоку, который сжимает выходные данные при проверке и установке правильных заголовков.
context.Response.Clear()
context.Response.Buffer = True
context.Response.AddHeader("content-disposition", String.Format( "attachment;filename={0}", fileName))
context.Response.ContentEncoding = Encoding.UTF8
context.Response.Cache.SetCacheability(HttpCacheability.Private)
'Compress the output as it may be very large
'When flushing or closing+ending the stream, the compression filter does not have a chance to write the compression footer
'Therefore, make sure the compression filter stream is closed before flushing
AddCompression(context)
context.Response.ContentType = "application/vnd.ms-excel" 'This example was an excel doc
'Write to response
context.Response.Write(your-data-here)
'context.Response.Flush() 'Do not flush if using compression
'context.Response.Close()
context.Response.End()
Метод AddCompression проверяет соответствующие заголовки и добавляет поток фильтра сжатия к выводу:
'Add compression to the response stream
Public Sub AddCompression(ByVal context As HttpContext)
Dim acceptEncoding As String = context.Request.Headers("Accept-Encoding")
If acceptEncoding Is Nothing OrElse acceptEncoding.Length = 0 Then Return
'Convert to lower to check
acceptEncoding = acceptEncoding.ToLower
'Gzip or Compress compression
'Compress compression is quicker and performs better compression so try that first
If (acceptEncoding.Contains("deflate")) Then
context.Response.Filter = New DeflateStream(context.Response.Filter, CompressionMode.Compress)
context.Response.AppendHeader("Content-Encoding", "deflate")
ElseIf acceptEncoding.Contains("gzip") Then
context.Response.Filter = New GZipStream(context.Response.Filter, CompressionMode.Compress)
context.Response.AppendHeader("Content-Encoding", "gzip")
End If
End Sub