asp.net mvc сжимает поток и удаляет пробел

Таким образом, я сжимаю свой поток вывода через фильтр действия:

var response = filterContext.HttpContext.Response;
response.Filter = new DeflateStream(response.Filter), CompressionMode.Compress);

Который работает отлично. Теперь, я также хотел бы удалить избыточный существующий пробел. Я нашел http модуль Mads Kristensen http://madskristensen.net/post/A-whitespace-removal-HTTP-module-for-ASPNET-20.aspx.

public class WhitespaceFilter : Stream {

    // using Mads Kristensen httpModule
    // http://madskristensen.net/post/A-whitespace-removal-HTTP-module-for-ASPNET-20.aspx

    private Stream os;
    private static Regex reg = new Regex(@"^\s+", RegexOptions.Multiline | RegexOptions.Compiled); 

    public WhitespaceFilter(Stream os) {
        this.os = os;
    }

    //methods that need to be overridden from stream
    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() {
        os.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 os.Read(buffer, offset, count);
    }

    public override long Seek(long offset, SeekOrigin origin) {
        return os.Seek(offset, origin);
    }

    public override void SetLength(long value) {
        os.SetLength(value);
    }

    public override void Close() {
        os.Close();
    }

    public override void Write(byte[] buffer, int offset, int count) {
        string html = System.Text.Encoding.Default.GetString(buffer);

        //remove whitespace
        html = reg.Replace(html, string.Empty);

        byte[] outdata = System.Text.Encoding.Default.GetBytes(html);

        //write bytes to stream
        os.Write(outdata, 0, outdata.GetLength(0));
    } 

Я добавил класс WhitespaceFilter и добавил новый фильтр как сжатие:

var response = filterContext.HttpContext.Response;
response.Filter = new WhitepaperFilter(response.Filter);

Это также работает отлично. Однако у меня, кажется, есть проблемы при объединении двух!

Я попробовал:

var response = filterContext.HttpContext.Response;
response.Filter = new DeflateStream(new WhitespaceFilter(response.Filter), CompressionMode.Compress);

Однако это приводит к некоторым главным проблемам. HTML полностью испорчен, и иногда я получаю 330 ошибок.

Кажется, что Пробельный метод записи фильтра называют многократно. В первый раз строка HTML прекрасна, но на последующих вызовах ее просто случайные символы.

Я думал, что это могло бы быть, потому что поток был выкачан, но разве пробельный фильтр не использует нетронутый поток и затем передает получающийся поток вызову DeflateStream?

Какие-либо идеи?

9
задан Jason Berkan 6 October 2010 в 11:19
поделиться