четверг, 26 августа 2010 г.

Основы Asp.Net – Часть 4

В этой статье мы поговорим об архитектуре web-приложения ASP.NEТ.

Архитектура web-приложения ASP.NEТ

Теперь, когда у нас уже есть опыт создания очень простого приложения ASP.NET, пора разобраться с основными особенностями архитектуры ASP .NET в целом. Как мы помним, среда выполнения поместила в исходный скриптовый блок на нашей странице следующий блок с таинственным атрибутом Codebehind:

<%@ Page language="C#" Codebehind="defaul.aspx.cs"

AutoEventWireup="false" Inherits="FirstWebApplication.WebForml" %>

Главное различие между классическими ASP и ASP.NET заключается в том, что страница *.aspx, которую запрашивает внешний клиент, представлена уникальным классом С#, на который и указывает атрибут Codebehind. Когда клиент запрашивает страницу, среда выполнения ASP.NET создает объект этого класса. Этот файл не показывается в окне Solution Explorer. Чтобы его открыть, необходимо щелкнуть правой кнопкой мыши на уже открытом файле *.aspx и в контекстном меню выбрать View Code. Изначально содержимое этого файла выглядит следующим образом:

namespace FirstWebApplication

{

using System:

using System.Collections:

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Web;

using System.SessionState:

using System.Web.UI:

using System.Web.UI.WebControls:

using System.Web.UI.HtmlControls;

public class WebForml : System.Web.UI.Page

{

public WebForm1()

{

Page.Init =+ new System.EventHandler(Page_Init);

}

protected void Page Load(object sender. System.EventArgs е)

{ ­

// Добавляем пользовательский код для инициализации страницы

}

protected void Pagelnit(object sender. EventArgs е)

{ ­

InitializeComponent();

}

private void InitializeComponent()

{

this.Load += new System.EventHandler(this.Page Load):

}

}

}

Как мы видим, исходный код очень простой. Конструктор класса устанавлива­ет обработчик события для события Init. Реализация этого обработчика вызывает метод InitializeComponent(), который, в свою очередь, устанавливает обработчик события Load.

Тип System.Web.UI.Page

Как мы видим, любая страница ASP.NET представлена классом, производным от System.Web.UI.Page. Этот класс определяет свойства, методы и события, общие для всех страниц, предназначенных для выполнения в среде ASP .NET. Некоторые наи­более важные свойства этого класса представлены в табл. 4.

Таблица 4. Свойства класса page

Свойство Описание

Application Возвращает объект HttpApplicationState

Cache Возвращает объект Cache, в котором хранятся данные приложения, частью которого является эта страница

IsPostBack Возвращает значение, определяющее, была ли эта страница загружена клиентом в первый раз или она загружена повторно в ответ на переданные клиентом данные

Request Возвращает объект HttpRequest, используемый для получения информации о входящем запросе НTTР

Response Возвращает объект HttpResponse, при помощи которого можно скомпоновать данные, возвращаемые браузеру клиента

Server Возвращает объект HttpServerUtility

Session Возвращает объект System.Web.SessionState.HttpSessionState, при помощи которого можно получить информации о текущем сеансе подключения

Как мы видим, свойства класса Page обеспечивают нам те же возможности, кото­рые были в нашем распоряжении в классических ASP. В классе Page также имеет­ся несколько унаследованных методов (они используются редко) и несколько очень важных событий, представленных в табл. 5.

Таблица 5. Наиболее важные события класса page

Событие Описание

Init Это событие происходит, когда страница инициализируется. Это – первое событие жизненного цикла страницы

Load Это событие происходит после события Init. Обработчик этого события можно использовать для настройки любых элементов управления WebForm

Unload Происходит при выгрузке объекта из памяти. Можно использовать, к примеру, для освобождения ресурсов

Обработчик события Load - лучшее место установления соединения с источником данных (например, для заполнения на форме элемента управления WebForm DataGrid) или выполнения других подготовительных действий. Обработчик события Unload можно использовать, например, для закрытия этого соединения и выполнения других аналогичных действий.

Связка *.aspx/Codebehind

Помимо готовых членов, унаследованных от Page, мы можем определить в своем классе С# собственные члены, которые могут быть вызваны (не напрямую) при помощи блоков <%...%> в файле *.aspx. В классических ASP все дополнительные возможности приходилось определять непосредственно в коде файла *.asp. В ре­зультате этот файл превращался в совершеннейшие джунгли из тегов HTML и кода VBScript (или jаvаSсriрt). Читать такие файлы было очень тяжело, а использовать их код повторно - еще тяжелее.

