Пространство имен System: :Web (Система Сеть) содержит потезнын класс HttpRequest. Данный класс используется для считывания различных значении, которые клиент отсылает в запросе по протоколу передачи гипертекстовых фантов HTTP Эти значения, принимаемые по протоколу передачи гипертекстовых фантов HTTP, затем будут использованы классическими (те использующими общий шлюзовой ишер-фейс CGI (Common Gateway Interface)) программами или программами, использующими интерфейс прикладного программирования Internet-сервера ISAPI (Internet Server API), которые обрабатывают Web-запрос. На этой основе строится обработка данных на более высоком уровне. В табл. 10.1 приведены некоторые наиболее часто используемые свои-ства класса HttpRequest. Если вы знакомы с протоколом передачи гипертекстовые файлов HTTP, смысл этих свойств должен быть вам понятен Исчерпывающая инфор мация об этих и других свойствах класса HttpRequest содержится в документации по .NET Framework.
Свойство Request (Запрос) класса Page (Страница) возвращае! объект 'tt; quest. Из свойств объекта HttpRequest можно извлечь любую необходимую информацию. Например, следующий код (этот код не содержится ни в одном примере) определяет длину (в байтах) содержимого, отосланного клиентом, и записывает поточенную информацию в объект Response (Ответ). Затем эта информация отображается в окне-броузера.
Таблица 10.1. Общедоступные свойства экземпляра класса HttpReguest
Свойство | Смысл |
AcceptTypes | Строковый массив принимаемых клиентом MIME-типов |
Browser (Броузер) |
Информация о возможностях броузера клиента |
ContentLength | Длина (в байтах) содержимого, отосланного клиентом |
Cookies (Небольшие фрагменты данных о предыстории обращений конкретного пользователя к конкретному Web-серверу, автоматически создаваемые сервером на машине пользователя) | Коллекция небольших фрагментов данных о предыстории обращений конкретного пользователя к конкретному Web-серверу, автоматически создаваемых сервером на машине пользователя (cookies), отосланных клиентом |
Form (Форма) | Коллекция переменных формы |
Headers (Заголовки) | Коллекция заголовков для протокола передачи гипертекстовых файлов HTTP |
HttpMethod | Метод передачи по протоколу передачи гипертекстовых файлов HTTP, используемый клиентом (например, СЕТ (Получить) или POST (Отправить почтовое сообщение)) |
Params | Объединенная коллекция, которая состоит из элементов Querystnng, Form (Форма), Server-Variables И Cookies (Небольшие фрагменты данных о предыстории обращений конкретного пользователя к конкретному Web-серверу, автоматически создаваемые сервером на машине пользователя) |
Path (Путь) | Виртуальный запрос текущего пути |
OueryString | Коллекция строковых переменных запроса, посылаемого по протоколу передачи гипертекстовых файлов HTTP |
ServerVanables | Коллекция переменных Web-сервера |
Page *p = dynamic_cast<Page *>(sender);
// Страница *р = dynamic_cast <Страница *> (отправитель);
HttpRequest *request = p->get_Request();
int length = request->ContentLength; // длина
HttpResponse *response = p->get_Response();
response->Write(String::Format( // ответ-> Запись (Строка:: Формат
"ContentLength = {0}<br>", _box(length))); // длина
Коллекции
Многие полезные коллекции представлены как свойства объекта HttpRequest. Эти коллекции принадлежат типу NamedValueCollection (в пространстве имен System: :Collections: :Specialized (Система::Коллекции::Специализированное пространство имен)). Получить значение переменной из коллекции можно при помощи строкового ключа. Например, следующий код извлекает из коллекции ServerVan-ables значение переменных сервера QUERY_STRING и HTTP_USER_AGENT.
Page *p = dynamic_cast<Page *>(sender);
// Страница *р = dynamic_cast <Страница *> (отправитель);
HttpRequest *request = p->get_Request();
HttpResponse *response = p->get_Response();
String *strQuery = // Строка
request->ServerVariables->get_Item( // запрос
"QUERY_STRING");
response->Write(String::Format( // ответ-> Запись (Строка:: Формат (
"QUERY_STRING = {0}<br>",strQuery));
String *strAgent = // Строка
request->ServerVariables->get_Item( // запрос
"HTTP_USER_AGENT");
response->Write(String::Format( // ответ-> Запись (
Строка:: Формат ( "HTTP_USER_AGENT = {0}<br>",
strAgent));
Если вслед за унифицированным указателем информационного ресурса (URL) соответствующего .aspx-файла ввести строку запроса ?foo=3, приведенный выше код отобразит в окне броузера что-то примерно следующее:
QUERY_STRING = foo=3
HTTP_USER_AGENT = Mozilla/4.0
Подобные переменные при программировании классического (т.е основанного на общем шлюзовом интерфейсе CGI (Common Gateway Interface)) Web-сервера играют решающую роль. Используя переменные среды, Web-сервер передает информацию CGI-скрипту или программе. На всякий случай ASP.NET обеспечивает доступ и к этой низкоуровневой информации.
Стандартная задача состоит в том, чтобы извлечь информацию из элементов управления формы. В HTML-коде элементы управления идентифицируются атрибутом name (имя). Этот атрибут сервер использует для определения соответствующего значения. Способ передачи данных из формы серверу зависит от того, какой метод использует форма в протоколе передачи гипертекстовых файлов HTTP: GET (Получить) или POST (Отправить почтовое сообщение).
Если используется метод GET (Получить), данные, введенные в форму, кодируются как часть строки запроса. Чтобы затем извлечь нужные значения, используется коллекция QueryString Если же используется метод POST (Отправить почтовое сообщение), данные, введенные в форму, передаются как содержимое после заголовка протокола передачи гипертекстовых файлов HTTP. В этом случае для извлечения значения элементов управления используется коллекция Forms (Формы). Чтобы узнать, какую коллекцию следует использовать, нужно определить значение (GET (Получить) или POST (Отправить почтовое сообщение)) переменной сервера REQUEST_METHOD. (Если переменная REQUEST_METHOD имеет значение GET (Получить), используется коллекция QueryString Если же ее значение равно POST (Отправить почтовое сообщение), используется коллекция Forms (Формы))
Если вы используете ASP NET, тогда вам не стоит волноваться о том, какой метод протокола передачи гипертекстовых файлов HTTP использовался при запросе В ASP NET имеется коллекция Params, которая представляет собой объединение (в математическом смысле) коллекций ServerVariables, QueryString, Forms (Формы) и Cookies (Небольшие фрагменты данных о предыстории обращений конкретного пользователя к конкретному Web-серверу, автоматически создаваемые сервером на машине пользователя)
Пример программы
Идеи, о которых мы рассказали выше, проиллюстрируем на примере простой страницы Squares. aspx Эта страница отображает столбец с квадратами натуральных чисел Числа, квадраты которых будут выведены, ограничиваются значением, вводимым в форме Страница GetSquares aspx отсылает запрос, используя метод GET (Получить), а страница PostSquares.aspx отсылает запрос, используя метод POST (Отправить почтовое сообщение) Пользовательский интерфейс обоих приложений тождественен (Рисунок 10.11)
Ниже приведен HTML-код страницы GetSquares.aspx Обратите внимание, что мы используем чистый HTML-код И, за исключением директивы Page (Страница), которая используется для включения режима трассировки, признаки использования ASP NET отсутствуют
<! - - GetSquares.aspx - ->
<%@ Page Trace = "false" %>
<!—- Трассировка Страницы --->
<html> <head> </head>
<body> <!-— тело -—>
<P>This program will print a column of square numbers</P>
<!--- Эта программа будет печатать столбец квадратов чисел --->
<form method="get" action = Squares.aspx>
<!--- метод формы = "получить" действие = Squares aspx -->
How many
<!—- Сколько -->
<INPUT type=text size=2 value=5 name=txtCount>
<P></P>
<INPUT type=submit value=Squares name=cmdSquares>
</form>
</body> <!— тело -->
</html>
Тэг form (форма) имеет атрибуты, при помощи которых указывается метод (в данном случае GET (Получить), а не POST (Отправить почтовое сообщение)) и действие (запрос на страницу Squares aspx) Элементы управления имеют атрибут name (имя), с помощью которого сервер извлекает нужное значение
Запустите страницу GetSquares aspx и щелкните на кнопке "Squares" ("Квадраты чисел") Будет отображена некоторая служебная информация, относящаяся к протоколу передачи гипертекстовых файлов HTTP За ней последует столбец с квадратами чисел Поскольку режим трассировки включен, то ASP NET отображает на странице также и подробности запроса На рис 1012 приведены результаты выполнения запроса, в котором используется метод GET (Получить)
Можно видеть, что данные, введенные в форму, закодированы как часть строки запроса Длина содержимого равна нулю, поскольку используется метод GET (Получить), а не POST (Отправить почтовое сообщение) Если прокрутить трассировочную информацию дальше, можно увидеть еще много интересных сведений Например, там приводится коллекция QueryString
А теперь давайте рассмотрим страницу PostSquares aspx Обратите внимание, — в этот раз тэг form (форма) указывает, что используется метод POST (Отправить почтовое сообщение) Остальные параметры такие же, как и в случае страницы GetSquares . aspx
<!-- postSquares.aspx -->
<%@ Page Trace = "false" %>
<html>
<head>
</head>
<body> <!— тело —>
<P>This program will print a column of squares</P>
<!— Эта программа будет печатать столбец квадратов —>
<form method="post" action = Squares.aspx> How many:
<!— Сколько: —>
<INPUT type=text size=2 value=5 name=txtCount> <P></P>
<INPUT type=submit value=Squares name=cmdSquares> </form>
</body> <i— тело —> </html>
Запустите страницу PostSquares.aspx и щелкните на кнопке Squares (Квадраты чисел) Снова будет отображена некоторая информация, относящаяся к протоколу передачи гипертекстовых файлов HTTP. За ней последует столбец, содержащий квадраты чисел Поскольку режим трассировки включен, то ASP.NET отображает на странице также и подробности запроса. На Рисунок 10.13 приведены результаты выполнения запроса POST (Отправить почтовое сообщение).
Поскольку используется метод POST (Отправить почтовое сообщение), то строка запроса пуста Длина содержимого равна 29. Данные, введенные в форму, передаются в текстовом виде вслед за заголовком протокола передачи гипертекстовых файлов HTTP.
Если прокрутить трассировочную информацию дальше, то теперь можно увидеть коллекцию Form (Форма) Именно с помощью этой коллекции ASP.NET обеспечивает доступ к данным, введенным в форме в случае использования метода POST (Отправить почтовое сообщение)