Изменить css файл (минимизировать) с помощью HttpModule: проверка GZip CRC завершается неудачно - PullRequest
1 голос
/ 10 января 2012

Я использую следующий код для минимизации моей css на лету:

namespace MyCMS.Modules
{
    public class CSSModule : IHttpModule
    {
        void IHttpModule.Dispose()
        {
            throw new NotImplementedException();
        }

        void IHttpModule.Init(HttpApplication context)
        {
            context.BeginRequest += new EventHandler(context_BeginRequest);
        }

        void context_BeginRequest(object sender, EventArgs e)
        {
            HttpApplication app = (HttpApplication)sender;
            HttpContext context = app.Context;

            if (app.Request.RawUrl.Contains(".css"))
            {
                context.Response.Filter = new CSSFilter(app.Response.Filter);
            }
        }

        private class CSSFilter : Stream
        {
            public CSSFilter(Stream sink) { _sink = sink; }
            private Stream _sink;

            public override bool CanRead { get { return true; } }
            public override bool CanSeek { get { return true; } }
            public override bool CanWrite { get { return true; } }
            public override void Flush() { _sink.Flush(); }
            public override long Length { get { return 0; } }
            private long _position;
            public override long Position
            {
                get { return _position; }
                set { _position = value; }
            }

            public override int Read(byte[] buffer, int offset, int count) { return _sink.Read(buffer, offset, count); }
            public override long Seek(long offset, SeekOrigin origin) { return _sink.Seek(offset, origin); }
            public override void SetLength(long value) { _sink.SetLength(value); }
            public override void Close() { _sink.Close(); }
            public override void Write(byte[] buffer, int offset, int count)
            {
                byte[] data = new byte[count];
                Buffer.BlockCopy(buffer, offset, data, 0, count);
                string html = System.Text.Encoding.Default.GetString(buffer);

                html = Yahoo.Yui.Compressor.CssCompressor.Compress(html,0, Yahoo.Yui.Compressor.CssCompressionType.Hybrid, true);

                byte[] outdata = System.Text.Encoding.Default.GetBytes(html);
                _sink.Write(outdata, 0, outdata.GetLength(0));
            }
        }
    }
}

Проблема в том, что CRC GZip (который включен на сервере) не работает.Я понимаю, почему это не удается, поскольку содержимое файла было X, а теперь его Y (минимизировано), а исходный CRC был рассчитан для X, а не Y.

. Что я могусделать, чтобы это исправить?

1 Ответ

0 голосов
/ 10 января 2012

Я создал образец приложения MVC с CSSModule,

Без модуля Site.css размер был ~ 6 КБ.

Использование модуля Site.css размером ~ 1кб.

Может быть, это поможет вам.

Ссылка: http://www.mediafire.com/?a86fqg1zqy44ssc

http://www.sendspace.com/file/exxrj5

...