ASP.NET - глобальные событя в Global
В статье разбирается использование Global.asax и приводятся практические примеры.
Введение:
Для начала попробую убедить вас в том, что Global.asax вещь интересная, а в некоторых случаях позволяет решить проблемы изящно и с повышением производительности приложения в целом. Россия - не Штаты, а русские - не американеры, поэтому бывают у нас и с английским проблемы. А какие книжки по ASP на русском мы знаем? Немногие... Первая, (и, наверное, за исключением статей в журналах, единственная) что приходит в голову - зелененькая "Программирование Active Server Pages" Скота Хилайера и Даниэла Мезика (Scot Hillier and Daniel Mezick). Здесь про Global.asa писалось столько же, что и про остальные ASP features, и даже меньше. Как следствие - многие имеют смутное представление зачем он нужен и когда его лучше использовать. Я рискну попробовать развеять сей туман неясности.
Global.asax - где его найти.
Еще в ASP мы встречались с Global.asa. Теперь он несколько изменил название, добавив традиционную для ASP.NET буковку 'x' в конец. Для тех кто не знает, расскажем где он сидит. Если официально, то он должен быть помещен в корень дерева виртуальных папок приложения. Чуть проще - в той же папке, что и файлы приложения.(если одна папка. Если дерево - см. официальное определение). Теперь посмотрим, как он обрабатывается Runtime. А дело такое: ASP.NET находит Global.asax и при первом запуске любого ресурса или страницы приложения компилируется в .Framework класс (расширяющий HttpApplication, кому интересно). При этом гарантируется, что пользователь не сможет просмотреть или закачать Global.asax.
Global.asax - что в нем можно делать.
Global.asax задуман для обработки событий уровня приложения (ну или там сессии), а не конкретного пользователя. Говоря просто, здесь не важно Вася ты или Britney Spears, важно что приложение запустилось. События имеют вид
Application_ИмяСобытия(аргументы)
Как примеры приведем Application_Start(); Session_End() и т.д. Ниже предлагается возможный вариант Global.asax: <%@ImportNamespace="System.Data"%>
<%@Import Namespace = "System.Data.SQL"%>
<script language ="C#" runat="server">
void Application_Start(Object sender,EventArgs e){
SQLConnection myConnection=
new SQLConnection("server=localhost;uid=sa;pwd=;database=dotSITE");
SQLDataSetCommand myCommand =
new SQLDataSetCommand("select * from Authors", myConnection);
DataSet ds = new DataSet();
Command.FillDataSet(ds, "Authors");
Application["DataStored"] = ds;
}
</script>
Здесь показано интересное применение Global.asax. Мы создаем некий объект для хранения данных, не изменяющихся и нужных каждому пользователю. За счет того, что происходит это один раз, мы экономим время на получении данных и повышаем производительность. Такой подход применим, конечно, к любому ресурсу, общему для всех клиентов и не изменяемому ими.
Еще одно применение Global.asax - объявление там статичных объектов. Они могут принадлежать к 3 областям видимости:
appinstance (уровень приложения, не разделяем), application (уровень приложения), session (уровень сессии).
Мы приведем пример:
<object id="MyID" runat="server" progid="Com Object Prog ID" scope="session"/>
Другие аспекты конфигурации приложений будут рассмотрены в статье, посвященной составу и роли файлов Config.web