Промывочные и компрессионные фильтры (ASP.NET MVC) - PullRequest
4 голосов
/ 22 декабря 2009

У нас есть довольно распространенный код, который работал нормально:

public class CompressionFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        HttpRequestBase request = filterContext.HttpContext.Request;
        if (request.IsAjaxRequest())
            return;

        string acceptEncoding = request.Headers["Accept-Encoding"];
        if (string.IsNullOrEmpty(acceptEncoding)) return;
        acceptEncoding = acceptEncoding.ToUpperInvariant();
        HttpResponseBase response = filterContext.HttpContext.Response;

        if (acceptEncoding.Contains("GZIP"))
        {
             response.AppendHeader("Content-encoding", "gzip");
             response.Filter = new WhitespaceFilter(new GZipStream(response.Filter, CompressionMode.Compress));
        }
        else if (acceptEncoding.Contains("DEFLATE"))
        {
             response.AppendHeader("Content-encoding", "deflate");
             response.Filter =  new WhitespaceFilter(new DeflateStream(response.Filter, CompressionMode.Compress));
        }
    }
}

Теперь я пытаюсь использовать Response.Flush() для доставки части страницы, чтобы улучшить взаимодействие с пользователем.С этим сценарием, когда response.Filter изменяется каждой операцией записи, становится ясно, что страница должна быть доставлена ​​сразу.Как я могу сделать свое приложение для записи в промежуточный поток, затем сжать его, а затем нажать на Response.Filter?

Ответы [ 2 ]

1 голос
/ 15 января 2010

Пока что это не решаемо, потому что asp.net использует один и тот же поток для ввода и вывода для фильтров

0 голосов
/ 10 ноября 2016

Я не думаю, что это выполнимо, но если вам нужно улучшить производительность и удобство работы с пользователем, вы можете сделать следующее:

1- Используйте сжатие IIS, не нужно изобретать велосипед 2- Используйте кеширование вывода для действий, содержание которых не будет часто меняться. 3- Используйте частичный рендеринг, вы сначала выведите наиболее важные части на своей странице, а затем выполните запросы Ajax для загрузки остального содержимого страницы, таким образом вы можете доставить страницу кусками

...