Могу ли я определить, был ли контент сжат в моем HttpModule? - PullRequest
6 голосов
/ 25 марта 2011

У меня есть HttpModule, который используется для динамического сжатия контента из веб-приложения ASP.NET (MVC3). Подход очень похож на CompressionModule в этой статье (где модуль применяет фильтр GZip к HttpResponse и устанавливает правильный заголовок Content-encoding).

По одной и другой причине он должен работать в классическом режиме, а не в режиме интегрированного конвейера.

Проблема, с которой я столкнулся, заключается в том, что на некоторых серверах, на которых включено сжатие IIS, IIS сжимает содержимое, а затем мой модуль сжимает это.

В результате я получаю сжатый контент дважды с кодировкой:

Content-encoding: gzip,gzip

один из IIS и один из этой строки в моем коде:

 httpResponse.AppendHeader("Content-encoding", "gzip");

Кто-нибудь знает, как в классическом режиме я могу проверить, сжал ли контент уже, или , если на сервере включено сжатие, чтобы обойти мое собственное сжатие?

В режиме конвейера эта проверка так же проста, как и

if (httpResponse.Headers["Content-encoding"]!= null)
{
   return;
}

т.е.. проверить, не установлено ли что-либо для кодировки содержимого, и если да, ничего не делать.

Однако я в тупике в классическом режиме. К сожалению, доступ к HttpResponse.Headers не разрешен в классическом режиме, поэтому я не могу выполнить проверку барьера.

Все идеи с благодарностью приняты.

Ответы [ 2 ]

2 голосов
/ 25 марта 2011

Теоретически, вы можете использовать отражение, чтобы заглянуть в поле HttpRequest._cacheHeaders, где ASP.NET, по-видимому, хранит все пока не отправленные заголовки в классическом режиме:

if (this._wr is IIS7WorkerRequest)
{
    this.Headers.Add(HttpResponseHeader.MaybeEncodeHeader(name), HttpResponseHeader.MaybeEncodeHeader(value));
}
else if (flag)
{
    if (this._cacheHeaders == null)
    {
        this._cacheHeaders = new ArrayList();
    }
    this._cacheHeaders.Add(new HttpResponseHeader(knownResponseHeaderIndex, value));
}
1 голос
/ 19 февраля 2013

Я нашел относительно простой способ проверить, сжат ли выход или нет;мой подход работает даже при IIS, работающем в классическом режиме, и хотя его можно считать «взломом», я обнаружил, что он работает достаточно последовательно;идея более или менее следующая:

// checks if the response is already compressed
private bool IsResponseCompressed(HttpApplication app)
{
    string filter = app.Response.Filter.ToString().ToLower();
    if (filter.Contains("gzip") | filter.Contains("deflate")) 
    {
      return true;
    }
    return false;
}

, в основном код работает путем проверки имени фильтра ответов;если выходной поток сжат, имя содержит «gzip» или «deflate», поэтому легко проверить на сжатие

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...