В данном параграфе рассматриваются базовые принципы функционирования и архитектуры технологии ASP.NET. Вначале рассмотрим схему работы в сети Internet, которую можно назвать «классической», так как эта схема является исторически первой. Основными элементами классической схемы являются браузер и веб-сервер. При взаимодействии браузер и веб-сервер проходят следующие этапы:
1.Браузер формирует запрос к серверу, используя протокол HTTP. Как правило, браузер запрашивает HTML-страницу, то есть текстовый файл, содержащий HTML-код.
2.Сервер анализирует запрос браузера и извлекает из локального хранилища требуемый файл.
3.Сервер формирует HTTP-ответ, включающий требуемую информацию, и отсылает его браузеру по протоколу HTTP.
4.Браузер выполняет отображение страницы.
Классическая схема проста, но обладает существенным недостатком – страницы статичны, и их содержимое не может меняться динамически в зависимости от запросов клиента. В настоящее время подобный подход не соответствует большинству информационных услуг, предоставляемых с помощью сети Internet[39]. Все большее распространение получают технологии, при использовании которых страницы (целиком или частично) генерируются на сервере непосредственно перед отправкой клиенту. Эти технологии обычно содержат в своем названии словосочетание Server Pages – «серверные страницы» (ASP, ASP.NET). Работают технологии «серверных страниц» по схожим принципам:
· Для представления информации на сайте используются не страницы с HTML-кодом, а серверные страницы специального синтаксиса (который часто является HTML-подобным).
· При запросе серверной страницы веб-сервер запускает отдельный служебный процесс, которому перенаправляется запрос.
· В служебном процессе страница анализируется, по ней генерируется некий объект, соответствующий странице.
· Служебный процесс выполняет методы сгенерированного объекта. Как правило, объект имеет специальный метод, генерирующий выходной поток страницы в виде HTML-кода.
· Сервер перехватывает выходной поток страницы, формирует HTTP-ответ и отсылает его браузеру.
· Браузер выполняет отображение страницы.
Рассмотрим особенности технологии серверных страниц, применительно к ASP.NET. Служебный процесс ASP.NET основан на управляемом коде и выполняется в Common Language Runtime. Серверной странице в ASP.NET соответствует некий .NET-класс. Это обеспечивает возможности межъязыкового взаимодействия, использования готовых библиотек кода и т. п. Серверная страница может содержать «вкрапления» серверного кода, написанные на нескольких языках – C#, VB.NET, J#.
ASP.NET представляет и поддерживает концепцию фонового кода (Code Behind). Эта концепция позволяет разделить логику и визуальное представление. Согласно данной концепции класс страницы наследуется от некоторого базового класса, в котором размещаются методы, образующие логику выполнения страницы. Сама страница содержит только описание визуальной части (какие визуальные компоненты и где размещены, как настроены их свойства).
Технология ASP.NET также пытается перенести принципы, используемые при написании приложений Windows Forms, на web-программирование. Речь идет о программировании, основанном на обработке событий. Отдельный компонент страницы ASP.NET, как правило, обладает набором некоторых событий. Хорошим примером является кнопка, у которой есть событие On_Click. Для того чтобы закодировать логику страницы, программист пишет обработчики соответствующий событий. Когда событие происходит, информация о нем пересылается от клиента на сервер, где срабатывает обработчик события. Затем страница (вся или только ее часть) вновь пересылается клиенту.
Чтобы страница сохраняла свое состояние между отдельными циклами приема-передачи, это состояние фиксируется в специальном скрытом поле перед отправкой на сервер, а сервер восстанавливает состояние страницы перед отправкой клиенту. Данный технологический прием называется в ASP.NET поддержкой View State (отображаемого состояния).
5.2. Пример aspx-страницы. Структура страницы
Любая серверная страница ASP.NET представляет собой текстовый файл с расширением .aspx. Далее такие страницы будут для краткости называться aspx-страницами. Рассмотрим пример простой aspx-страницы, которую разместим в файле test.aspx:
<%@ Page Language="C#" %>
<script runat="server">
string[] Data = {"Hello ", "world ", "from ", "ASP.NET"};
string getData(int i) {
return Data[i];
}
void Button1_Click(object sender, EventArgs e) {
Label1.Text = TextBox1.Text;
}
</script>
<html>
<body>
<% for(int i=0; i < 4; i++) Response.Write(getData(i)); %>
1. На компьютере-сервере должен быть установлен и запущен веб-сервер. Можно использовать сервер IIS или, например, свободно распространяемый фирмой Microsoft сервер Cassini.
2. На сервере создается виртуальный каталог, в соответствующий физический каталог помещается файл test.aspx. В нашем примере будет использоваться физический каталог C:\Test и виртуальный каталог test.
3. Пользователь набирает в браузере следующий адрес:
http://localhost/test/test.aspx
Вид страницы в браузере показан на рисунке 13.
Рис. 13. Страница, отображаемая в браузере
HTML-код отображаемой страницы выглядит следующим образом:
Обратите внимание на скрытое поле формы __VIEWSTATE (поддержка отображаемого состояния) и на поле __EVENTVALIDATION (указатель на источник события).
Рассмотрим подробнее структуру страницы. В любой странице можно выделить несколько логических секций:
1. HTML-код. HTML-код не обрабатывается процессом ASP.NET специальным образом, а сразу пересылается клиенту. Выводом HTML-кода занимается специальный внутренний метод __Render__control() того класса, который соответствует странице. В нашем случае фрагмент страницы
<html>
<body>
будет выведен в методе __Render__control() так:
private void __Render__control(. . .) {
Response.Write("<html>\r\n<body>\r\n");
. . .
}
2. Директивы страницы. Директивы используются для установки отдельных параметров страницы, таких как язык программирования для кода страницы или подключение пространства имен. Директива начинается с символа @, за которым следует имя директивы и набор пар «атрибут = значение». Например, следующая директива указывает на использование C# в качестве языка программирования на странице:
<%@ Page Language="C#" %>
Директивы могут размещаться в любом месте страницы, но вне HTML-элементов. Как правило, директивы помещают в начале страницы.
3. Блоки серверного кода. Это блоки, обрамленные тэгом <script> с обязательным атрибутом runat="server":
<script runat="server">
string[] Data = {"Hello ", "world ", "from ", "ASP.NET"};
string getData(int i) {
return Data[i];
}
void Button1_Click(object sender, EventArgs e) {
Label1.Text = TextBox1.Text;
}
</script>
Блоки серверного кода транслируются в члены класса, соответствующего странице. В приведенном примере класс будет содержать поле-массив Data, методы getData() и Button1_Click().
Отметим, что наличие блоков серверного кода на странице противоречит концепции Code Behinde. Согласно данной концепции код, связанный со страницей, должен быть помещен в отдельный класс, от которого наследуется класс страницы.
4. Блоки рендерного кода. Блоки рендерного кода используются для генерации потока вывода. В нашем примере блоком рендерного кода является фрагмент
<% for (int i = 0; i < 4; i++) Response.Write(getData(i)); %>
При обработке на сервере блоки рендерного кода помещаются непосредственно в метод, «заведующий» выводом HTML-кода. Таким образом, метод __Render__control() будет содержать следующий код:
private void __Render__control(. . .) {
Response.Write("<html>\r\n<body>\r\n");
for (int i = 0; i < 4; i++) Response.Write(getData(i));
. . .
}
Если блок рендерного кода записывается в форме <%= выражение %>, то в метод вставляется вывод вычисленного выражения.
5. Серверные элементы управления. В нашем примере страница содержит три серверных элемента управления: текстовую метку, поле ввода, кнопку:
Серверные элементы управления описываются с помощью специальных тегов с обязательным атрибутом runat="server". Они соответствуют полям в классе страницы. Так, наша страница будет содержать поле с именем Label1, тип которого – System.Web.UI.WebControls.Label. Серверный элемент управления обладает набором свойств, установка которых возможна на странице как задание соответствующий атрибутов. Большинство серверных элементов должны быть размещены в пределах серверной формы (<form runat="server">).
Кроме упомянутых выше элементов, страница ASP.NET может содержать также комментарии, блоки привязки данных (будут подробно рассмотрены позднее), клиентские скрипты.
5.3. Директивы страницы
Директивы страницы используются для настройки страницы. Как правило, при помощи директив выполняются такие операции, которым в «традиционном» программировании соответствуют настройка опций компилятора, подключение сборок и пространств имен, установка свойств определенных классов и т. п. Рассмотрим возможные директивы страницы.