OutputCache и пользовательский фильтр сжатия gzip - PullRequest
6 голосов
/ 29 июля 2011

У меня есть этот пользовательский фильтр для сжатия вывода моих страниц:

public class EnableCompressionAttribute : ActionFilterAttribute
{
    const CompressionMode compress = CompressionMode.Compress;
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        HttpRequestBase request = filterContext.HttpContext.Request;
        HttpResponseBase response = filterContext.HttpContext.Response;
        string acceptEncoding = request.Headers["Accept-Encoding"];
        if (acceptEncoding == null)
            return;
        if (acceptEncoding.ToLower().Contains("gzip"))
        {
            response.Filter = new GZipStream(response.Filter, compress);
            response.AppendHeader("Content-Encoding", "gzip");
        }
        else if (acceptEncoding.ToLower().Contains("deflate"))
        {
            response.Filter = new DeflateStream(response.Filter, compress);
            response.AppendHeader("Content-Encoding", "deflate");
        }
    }
}

Я получил код из книги: Pro ASP.NET MVC V2 Framework (голос эксперта в .NET).

Теперь у меня есть метод действия, подобный этому:

[OutputCache(Order=1, Duration=300,VaryByParam="*", VaryByContentEncoding="gzip; deflate")]
[EnableCompression(Order=0)]
public ActionResult About()
{
    return View();
}

Как я могу убедиться, что фильтр OutputCache кэширует сжатый контент?Использование параметра «Порядок», как в этом примере будет достаточно?

Как я могу увидеть, что происходит в кэше?

Приветствия.

ОБНОВЛЕНИЕ: я тестировал с Fiddler, очевидно, он работает независимо от того, какой порядок вы используете для фильтров ... Я получаю первый ответ с кодировкой gzip и http.302 в следующих запросах, если клиенту разрешено его кэшироватьили больше http.200 с кодировкой gzip, если разрешен только сервер

Возможно, это связано с тем, что OutputCache является последним фильтром по умолчанию, и изменить его невозможно.Кто-нибудь может это подтвердить?

1 Ответ

4 голосов
/ 09 сентября 2011

Посмотрите на эту страницу, http://www.klopfenstein.net/lorenz.aspx/my-take-on-asp-net-output-caching Там есть хорошая информация, особенно совет Джеффа Этвуда по сжатию элементов кэша

Со страницы ..

Заказ важен

Приведенный выше ActionFilter должен обязательно выполняться как последний: как я обнаружил в последнее время, как только фильтр действия изменяет результат действия, текущий вызов действия отменяется. Это также означает, что все остальные фильтры действий, которые не имели возможности работать, никогда не будут работать. Если вы планируете добавить этот метод кэширования в свой проект, убедитесь, что все фильтры имеют правильный приоритет (используя приоритет «Порядок», который принимает положительное целое число и порядки от самого низкого до самого высокого).

...