ASP.NET - глобальные событя в Global

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