Модификация ответа HTTP (HTTP Response) при помощи фильтров - Применение фильтра ответа (Response Filter)
ОГЛАВЛЕНИЕ
Применение фильтра ответа (Response Filter)
Объект Response имеет свойство Filter , которое используется для связки фильтров ответа в цепь. Вы можете установить данное свойство тремя способами:
- С определенной веб-страницы. Со страницы вы можете установить свойство Response.Filter. Это работает для определенных страниц, которые имеют следующий код. Добавьте следующий код к обработчику события Page_Load страницы и примените фильтр ответа:
Response.Filter = new ResponseFilterClassName(Response.Filter)
В случае с фильтром WhitespaceFilterVB код будет выглядеть следующим образом:
Response.Filter = new WhitespaceFilterVB(Response.Filter)
- Из соответствующего обработчика события в Global.asax. Фильтры ответа применяются после события PostReleaseRequestState объекта HttpApplication. Поэтому, вы можете добавить фильтр ответа во время данного события или раньше. К примеру, следующий обработчик события в Global.asax добавляет фильтр WhitespaceFilterVB ко всем страницам с содержимым типа "text/html" (ContentType):
Sub Application_PostReleaseRequestState(ByVal sender As Object, ByVal e As EventArgs)
If Response.ContentType = "text/html" Then
Response.Filter = New WhitespaceFilterVB(Response.Filter)
End If
End Sub - Из HTTP Module. HTTP Module являются управляемыми классами, которые могут отвечать на события приложений (такие, как PostReleaseRequestState). HTTP Module может быть использован для установки свойства Response.Filter.
Загрузите пример, доступный в конце данной статьи, чтобы увидеть фильтр WhitespaceFilterVB в действии. Домашняя страница примера (Default.aspx) содержит два элемента TextBox - первый показывает оригинальное содержимое страницы WhitespaceFilterDemo.aspx, что включает в себя символы перехода каретки, табуляцию и множество пробелов - все в 2,603 битах. Второй элемент TextBox на странице демонстрирует содержимое страницы WhitespaceFilterDemo.aspx, просматриваемое в обозревателе. Избыток пробелов был исправлен, сократив размер обрабатываемого содержимого до 2,282 бита. Следующий рисунок демонстрирует страницу Default.aspx в действии.

Связываем множество фильтров ответа в цепи
Как мы только что увидели, существует возможность связывания специализированного фильтра ответа между объектом HttpWriter и выходящим потоком, но вас ничего не остановит от связывания всего лишь одного потока. Приложение данной статьи включает в себя второй фильтр ответа, названный AddCopyrightFilter , который внедряет сообщение о правах в нижней части всех страниц, к которым он был применен. В частности, он добавляет следующее содержимое сразу же после закрывающего тега </body>:
<div class="Copyright">
Copyright Scott Mitchell CurrentYear
</div>
Данный принцип может быть расширен таким образом, чтобы он внедрял другие типы стандартной разметки на страницах, такие как JavaScript , используемый веб-инструментами, как Google Analytics или счетчиками посещаемости веб-сайта.
Фильтр AddCopyrightFilter расширяет класс MemoryStream и перегружает его метод Write , но работает немного по-другому, чем WhitespaceFilter. Вместо обработки каждой части данных, которые приходят в метод Write, AddCopyrightFilter буферизирует входящие данные в StringBuilder. Как только буфер содержит "</html>", он внедряет сообщение о правах и высылает полный текст буфера в следующей поток цепи. (Данное поведение предполагает, что страницы, с которыми работает фильтр, заканчиваются текстом "</html>". Если данный фильтр будет использоваться на странице, которая не заканчивается тегом "</html>" , то клиенту ничего не будет выслано!)
Фильтры ответа AddCopyrightFilter и WhitespaceFilter могут быть связаны в цепь. К примеру, вы можете установить свойство Response.Filter следующим образом :
Response.Filter = new AddCopyrightFilter(new WhitespaceFilter(Response.Filter))
Приложение, доступное в конце статьи, не использует в точности тот код, который я указал выше, но вместо этого реализует цепь фильтров связывая AddCopyrightFilter в Global.asax и WhitespaceFilter в WhitespaceFilterDemo.aspx класса с фоновым кодом страницы.
Вывод
Фильтры ответа (Response filters) это механизм, которым разработчик может программно исследовать и модифицировать поток выходящих данных после того, как содержимое веб-страницы было обработано, но до того, как данные были возвращены клиенту. Фильтры ответа могут быть использованы для компрессии либо модификации выходящих данных, как к примеру добавление сообщения о правах или стандартный текст. Данная статья рассмотрела два примера фильтров ответа: один удалял лишние пробелы из обработанного HTML-кода, а другой добавлял сообщение о правах на сайт в нижней части всех страниц, к которым был применен фильтр.
Веселого программирования!
Scott Mitchell