В ASP.NET эта проблема решена за счет того, что код представления (то есть код для генерации кода HTML) помещен в файл *.aspx, а прочая программная логика - обычным образом в файл С# *.aspx.cs.

Как же происходит обращение к пользовательским членам класса, производного от Page? Предположим, что мы определили в таком классе простенькую функ­цию, возвращающую текущее значение даты и времени:

public class WebForml : System.Web.UI.Page

{

// Автоматически сгенерированный код...

public string GetDateTime()

{

return DateTime.Now.ToString();

}

}

Обратиться к этой функции из файла * .aspx можно так:

<body>

<! - Получаем информацию о времени от класса С# ->

<% Response.Write(GetDateTime()); %>

...

<form method="post" runat="server" ID=Form1>

</form>

</body>

Конечно, можно использовать нужные нам унаследованные от Page члены непосредственно внутри класса С#. Например, можно определить нашу функцию так:

public class WebForml : System.Web.UI.Page

{

// Автоматически сгенерированный код...

public void GetDateTime()

{

Response.Write("It is now " + DateTime.Now.ToString()):

}

}

А затем просто вызывать эту функцию:

<!- Получаем время ->

<% GetDateTime(); %>

Свойство Page.Request

Множество web-приложений построено по одному и тому же принципу: клиент заходит на web-сайт, заполняет форму HTML своей пользовательской информацией и нажимает на кнопку Submit этой формы, чтобы передать информацию на сервер. В большинстве случаев в теге форм используются атрибуты action и metod. Первый определяет адрес получателя информации на сервере, а второй - метод передачи информации:

<form name=MainForm action=''http://localhost/default.asp'' method=get ID=Forml>

В ASP.NET свойство Page.Request позволяет получить доступ к данным, отправленным пользователем в виде запроса НТТР. Если разобраться, что делает это свойство, то выяснится, что оно взаимодействует с объектом класса HttpRequest. Некоторые наиболее важные свойства этого класса представлены в табл. 6.

Таблица 6. Свойство типа HttpRequest

Свойство Описание

ApplicationPath Возвращает виртуальный путь к приложению, выполняющемуся на сервере

Browser Позволяет получить информацию о возможностях браузера клиента

ContentType Определяет тип содержимого MIME для входящего запроса. Это свойство доступно только для чтения

Cookies Возвращает набор клиентских cookie

FilePath Возвращает виртуальный путь к запрашиваемому файлу. Это свойство доступно только для чтения

Files Возвращает набор файлов, загруженных клиентов (формат MIME для файлов из нескольких частей)

Filter Позволяет получить или установить фильтр, используемый для чтения

потока входящих данных

Form Позволяет получить набор переменных Form

Headers Позволяет получить набор заголовков НТТР

HttpMethod Определяет метод передачи данных, используемый клиентом (GEТ, POSТ). Это свойство доступно только для чтения

IsSecureConnection Позволяет получить информацию о том, является ли установленное соединение защищенным (с применением SSL). Это свойство доступно только для чтения

Params Возвращает комбинированный набор QueгyString + Foгm + ServeгVaгiabIe + Cookie

QueryString Возвращает набор переменных QueгyStгing

RawUrl Возвращает текущий запрос клиента в виде адреса URL

Requesttype Определяет метод передачи данных, используемых клиентом (GET,POSТ)

ServerVariables Возвращает набор переменных web-сервера

UserHostAddress Возвращает IP-адрес компьютера удаленного клиента

UserHostName Возвращает имя DNS компьютера удаленного клиента

При помощи этих свойств можно получить любую возможную информацию о запросе пользователя. Мы уже использовали этот объект ранее, не очень об этом догадываясь. Например, когда мы получали информацию о браузере пользователя

при помощи строки следующего вида:

