| « Поставить закладку » « Сделать стартовой » | |||
|
|||
|
Очищаем HTML от лишних знаков
Однажды посмотрев HTML-документ, генерируемый ASP.NET и содержащий GridView, я заметил, что большое количество символов, содержащихся на странице - пробелы и знаки табуляции. Очевидно, ASP.NET щедро расставлял их, где только можно. Конечно, избавиться от лишних килобайтов HTML-документа можно, воспользовавшись библиотеками, которые сжимают HTML-документы при помощи различных алгоритмов. Но такой метод заставит сервер сначала сжать генерируемый HTML-документ, а браузеру пользователя придется распаковывать пришедший ему документ. Я же хочу в своей статье предложить способ как избавиться от различных ненужных символов, которые содержатся на страницах. Этот способ основан на использовании сборки HTTPModule. Так что же такое HTTPModule? Вот что о нем говорится в библиотеке MSDN:
HTTP Module включается в процесс обработки запроса пользователя после создания объекта HTTP Application и перед созданием HTTP Handle, так что HTTP Module позволяет обработать следующие события объекта HTTP Application:
Подключение обработчиков событий выполняется в методе Init класса HTTPModule. В своем примере мне необходимо подключить обработчик на 2 события ReleaseRequestState, как раз после того, как была сгенерирована HTML-версия страницы и объект Response готов к отправке пользователю. /// <summary>
/// Подключение обработчиков событий
/// </summary>
public void Init(HttpApplication context)
{
//Подключаем обработчик на событие ReleaseRequestState
context.ReleaseRequestState += new EventHandler(this.context_Clear);
//Подключаем обработчик на событие PreSendRequestHeaders
context.PreSendRequestHeaders += new EventHandler(this.context_Clear);
//Два обработчика необходимы для совместимости с библиотеками сжатия HTML-документов
}
Сам обработчик будет иметь следующий вид: /// <summary>
/// Обработчик события PostRequestHandlerExecute
/// </summary>
void context_Clear(object sender, EventArgs e)
{
HttpApplication app = (HttpApplication)sender; //Получение HTTP Application
//Получаем имя файла который обрабатывается
string realPath = app.Request.Path.Remove(0, app.Request.ApplicationPath.Length + 1);
//Проверяем не является ли он ссылкой на ресурс сборки
if (realPath == "WebResource.axd")
return;
//Проверяем тип содержимого
if (app.Response.ContentType == "text/html" || app.Response.ContentType == "text/javascript")
//Устанавливаем фильтр-обработчик
app.Context.Response.Filter = new HTMLClearer(app.Context.Response.Filter);
}
Фильтр-обработчик - это самое главное. Он позволяет изменять содержимое объекта Response. А дополнительные проверки необходимы, чтобы исключить обработку ресурсов сборок и документов, тип которых отличен от text/html и text/javascript (в документах другого типа нет необходимости убирать лишние символы). Теперь уделим внимание обработчику содержимого Response. Это класс, являющийся наследником System.IO.Stream. В его реализации нам интересен только один метод - это метод Write: /// <summary>
/// Обрабатываем данные поступающие в Response
/// </summary>
public override void Write(byte[] buffer, int offset, int count)
{
//Преобразовываем массив байт в строку
string s = System.Text.Encoding.UTF8.GetString(buffer);
//Используя регулярные выражения убираем все ненужные символы
s = Regex.Replace(s, ">(rn){0,10} {0,20}t{0,10}(rn){0,10}t{0,10}(rn){0,10} {0,20}
(rn){0,10} {0,20}<", "><", RegexOptions.Compiled);
s = Regex.Replace(s, ";(rn){0,10} {0,20}t{0,10}(rn){0,10}t{0,10}", ";", RegexOptions.Compiled);
s = Regex.Replace(s, "{(rn){0,10} {0,20}t{0,10}(rn){0,10}t{0,10}", "{", RegexOptions.Compiled);
s = Regex.Replace(s, ">(rn){0,10}t{0,10}<", "><", RegexOptions.Compiled);
s = Regex.Replace(s, ">r{0,10}t{0,10}<", "><", RegexOptions.Compiled);
//Получивщуюся строку преобразовываем обратно в byte
byte[] outdata = System.Text.Encoding.UTF8.GetBytes(s);
//Записываем ее в Response
_HTML.Write(outdata, 0, outdata.Length);
}
А также конструктор класса: public HTMLClearer(System.IO.Stream HTML)
{ _HTML = HTML; }
Для демонстрации примера использования HTTP Module и обработчика содержимого объекта HTTP Response создадим проект Class Library и назовем его - HTMLClearer. В этом проекте следует создать файл HTMLClearer.cs, содержащей следующий текст: using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Text.RegularExpressions;
namespace HTMLClearer
{
public class HTMLClearer : System.IO.Stream
{
System.IO.Stream _HTML;
public HTMLClearer(System.IO.Stream HTML)
{ _HTML = HTML; }
#region Стандартные методы и свойства
public override bool CanRead
{ get { return false; } }
public override bool CanSeek
{ get { return false; } }
public override bool CanWrite
{ get { return true; } }
public override long Length
{ get { return _HTML.Length; } }
public override long Position
{
get { return _HTML.Position ; }
set { _HTML.Position = value; }
}
public override long Seek(long offset, System.IO.SeekOrigin origin)
{ return _HTML.Seek(offset, origin); }
public override void SetLength(long value)
{ _HTML.SetLength(value); }
public override void Flush()
{ _HTML.Flush(); }
public override int Read(byte[] buffer, int offset, int count)
{ return _HTML.Read(buffer, offset, count); }
#endregion
/// <summary>
/// Обрабатываем данные поступающие в Response
/// </summary>
public override void Write(byte[] buffer, int offset, int count)
{
//Преобразовываем массив байт в строку
string s = System.Text.Encoding.UTF8.GetString(buffer);
//Используя регулярные выражения убираем все ненужные символы
s = Regex.Replace(s, ">(rn){0,10} {0,20}t{0,10}(rn){0,10}t{0,10}(rn){0,10} {0,20}(rn){0,10}
{0,20}<", "><", RegexOptions.Compiled);
s = Regex.Replace(s, ";(rn){0,10} {0,20}t{0,10}(rn){0,10}t{0,10}", ";", RegexOptions.Compiled);
s = Regex.Replace(s, "{(rn){0,10} {0,20}t{0,10}(rn){0,10}t{0,10}", "{", RegexOptions.Compiled);
s = Regex.Replace(s, ">(rn){0,10}t{0,10}<", "><", RegexOptions.Compiled);
s = Regex.Replace(s, ">r{0,10}t{0,10}<", "><", RegexOptions.Compiled);
//Получивщуюся строку преобразовываем обратно в byte
byte[] outdata = System.Text.Encoding.UTF8.GetBytes(s);
//Записываем ее в Response
_HTML.Write(outdata, 0, outdata.Length);
}
}
public class HTTPModule_Clearer : IHttpModule
{
#region IHttpModule Members
public void Dispose()
{
}
/// <summary>
/// Подключение обработчиков событий
/// </summary>
public void Init(HttpApplication context)
{
//Подключаем обработчик на событие ReleaseRequestState
context.ReleaseRequestState += new EventHandler(this.context_Clear);
//Подключаем обработчик на событие PreSendRequestHeaders
context.PreSendRequestHeaders += new EventHandler(this.context_Clear);
//Два обработчика необходимы для совместимости с библиотеками сжатия HTML-документов
}
/// <summary>
/// Обработчик события PostRequestHandlerExecute
/// </summary>
void context_Clear(object sender, EventArgs e)
{
HttpApplication app = (HttpApplication)sender; //Получение HTTP Application
string realPath = app.Request.Path.Remove(0, app.Request.ApplicationPath.Length + 1);
//Получаем имя файла который обрабатывается
if (realPath == "WebResource.axd") //Проверяем не является ли он ссылкой на ресурс сборки
return;
if (app.Response.ContentType == "text/html" || app.Response.ContentType == "text/javascript")
//Проверяем тип содержимого
app.Context.Response.Filter = new HTMLClearer(app.Context.Response.Filter);
//Устанавливаем фильтр обработчик
}
#endregion
}
}
После всех этих манипуляций компилируем проект, и получившуюся библиотеку через Add Reference подключаем к Веб-сайту. Теперь нам необходимо подключить HTTP Module к общему потоку обработки запросов. Для этого в файле web.config необходимо сделать некоторые изменения, а именно в раздел system.web добавить ссылку на модуль: <httpModules>
<add name="HTTPModule_Clearer" type="HTMLClearer.HTTPModule_Clearer, HTMLClearer"/>
</httpModules>
Общий вид тега <httpModules> взятый из MSDN выглядит так: <httpModules>
<add type="classname,assemblyname" name="modulename"/>
<remove name="modulename"/>
<clear/>
</httpModules>
При использовании данного модуля размер HTML-страничек, отправляемых пользователю, уменьшается примерно на 10%, что не может не сказаться на трафике, как пользователя, так и сервера. P.S. Использование HTTP Module позволяет также вносить изменения в отправляемый пользователю ответ (например, если есть необходимость добавить к странице Header или Footer). Также, дописав метод Write, можно сохранять определенные части страницы или страницы целиком в базу данных или в файл. Автор: Никита Егоров (nikitaegorov@gmail.com) Рубрика: Asp.Net и Web Forms
Подгрузка через AJAX HTML-кода, содержащег....
При разработке CMS S.Builder наша команда активно использовала AJAX. Теперь вот решили поделиться накопленным опытом. Начнем с этого хабратопика. Не буду здесь затрагивать различные фреймворки и библиотеки. Свой код всегда роднее. Для работы с AJAX-ом в S.Builder написана библиотека sbAJAX. Можете качать и пользоваться :). В этом файле есть функция sbEvalJS. Для тех, кто не знает, объясню. При подгрузке через AJAX и вставке на страницу HTML-кода, содержащего JavaScript, JavaScript выполняться не будет или полезут баги. Эта функция как раз решает поставленную задачу.
Подробнее... |
Рубрика: AJAX
| Добавлено: 19.11.2008
Обзор нового релиза самой мощной Ajax библ....
Хотя наш обзор немного запоздал, оригинальный Dojo 1.2 вышел в релизной версии ещё 6-го октября, но сейчас мы наверстаем упущенное. И так, Dojo Toolkit — это самая мощная и гибкая ajax-библиотека из всех, что есть на рынке, она активно развивается и имеет большое комьюнити. Кстати, это самое комьюнити, совместно с компанией Sitepen, имеет ещё несколько проектов, среди которых и Cometd и некоторые другие, не менее интересные, о которых мы скоро вам расскажем. Сегодня же все внимание на флагманский продукт — Dojo 1.2.
Подробнее... |
Рубрика: AJAX
| Добавлено: 19.11.2008
Firebug 1.3 и 1.4 alpha — что нового и инт....
Если вы профессиональный веб-разработчик и постоянно имеете дело с разработкой и отладкой сложных AJAX приложений, то наверняка знаете и используете Firebug — плагин для браузера Firefox, предназначенный для отладки и исследования веб-приложений. Текущая его версия, 1.2х достаточно стабильная и функциональна, чтобы помочь в 99% проблем, которые могут возникнуть при разработке. Но и этот инструмент не лишён если не недостатков, то некоторых фич, которые могли бы облегчить работу. И даже идеальный инструмент можно сделать ещё более идеальным, как бы это не звучало.
Подробнее... |
Рубрика: Вебмастеру
| Добавлено: 19.11.2008
Остальные статьи: |
Цитата дня (все,добавить):
|
Realcoding.NET
© 2003-2008 |
Контакты |
Реклама на сайте
|