We have pretty common code that worked fine:
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)); } } }
Now I'm trying to use Response.Flush() to deliver part of the page to improve the user interface. In this case, when response.Filter changed by each write operation, it is clear that the page should be delivered immediately. How can I make my application write in the intermediate stream, then compress it, and then click on response.Filter ?
source share