<b>You are: </Ь> <%= Requеst.SегvегVагiаЫеs[НTTР_USER_АGЕNТ"] %>

реально мы обращались к свойству возвращаемого объекта HttpRequest:

<b>You Аге: </Ь>

<%

HttpRequest r;

r = this.Request;

Response. Write( r. ServerVariables[ "НTTP _USER _AGENT"]) ;

%>

Как получать информацию о передаваемых пользователем данных привычными средствами С#, мы уже разобрались. Однако нам нужно как-то на них отреагировать. И в этом нам поможет свойство Page.Response и соответствующий ему класс HttpResponse.

Свойство Page.Response

Свойство Page.Response возвращает объект класса HttpResponse. В этом классе пресмотрено множество свойств, которые предназначены для одной цели - помочь нам скомпоновать ответ в виде кода HTML (то есть web-страницу), который будет возвращен браузеру клиента. Некоторые наиболее важные свойства этого класса

представлены в табл. 7.

Таблица 7. Свойства класса HttpResponse

Свойство Описание

Cache Возвращает информацию о кэшировании для web-страницы (время

устаревания и т. п.)

ContentEncoding Позволяет определить кодировку для возвращаемых клиенту данных

ContentType Позволяет определить тип MIME для возвращаемых клиенту данных

Cookies Возвращает коллекцию HttpCookie, отправленных в текущем запросе

Filter Определяет объект фильтра, который может быть использован для внесения изменений в данные HTTP перед отправкой их клиенту

IsClientConnected Позволяет получить информацию о том, подключен ли клиент к серверу

Output Используется для добавления пользовательских данных в возвращаемый клиенту ответ на запрос

OutputStream То же самое, но для добавления двоичных данных

StatusCode Позволяет определить код состояния HTTP для переданных клиенту данных

StatusDescription Позволяет получить строку состояния HTTP для переданных клиенту данных

SupressContent Позволяет получить или установить значение, определяющее, будут ли

данные отправлены клиенту

Кроме того, в классе HttpResponse определены важные методы, представленные в табл. 8.

Таблица 8. Методы класса HttpResponse

Метод Описание

AppendHeader() Добавляет заголовок HTTP в возвращаемые клиенту данные

AppendToLog() Добавляет пользовательскую информацию в файл журнала IIS

Clear() Очищает все заголовки и все содержимое буфера для возвращаемых данных

Close() Закрывает Соединение с клиентом

End() Отправляет все содержимое буфера для возвращаемых данных клиенту, а после этого закрывает соединение

Flush() Отправляет все содержимое буфера для возвращаемых данных клиенту

Redict() Перенаправляет клиента по указанному адресу URL

Write() Добавляет значение в данные, возвращаемые клиенту

WriteFile() Метод многократно перегружен. Используется для направления файла

напрямую браузеру клиента

Наиболее важный и часто используемый метод класса HttpResponse - это метод Write(), который позволяет добавлять значения в набор возвращаемых клиенту данных. Этот метод можно вызывать как явно:

<b>You are:</b>

<%

HttpRequest r;

r = this.Request;

HttpResponse rs;

rs = this.Response;

rs.Write(r.ServerVariables[“HTTP_USER_AGENT”]);

%>

так и косвенно, в стиле классических ASP:

<%=Request.ServerVariables[“HTTP_USER_AGENT”]%>

И в том и в другом случае результат будет одинаковым.

Свойство Page.Application

Свойство Application класса Page обеспечивает доступ к объекту класса HttpApplicationState. Как уже говорилось выше, HttpApplicationState предоставляет разработчикам возможность управления информацией, общей для всех сеансов подключения к приложению ASP.NET. Некоторые наиболее важные свойства HttpApplicationState представлены в табл. 9.

Таблица 9. Свойства типа HttpApplicationState

Свойство Описание

AllKeys Возвращает набор всех объектов, относящихся к состоянию приложения

Count Позволяет получить количество объектов в наборе, относящихся к состоянию приложения

Keys Возвращает объект NameObjectCollectionBase.KeysCollection, используемый для хранения всех ключей состояния приложения объекта. NameObjectCollectionBase

StaticObjects Позволяет получить доступ ко всем объектам, объявленным в теге

<х runat=server> </х> в файле приложения ASP.NEТ

При создании переменной, которая будет доступна из всех сеансов подключения, необходимо использовать пару имя-значение (например, firstUser = "chuck"), а затем добавить ее во внутреннюю коллекцию KeysCollection. Для этого можно использовать индексатор класса:

public class WebForml : System.Web.UI.Page

{

protected void Page_Load(object sender. EventArgs е)

{

if (!IsPostBack)

{

// Создаем переменную уровня всего приложения Application["AppString"] = "Initial Арр Yalue";

}

}

...

}

Если нам затем потребуется обратиться к этому значению, просто извлечем его

при помощи того же свойства:

string appVar = "Арр: " + Application["AppString"];

Если нам затем потребуется обратиться к этому значению, просто извлечем его

при помощи того же свойства:

string appVar = "Арр: " + Application["AppString"];

Комментариев нет:

Отправить комментарий