Как сжать JavaScript и CSS с помощью сжатия gzip в веб-приложении Asp .Net 3.5? - PullRequest
1 голос
/ 25 декабря 2009

Как сжать JavaScript и CSS с помощью сжатия gzip в веб-приложении Asp .Net 3.5? Ошибка результатов сжатия Gzip в меню CSS и скриптах валидаторов.

Ответы [ 4 ]

0 голосов
/ 08 апреля 2010

(я уже давно использую эту технику - отсюда код 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
0 голосов
/ 10 марта 2010

добавьте приведенный ниже код в Global.asax и поместите его в корневой каталог.

<%@ Application Language="C#" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.IO.Compression" %>

 <script runat="server">
 void Application_PreRequestHandlerExecute(object sender, EventArgs e)
 {
HttpApplication app = sender as HttpApplication;
string acceptEncoding = app.Request.Headers["Accept-Encoding"];
Stream prevUncompressedStream = app.Response.Filter;

if (!(app.Context.CurrentHandler is Page ||
    app.Context.CurrentHandler.GetType().Name == "SyncSessionlessHandler") ||
    app.Request["HTTP_X_MICROSOFTAJAX"] != null)
    return;

if (acceptEncoding == null || acceptEncoding.Length == 0)
    return;

acceptEncoding = acceptEncoding.ToLower();

if (acceptEncoding.Contains("deflate") || acceptEncoding == "*")
{
    // defalte
    app.Response.Filter = new DeflateStream(prevUncompressedStream,
        CompressionMode.Compress);
    app.Response.AppendHeader("Content-Encoding", "deflate");
} else if (acceptEncoding.Contains("gzip"))
{
    // gzip
    app.Response.Filter = new GZipStream(prevUncompressedStream,
        CompressionMode.Compress);
    app.Response.AppendHeader("Content-Encoding", "gzip");
}
}
</script>
0 голосов
/ 10 марта 2010

Почему вы не используете HttpCompression? Это позволит вам сжать весь статический контент, включая файлы JavaScript и CSS.

HttpCompression IIS 6

HttpCompression IIS 7

0 голосов
/ 28 декабря 2009

Загрузите пример кода сжатия gzip и добавьте его в файл Global.asax.

...