Asp объект response


Содержание

Asp объект response

Технология Microsoft ASP представляет собой совокупность серверных средств для динамического создания Web-документов. Она позволяет:

  • получать и обрабатывать на сервере данные, введенные пользователем при помощи формы;
  • динамически создавать web-документы, не зависящие ни от платформы, ни от браузера клиента;
  • обеспечивать динамический доступ к данным, находящимся на сервере, в частности, к серверным базам данных (при таком способе доступа HTML-документ автоматически изменится, как только изменятся хранящиеся на сервере данные);
  • использовать серверные компоненты, предназначенные для решения типовых задач (таких, например, как циклическая смена рекламных баннеров и др.);
  • осуществлять аутентификацию пользователя;
  • получать информацию о браузере клиента;
  • создавать и читать ключики на стороне клиента;
  • (Мы знаем, что последние две функции можно выполнить клиентскими средствами, но серверными тоже можно!)

    Что представляет собой asp-сценарий?

    Asp-сценарий — это совокупность команд на языке JScript или VBScript. В отличие от команд JavaScript-сценариев, команды asp-сценариев могут «перемешиваться» с HTML-тэгами, но каждая команда должна быть заключена в символы «&lt%, %>«.

    Первой строкой файла, содержащего asp-сценарий, должна быть директива:

    &lt%@ language=»JScript»%>

    Файл, содержащий asp-сценарий, должен иметь расширение asp.

    Код asp-сценария автоматически выполняется web-сервером при поступлении запроса от браузера клиента. Результатом работы asp-сценария будет HTML-код. По виду получившегося таким образом HTML-документа пользователь не сможет узнать был ли он сгенерирован web-сервером или физически находился на диске.

    Простой пример

    Напишем asp-сценарий, который будет динамически создавать документ с текстом «HELLO, WORLD. » (т.е. результат его работы будет выглядеть точно так же, как файл index.html, созданный нами в конце предыдущей лекции). Код этого сценария будет выглядеть следующим образом:

    Мы видим, что серверные команды, заключенные в символы &lt%, %> соседствуют с уже знакомыми нам HTML-тэгами.

    «Сердце» ASP — объекты Request и Response

    Конечно, для того, чтобы получить такой же результат, как в только что приведенном нами примере, использовать серверный сценарий нецелесообразно. Для этого мы могли прекрасно обойтись средствами HTML. Но вот, если нужно использовать на сервере информацию, полученную от клиента, то здесь потребуются уже серверные средства.

    Язык JScript является объектно-ориентированным. 6 объектов создаются автоматически web-сервером, поэтому их разработчику не нужно заботиться об их создании; еще несколько объектов (их называют серверными компонентами) создаются средствами asp-сценариев. Для нас наиболее важными (по крайней мере, поначалу) будут два объекта:

  • Request , содержащий информацию, введенную пользователем;
  • Response , «отвечающий» за передачу информации от сервера клиенту.

    Метод Response.write()

    В предыдущем примере мы динамически сформировали фрагмент HTML-кода, присвоив его переменной s , и применив оператор: &lt%=s%> . Альтернативой такому способу вывода значения переменной ( s ) является использование метода write() объекта Response. Так, в предыдущем примере мы могли с тем же успехом написать:

    Применение метода Response.write() является основным способом динамической генерации HTML-документов.

    Методы объекта Request : Form() и QueryString()

    Как уже было сказано, объект Request «отвечает» за получение данных от клиента.

    Клиент может передать данные серверу двумя способами:

  • С помощью формы;
  • Через параметры, указанные (в гиперссылке) после знака: ? , следующего за адресом и именем сценария (например:

    Пусть данные вводились при помощи формы. Как Вы, должно быть, помните, формы имеют атрибут method , который может принимать два значения:

  • POST , если объем вводимых данных заранее неизвестен;
  • GET , если передается значение одной — двух переменных. (Напомним также, что связь HTML-документа, содержащего форму для ввода данных, и серверного сценария, получающего и обрабатывающего данные из этой формы, осуществляется с помощью атрибута action тэга form . Значением этого атрибута как раз и является адрес серверного сценария.)

    Если в форме используется метод POST , то чтение данных в серверном сценарии обеспечивается методом: Request.Form() ;
    если используется метод GET или значения передаются как параметры, без формы, то чтение данных в серверном сценарии обеспечивается методом: Request.QueryString() .

    Синтаксис вызова этих методов таков:

    Замечание. Поскольку при использовании метода GET передаваемая информация отображается в адресной строке, для передачи секретной информации (в частности, паролей) следует использовать метод POST.

    Задание. Создайте HTML-документ с формой, с помощью которой пользователь смог бы ввести свои анкетные данные (фамилию, имя, возраст, род занятий). Напишите asp-сценарий, который принимал бы данные и выводил их в динамически создаваемый документ.

    Указанный способ подходит для передачи данных из текстовых полей ( &lt input type=text. ), текстовых областей ( &lt textarea. ), полей для передачи «пароля» ( &lt input type=password. ) и скрытых полей ( &lt input type=hidden. ).

    С другими элементами форм дело обстоит несколько сложнее. Рассмотрим их подробнее.

    Элемент формы

    Обращение на сервере

    Селекторный список

    (с единственным выбором)

    Выберите день недели:

    См. ПРИМЕР Доступ к значениям, передаваемым с помощью радиокнопок или checkbox‘ов, осуществляется аналогично.

    Итак, мы научились передавать данные серверному сценарию. Возникает вопрос: «как сохранить данные на сервере?«. Ясно, что сохранить данные можно в текстовом файле или в базе данных или . Вопросам связи asp-сценария с серверными базами данных и будет посвящена следующая лекция.

    Asp объект response

    Этот текст предназначен для тех, кто никогда не имел дела с ASP и вообще смутно себе представляет возможности программирования на стороне сервера. Я ставил себе задачу создать у читателя общее представление о предмете. Отдельные неточности при этом менее важны — пожалуйста, громко не ругайтесь.

    Общие сведения

    ASP (Active Server Pages) – это мощная технология от Microsoft, позволяющая легко разрабатывать приложения для WWW. ASP работает на платформе Windows NT и IIS (Internet Information Server), начиная с версии 3, хотя вроде есть реализации на других платформах. ASP – это не язык программирования, это внутренняя технология, позволяющая подключать программы к Web-страницам. Основа успеха ASP – простой скриптовый язык (Visual Basic Script или Java Script) и возможность использования внешних COM-компонент.

    Как это все происходит?

    Вы пишете программу и складываете в файл на сервере. Браузер клиента запрашивает файл. Файл сначала интерпретируется сервером, на выходе производится HTML-код. Этот HTML посылается клиенту. Файлы с программами имеют расширение .asp. Файлы asp – это обычные текстовые файлы, содержащие исходные тексты программ. Файлы делаются с помощью любого текстового редактора. Каталог, в котором размещены файлы asp должен иметь права на выполнение, так как сервер исполняет эти файлы, когда браузер их запрашивает. Собственно программы пишутся на любом скриптовом языке, который установлен в системе. По умолчанию поддерживаются VBScript и JavaScript. Можно доустановить другие (например, Perl). Если ничего специально не указывать используется VBScript. В дальнейшем будем ссылаться только на него. Программные фрагменты заключаются в скобки . Можно ставить открывающую скобку в начале файла, закрывающую – в конце, все что между ними – программа на Visual Basic’е.

    Какие средства есть для программирования?

    Web – нормальная среда программирования, если правильно понять, что есть что. В VBScript есть все нормальные конструкции структурного программирования (if, while, case, etc). Есть переменные (описывать не обязательно, тип явно не задается). Поддерживаются объекты. Работа с ними обычная – Object.Property, Object.Method. Есть ряд встроенных объектов (Request, Response, Session, Server, Connection, Recordset). Можно доустанавливать другие компоненты (скачивать, покупать, программировать), например для работы с электронной почтой.

    Вывод

    Понятия «экран», куда можно выводить данные нет. Все, что надо показать пользователю, выбрасывается в выходной поток на языке HTML. Браузер пользователя интерпретирует этот HTML. Для упрощения вывода существует объект Response . Вывод осуществляется с помощью метода Write .

    Так производится запись во внутренний буфер объекта Response. Когда скрипт заканчивает работу, весь буфер выдается клиенту. Надо заметить, что клиент получает «чистый» HTML, таким образом программы на ASP не зависят от клиентского ПО, что очень важно. Если внутри выводимой строки нужно использовать кавычку, кавычка удваивается. Другие методы и свойства Response позволяют управлять выводом. Так Response.Buffer регулирует, получает ли клиент данные по мере из записи в Response, или все сразу по завершении исполнения страницы. Метод Response.Redirect перенаправляет браузер на другую страницу. Чтобы им пользоваться, нельзя до него на странице использовать Response.Write.

    Программа на ASP не может явно спросить пользователя о чем-то. Она получает данные из других страниц, либо через URL. Передаваемые параметры помещаются во входной поток и доступны через объект Request . Чтобы передать переменную var в программу test.asp , надо написать:

    Чтобы из программы получить значение этой переменной, надо написать:

    Несколько переменных разделяется знаком &:

    Кроме того, чтобы задавать параметры в URL, можно воспользоваться формами HTML. В вызывающей странице пишем так:

    Так это выглядит:

    При этом пользователь увидит форму из одного поля ввода (var1), в нем будет значение по умолчанию «default». Второе поле (var2) будет невидимо и будет передавать всегда фиксированное значение «var2value». Кнопка «Submit Form» завершает заполнение формы и передает все переменные на test.asp (action). Если method=»get», переменные передаются через URL (test.asp?var1=default&var2=var2value). Если method=»post», передаются вместе с запросом так, что внешне передача переменных не заметна. В вызываемой программе безразлично, какой метод изпользовался (почти). Если у вас нет специальных аргументов за метод GET, используйте метод POST.

    Формы

    Формы HTML используются для организации диалога с пользователем. Поддерживаются стандартные элементы управления. Все многообразие задается немногими тэгами:

    • INPUT (с параметром TYPE=)
    • SELECT
    • TEXTAREA

    Описание – в документации по HTML.

    Взаимосвязь между отдельными страницами

    Обычно сервер WWW не хранит состояние приложения, т.е. все запросы взаимонезависимы, и нет стандартного способа понять, что несколько запросов пришли от одного и того же пользователя. Но это очень нужно для разработки полноценных приложений и является одной из главных проблем разработки Web-приложений.

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

    ASP, используя cookies, предоставляет программисту более простое средство — объект Session (сессия). Сессия стартует, когда новый пользователь обращается к любому asp-файлу приложения. Сессия заканчивается при отсутствии активности пользователя в течение 20 минут, либо по явной команде. Специальный объект Session хранит состояние сессии. Туда можно записывать переменные, которые доступны из любой страницы в этой сессии. Записать данные в этот объект можно просто:

    Считать потом еще проще:

    Сессия, таким образом, – это еще один метод передачи данных между страницами. Одна страница пишет данные в сессию, другая – берет потом оттуда.

    Наряду с объектом Session существует объект Application . Если сессия создается для каждого нового пользователя, до Application существует в единственном экземпляре, и может использоваться всеми страницами приложения.

    Управление приложением

    Программисту предоставляется возможность реагировать на 4 события: старт/стоп приложения и старт/стоп каждой сессии. Для реализации этих событий предназначен файл global.asa , который должен располагаться в корневом каталоге приложения. Вот его примерный скелет:

    Нужно «просто» вписать Ваш код на соответствующее место. Нужно заметить, что отлаживать код для global.asa довольно непросто, так как он выполняется при очень специфических обстоятельствах (к примеру при старте или остановке сервера).

    Использование внешних компонент

    Если на сервере установлены дополнительные компоненты, их можно использовать из ASP. Стандартные объекты (например из библиотек ADO (Connection и Recordset) и Scripting (Dictionary, FileSystemObject)) доступны всегда. Установка новой компоненты обычно состоит в копировании dll-файла в каталог на сервере и ее регистрации с помощью программы regsvr32.exe. [В COM+ используется своя процедура инсталляции объектов, это однако не влияет на использования объектов.]

    Создать экземпляр объекта можно так:

    Class.Object указываются в документации на компоненту. В переменной var запоминается ссылка на созданный экземпляр объекта. Когда объект не нужен, ссылку нужно обнулить с помощью команды:

    Пожалуйста всегда обнуляйте все ссылки на объекты, когда они больше не нужны. Теоретически это должно происходить автоматически при завершении процедуры/страницы, однако в стандартной сборке мусора есть определенные «проблемы».

    В остальном использование компоненты зависит от самой этой компоненты.

    Работа с базами данных

    Из ASP можно легко и просто работать с любыми базами данных. Это делается через две промежуточные технологии: ODBC и ADO.

    ODBC позволяет организовать доступ к любым базам данных через унифицированный интерфейс с помощью языка SQL. Специфика конкретных СУБД учитывается при помощи специальных драйверов БД. Такие драйверы существуют для всевозможных СУБД (в частности SQL Server, Oracle, Access, FoxPro). Поддержка ODBC обеспечивается на уровне операционной системы Windows (NT). Настройка – через Control Panel/ODBC. Базовым понятием является источник данных или data source. Источник данных – это совокупность сведений о базе данных, включая ее драйвер, имя компьютера и файла, параметры. Чтобы пользоваться базой надо создать источник данных для нее. Важно, чтобы источник данных был «системным», в отличии от «пользовательского». После этого надо лишь знать имя источника данных. [В настоящее время ODBC отступает перед натиском технологии OLE DB. На практике это однако практически ничего не изменяет. Вместо имени источника данных нужно использовать Connection String, в которой указывается имя ODBC-драйвера и все его параметры.]

    ADO – это совокупность объектов, доступных из ASP, позволяющих обращаться к источнику данных ODBC [или OLE DB]. Фактически нужны лишь 2 объекта – Connection , представляющий соединение с базой данных и Recordset , представляющий набор записей, полученный от источника. Сначала необходимо открыть соединение, потом к нему привязать Recordset, потом, пользуясь методами Recordset’а, обрабатывать данные. Вот пример:

    Если команда SQL не возвращает данных, recordset не нужен, надо пользоваться методом Conn. Execute (SQL_COMMAND).

    Если Вы хотите вызывать хранимые процедуры сервера БД с параметрами, нужно воспользоваться объектом Command , который в свою очеред содержит объекты Parameter .

    Методики программирования, советы


    Описание переменных

    VBScript — очень нетребовательный к программисту язык. Так он не требует описывать переменные и не содержит явных типов данных. Все переменные принадлежат одному типу Variant . Из-за отсутствия описаний могут произойти очень трудно обнаруживаемые ошибки. Одна опечатка может стоить полдня поисков.

    Однако, есть возможность явно потребовать описания переменных. Для этого первой строкой в ASP-файле нужно написать Option Explicit . После этого обращение к переменной, которая не была объявлена с помощью Dim , вызывает ошибку с указанием номера строки.

    Кстати, где расположены описания Dim в процедуре — совершенно не важно. Они могут стоять как до использования переменной, так и после, и даже в цикле. Видимо они отрабатываются препроцессором. Явно задать тип переменной с помощью Dim Var as Typ , как в Visual Basic, все равно нельзя.

    Чередование ASP/HTML

    Если нужно выдать большой кусок HTML, можно не пользоваться Response.Write. Если в asp-файле встречается кусок текста вне скобок , он трактуется просто как HTML, который надо вывести. Пример:

    Обработка ошибок

    Для отслеживания ошибок используется специальный объект Err . Он устанавливается в ненулевое значение, если предыдущая команда породила ошибку. Ее можно проверять с помощью If, и таким образом реагировать на ошибки. Чтобы из-за ошибки не прерывалось выполнение программы, в начале нужно включить команду

    Включение других файлов

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

    Важно: все includes в тексте отрабатываются до исполнения файла. Т.е. даже если include стоит внутри if, то сначала будут включены все includes во всех ветках, и только потом, во время исполнения, будет принятно решение, какую ветку выполнять. Т.е. следующий код не дает условного включения файлов:

    Обработка форм

    Если надо что-то спросить у пользователя и на основании этого что-то сделать, в простейшем случае создается два файла: один с формой, второй – с ее обработчиком. Обработчик выполняет все действия. Пример:

    Рекурсивная обработка форм

    Удобный метод состоит в том, чтобы сбор данных и обработку осуществлял один и тот же файл. Для этого пишется asp, в котором есть разные разделы. Специальная переменная отвечает за выбор раздела при запуске. Пример:

    Переменные HTTP

    Запрос от браузера, кроме запрашиваемой страницы несет еще некоторые данные. Эти данные, например, IP-адрес клиента, доступны через специальные переменные объекта Request. IP-адрес – Request(«REMOTE_ADDR»). Другие — см.документацию (ASPSamp\Samples\srvvar.asp).

    Переадресация

    Очень легко написать на ASP скрипт, который будет производить некоторые расчеты, и в зависимости от результатов переадресовывать браузер на разные URL (например, подставлять нужный баннер). Делается это так:

    Только надо следить, чтобы до выполнения команды redirect ничего не было записано в Response (даже коментарии HTML).

    Электронная почта

    Одна из часто встречающихся задач – отправить электронную почту с Web-страницы. На первый взгляд, можно просто написать

    Но это приводит к тому, что при отправке формы делается попытка на клиентской машине запустить почтовую программу и создать новое сообщение с данными формы. Если это не получается (почтовая программа не настроена, пользователь не отправил почту, и т.д.) — письмо и не будет отправлено. Гораздо надежнее работает серверное решение.

    Для этого существуют внешние компоненты, есть и бесплатные. Например, компонента Jmail от Dimac. Все, что для нее нужно – это адрес SMTP-сервера. Вот пример ее использования:

    Http Response Класс

    Определение

    Инкапсулирует данные ответа HTTP, полученные при выполнении операции ASP.NET. Encapsulates HTTP-response information from an ASP.NET operation.

    Примеры

    В следующем примере рисуются три перекрывающихся прямоугольника при запросе страницы. The following example draws three overlapping rectangles when the page is requested. Код начинается с присвоения ContentType свойству значения Image/JPEG, чтобы вся страница отображалась как изображение в формате JPEG. The code begins by setting the ContentType property to image/jpeg, so that the entire page will be rendered as a JPEG image. Затем код вызывает Clear метод, чтобы предотвратить отправку из этого ответа лишнего содержимого. The code then calls the Clear method to ensure that no extraneous content is sent with this response. Затем код задает BufferOutput для свойства значение true, чтобы страница полностью обрабатывалась перед отправкой запрашивающему клиенту. Next, the code sets the BufferOutput property to true so that the page is completely processed before it is sent to the requesting client. Затем создаются два объекта, используемые для рисования прямоугольников: a Bitmap Graphics и. Two objects used to draw the rectangles are then created: a Bitmap and a Graphics object. Переменные, созданные на странице, используются в качестве координат для рисования прямоугольников и строки, которая отображается внутри самого крупного прямоугольника. The variables created in the page are used as coordinates to draw the rectangles and a string that appears inside the largest rectangle.

    Когда рисуются три прямоугольника и строка, отображаемая внутри них, Bitmap Stream объект сохраняется в объекте OutputStream , связанном со свойством, а его формат имеет значение JPEG. When the three rectangles and the string that appears inside them are drawn, the Bitmap is saved to the Stream object that is associated with the OutputStream property and its format is set to JPEG. Код вызывает Dispose методы и Dispose для освобождения ресурсов, используемых двумя графическими объектами. The code calls the Dispose and Dispose methods to release the resources used by the two drawing objects. Наконец, код вызывает Flush метод для отправки буферизованного ответа запрашивающему клиенту. Lastly, the code calls the Flush method to send the buffered response to the requesting client.

    В коде HttpResponse на объект ссылается ключевое слово Response . In code, the HttpResponse object is referred to by the keyword Response . Например, Response.Clear() ссылается HttpResponse.Clear на метод. For example, Response.Clear() refers to the HttpResponse.Clear method. Класс имеет свойство с именем Response , которое HttpResponseпредоставляет текущий экземпляр. Page The Page class has a property that is named Response that exposes the current instance of HttpResponse.

    Комментарии

    Методы HttpResponse и свойства класса предоставляются Response через свойство HttpApplicationклассов, HttpContext, Pageи UserControl . The methods and properties of the HttpResponse class are exposed through the Response property of the HttpApplication, HttpContext, Page, and UserControl classes.

    Следующие методы HttpResponse класса поддерживаются только в сценариях обратной передачи, а не в сценариях асинхронной обратной передачи: The following methods of the HttpResponse class are supported only in post back scenarios and not in asynchronous post back scenarios:

    ASP. Основы. Объекты и компоненты. Доступ к базам данных

    Dynamic HTML представляет собой основное средство программирования клиента для Microsoft Internet Explorer 4.0 и выше, но такие программы просмотра Web, как Netscape Navigator, не поддерживают Dynamic HTML. На самом деле очень малая часть функциональности клиентской части, поддерживаемой различными программами просмотра, может рассматриваться как действительно кросс-платформенная.

    Если Вы хотите разработать Интернет-узел, открытый для доступа самым различным программам просмотра, то должны перенести программирование с клиента на сервер. Такую возможность предоставляют Microsoft ASP (Active Server Pages — активные серверные страницы). По сути ASP не что иное, как сценарий на VBScript, который исполняется на сервере. Когда запрашивается страница, этот сценарий порождает HTML-текст. Это ключевая особенность ASP — клиент никогда не видит вашего кода, а только результирующий HTML, который воспринимает любая программа просмотра.

    Листинг 4.1 демонстрирует простую ASP-страницу, которая создает приветствие в соответствии со временем суток. В нем текущий час определяется при помощи кода Hour(Now), где Now — функция VBScript, возвращающая текущий момент времени и дату. Если текущий час меньше 12, то приветствие задается в форме «Доброе утро!» От полудня до шести вечера сообщение имеет вид «Добрый день!», а после шести — «Добрый вечер!»

    Листинг 4.1.Простой пример ASP.

    Simple ASP Example

    11 And Hour(Now) 17 Then

    strGreeting = «Добрый вечер!»

    Обратите внимание на код в листинге, окруженный специальными символами: угловыми скобками и знаками процента ( ). Такие символы означают, что это серверный код, который выполняется перед тем, как страница будет на самом деле послана программе просмотра. Если бы Вы посмотрели в Internet Explorer на результирующий HTML-текст, то увидели бы следующее (в предположении, что сейчас еще не вечер, но уже не утро):

    Simple ASP Example

    В этом-то и состоит суть ASP. Результат исполнения кода — обыкновенный HTML! Эту страницу можно просматривать любой программой просмотра: не только Internet Explorer, но и, например, Netscape Navigator. Иными словами, ASP предоставляет разработчику подлинную платформенную независимость

    У представленного кода есть еще несколько особенностей. Обратите внимание на самую верхнюю строчку — она определяет, на каком языке написан сценарий на данной странице:

    Скорее всего, Вы будете писать свои сценарии на VBScript, но ASP поддерживает и JavaScript. В отличие от сценариев на клиентской стороне, здесь выбор языка абсолютно не создает проблем совместимости с различными программами просмотра, поскольку весь код исполняется на сервере.

    А теперь обратите внимание на ту строку, где и происходит генерация HTML-текста. Здесь для вывода приветствия используется переменная:

    Переменная strGreeting заключена в угловые скобки со знаками процента, как и весь остальной серверный код, но, кроме того, ей предшествует знак равенства. Такая конструкция играет важную роль в ASP, указывая, что в данное место HTML-страницы нужно вставить текущее значение этой переменной.

    Объекты и компоненты.На самом простом уровне создание ASP-страницы — это ни что иное, как написание серверного кода для получения ожидаемого результата. Но VBScript не является полнофункциональным языком и, как только Вы приступаете к построению более сложных страниц, его выразительных средств начинает не хватать. Так, в VBScript нет встроенных функций доступа к данным; не умеет он и открывать текстовые файлы. Собственно говоря, в VBScript отсутствуют какие-либо встроенные средства доступа к каким бы то ни было внешним источникам данных. Так как же в таком случае при помощи ASP выполняются такие сложные действия, как доступ к данным? Ответ будет таким: нужно дополнить VBScript объектами и компонентами ASP.

    ASP-объекты и компоненты — это не что иное, как компоненты ActiveX, подобные обычным DLL ActiveX, с которыми Вы наверняка работали в Microsoft Visual Basic. Различие между объектами и компонентами ASP состоит в том, каким образом они появляются в программе. ASP-объекты — это элементы управления ActiveX, которые в коде на VBScript доступны всегда: их не нужно создавать явно. В число объектов ASP входят Application, Session, Request, Response и Server. А вот ASP-компоненты представляют собой DLL, существующие вне структуры ASP. Эти компоненты могут быть написаны на любом языке, а некоторые по­лезные ASP-компоненты просто поставляются в комплекте с Visual InterDev. ASP-компо­ненты нужно явно создавать в коде. ASP поддерживает компоненты Database Access, File Access, Browser Capabilities, Ad Rotator и Content Linking.

    Файл GLOBAL.ASA.Одна из главных трудностей разработчика для Интернета, независимо от того, какую технологию он использует, состоит в том, как сложно создать в Интернете настоящее приложение. Взаимодействие программы просмотра и Web-сервера представляет собой по сути лишенную состояния транзакцию, в ходе которой сервер посылает клиенту Web-страницу и затем забывает о его существовании. Когда клиент запрашивает другую Web-страницу, сервер ничего не помнит о предыдущем запросе. Коренная проблема для всех Web-приложений такова: как показать, что это именно приложение?


    Определить приложение в среде Microsoft Windows довольно просто. Приложение запуска­ется двойным щелчком значка и завершается, когда в меню File выбран пункт Exit. В проме­жутке между двумя этими событиями данные хранятся в переменных. Но для Интернет-при­ложений это не так. Как определить, когда приложение начинается, а когда заканчивается? Можно сказать, что приложение начало работу, если пользователь зашел на узел и просмат­ривает одну из его страниц. Но что если он переходит к другому узлу, а через пять минут возвращается? Приложение все еще активно? А если пользователь отсутствовал час или два?

    Проблема определения моментов запуска и завершения приложения оказывает серьезное влияние на правильное управление переменными и последовательностью выполнения. К счастью, ASP предлагает решение. Оно состоит в том, что для определения начала и завер­шения — как всего приложения, так и отдельных пользовательских сессий — используется специальный файл под названием GLOBAL.ASA. На этот файл возложено реагирование на четыре ключевых события узла: Application_OnStart (запуск приложения), Application_OnEnd (завершение приложения), Session_OnStart (начало сессии) и Session_OnEnd (завершение сессии). В листинге 4.2 приведен типичный файл GLOBAL.ASA.

    Листинг 4.2.Файл GLOBAL.ASA.

    Для обозначения разделов сценария GLOBAL.ASA содержит теги

    Хотя GLOBAL.ASA отмечает начало и завершение приложения при помощи событий, оста­ется неясным, что же все-таки составляет собственно приложение. Одна из рабочих форму­лировок, предложенная Microsoft, определяет Интернет-приложение как виртуальный ката­лог со всеми его файлами. Если пользователь запрашивает Web-страницу из виртуального каталога под названием Bookstore, то тем самым он запускает приложение Bookstore, и в GLOBAL.ASA возбуждаются события Application_OnStart и Session_OnStart.

    Согласно этому определению с приложением одновременно могут работать несколько про­грамм просмотра. Но событие Application_OnStart происходит только один раз: когда первый пользователь запрашивает Web-страницу из виртуального каталога. Когда затем страницы из этого ката­лога запрашивают другие пользователи, возбуждается только событие Session_OnStart.

    В то время как приложение может относиться к нескольким программам просмотра, обра­щающимся к одному и тому же множеству Web-страниц, сессия касается какой-то одной программы просмотра, обращающейся к тем же Web-страницам. Для конкретной программы просмотра сессия длится, пока программа продолжает запрашивать страницы виртуального каталога. Если же пользователь не запрашивает Web-страницы (из данного виртуального каталога) на протяжении 20 минут (по умолчанию), сессия завершается, и возбуждается событие Session_OnEnd. Когда в данном виртуальном каталоге завершаются все сессии, возбуждается событие Application_OnEnd.

    В качестве примера рассмотрим следующий сценарий. Два пользователя намереваются посе­тить на Web-узле приложение Magazine. Пользователь 1 оказывается проворнее и быст­ренько запрашивает Web-страницу DEFAULT.ASP. Тут же возбуждаются события Application_OnStart и Session_OnStart. Буквально пятью минутами позже к приложению обращается пользователь 2. Поскольку пользователь 1 как-то проявлял себя в течение последних 20 минут, приложение Magazine активно. Следовательно, возбуждается только событие Session_OnStart, сигнализируя о начале новой сессии. Кроме того, теперь для завершения приложения необходимо, чтобы завершились обе сессии.

    В течение следующих 15 минут пользователь 1 не запрашивает ни­каких страниц приложе­ния Magazine. Поскольку он не проявлял активности на протяжении 20 минут, ASP приходит к выводу, что пользователь 1 закончил свою работу с приложением, и возбуждает событие Session_OnEnd. Но приложение все еще активно, поскольку в течение последних 20 минут к нему обращался пользователь 2.

    Пользователь 2 работает с приложением еще час, то и дело запрашивая новые Web-страницы. Но в конце концов он отключается, а через 20 минут после того, как он покинул узел (точнее, в последний раз запросил Web-страницу приложения), возбуждается событие Session_OnEnd. Поскольку пользователь 2 был последним пользователем данного приложения, оно завершается, и возбуждается событие Application_OnEnd.

    В ASP есть несколько встроенных объектов, которые доступны разработчику. Эти объекты помогают управлять многими вещами: от переменных, до передачи форм. Работать с ними легко, они вызываются из кода напрямую без какого-то особого синтаксиса.

    Объект Application.Объект Application (приложение) позволяет создавать переменные приложения (application variables) — переменные, доступные всем пользователям данного приложения. Все, кто обращается к Web-страницам данного виртуального каталога, могут совместно использовать любую переменную приложения определенную для этого каталога.

    В листинге 4.3 приведен пример программы, которая использует Объект Application. В нем переменная приложения служит для отслеживания времени последнего обращения к страницам приложения.

    Листинг 4.3.Объект Application.

    Эта страница последний раз посещалась:

    Создание переменной приложения сводится к адресации объекта Application именем новой переменной, которую вы хотите создать. Например, следующий код создает новую переменную приложения с именем Company и присваивает ей значение NewTech.

    Имя может быть произвольным, а переменная может содержать любую информацию, будь то число или текст.

    Поскольку такие переменные доступны нескольким пользователям одновременно, вы не сможете гарантировать, что два пользователя не попытаются одновременно присвоить одной и той же переменной разные значения. Для разрешения подобных коллизий объект Application поддерживает методы Lock и UnLock. Метод Lock блокирует весь объект Application, а не только переменную, вы хотите изменить, поэтому сразу же после изменения значения переменной разблокируйте объект:

    Несмотря на то, что переменные приложения пригодны для временного хранения данных, их нельзя использовать для долговременного хранения. Все данные в переменных приложения уничтожаются, когда происходит событие Application_OnEnd. Так что, если вы хотите, чтобы они сохранились после завершения приложения, позаботьтесь о их переносе в файл или базу данных.

    Объект Session.Зачастую разработчиков меньше интересуют данные, совместно используемые несколькими пользователями, зато гораздо больше — данные, связанные с конкретным пользователем. ASP поддерживает переменные для индивидуального пользователя при помощи объекта Session (сессия), который позволяет создавать переменные сессии (session variables).

    Листинг 4.4 демонстрирует, как определить несколько переменных сессии в файле GLOBAL.ASA. Само по себе их определение так же просто, как и в случае переменных приложения. Все, что нужно сделать — это адресовать объект Session именем переменной, которую вы хотите создать. Основное различие между переменными этих объектов — их области видимости. Переменные сессии предназначаются для одного пользователя и живут, пока пользователь поддерживает сессию. Как только в течение 20 минут (по умолчанию) пользователь не обращается к страницам данного виртуального каталога, данные пропадают.

    Листинг 4-..Создание переменных сессии.

    Переменные сессии можно создавать на любой Web-странице или в файле GLOBAL.ASA, а доступны они на любой Web-странице приложения, в котором эти переменные были первоначально созданы. Получить значения переменных сессии можно, считывая их из объекта Session. Следующий фрагмент кода считывает переменные сессии, созданные в листинге 4.4, и выводит их в полях ввода:

    Ранее мы определили Интернет-приложение как лишенные статуса транзакции между Web-сервером и программой просмотра. Как же тогда ASP запоминает переменные сессии для каждого пользователя приложения? Ответ будет таким: эти переменные сохраняются на сервере для каждого клиента. Программа просмотра получает от сервера уникальный идентификатор, позволяющий определить, какой набор переменных кому принадлежит. Клиент этот идентификатор (Globally Unique Identifier, GUID) сохраняет, а впоследствии посылает серверу и получает именно ему предназначенные данные. Таким образом каждый клиент может иметь свой набор данных в каждом Интернет-приложении.

    Осталось сказать, что для установки или считывания впемени жизни сессии (в минутах) применяется свойство Timeout объекта Session:

    Объект Request.Для передачи данные клиенту создается Web-страница, а для передачи данных в обратном направлении программа просмотра использует отправку формы (form submission). В форме содержатся текстовые поля, переключатели и т.п. Клиент размещает введенные данные в этих полях и пересылает пакет серверу. Процессом передачи формы управляют два атрибута тега

    Элемент формы с типом SUBMIT — это кнопка, нажатие которой пользователем заставляет программу просмотра упаковать данные формы и отправить их. Формат пересылки данных определен строго и сервер знает, чего ожидать от клиента. Данные имеют вид пар Поле=Значение,отсылаемых серверу в формате открытого текста. Если в предыдущем примере ввести в поле Name NewTech и info@newtech.com в поле Email, то сценарию DATA.ASP будет послан следующий текст:

    На сервере эти данные можно вновь разобрать по полям и использовать в любых целях. Вот тут-то и нужен объект Request. Он используется в ASP для разбора полученных от клиента данных. Для работы с объектом Request просто сообщите ему имя поля, значение которого хотите получить, и объект вернет вам это значение. Например, следующий код вернет вам значение поля Name:

    Request.Form применяется, когда данные были отправлены методом POST и именно этому сценарию. Если для отправки данных используется метод GET или сценарий вызывается с передачей параметров прямо в гиперссылке

    то для разбота данных применяют свойство Request.QueryString, который работает так же, как Request.Form. Следующий фрагмент кода вернет значение поля Name из гиперссылки:

    Другое свойство — Request.Cookies используются для извлечения информации из кукисов (cookies), отосланных вместе с запросом строке пользовательского агента программы просмотра. А листинг 4.5 демонстрирует применение свойства ServerVariables для определения имени компьютера, с которого клиент вызвал сценарий.

    Листинг 4.5.Определение компьютера пользователя.

    Вы вошли с компьютера

    Переменные сервера представляют широкий круг информации о клиенте и Web-сервере. Доступ к каждой конкретной переменной сводится к чтению соответствующей переменной.

    Объект Response.Этот объект управляет содержимым страницы, которую ASP возвращает программе просмотра. Фактически в комбинации знак равенства представляет собой сокращенное обозначение метода Write объекта Response. Так что следующие две строки кода эквивалентны:

    Поскольку объект Response используется очень часто, такое сокращение оправдано.

    Полезное свойство объекта Response — Expires. Оно задает время (в минутах) за которое страница устаревает. Если установить его в нуль, то страница будет устаревать в момент загрузки и Internet Explorer не будет ее кэшировать. Кэширование сильно влияет на разработку и может привести к тому, что приложение будет функционировать неправильно. IE кэширует страницы двумя способами: на диске и в памяти. Рассмотрим такой фрагмент кода, показывающий текущее время и дату:

    Когда IE запрашивают страницу с этим кодом, на сервере выполняется сценарий, и на странице появляется текущее время. Однако, если программа просмотра переходит к другой странице, а затем возвращается к этой, со временем, то время не изменится, поскольку IE не запрашивает ее повторно. В листинге 4.6 приведена исправленная версия примера, устаревающая уже в момент загрузки.

    Листинг 4.6.Страница, устаревающая уже в момент загрузки.

    Forcing a Page to Expire

    Еще один полезный метод объекта Response — Redirect, перенаправляющий программу просмотра на указанный URL:

    Объект Server.Объект Server (сервер) представляет собой в некотором роде свалку — в том смысле, что предоставляемые им функции никак не связаны между собой, за тем исключением, что все они полезны разработчику для Интернета. Пожалуй, самая важная из всех функций объекта Server — это метод CreateObject, который создает экземпляр компонента ActiveX. Причем это может быть как встроенный компонент, входящий в комплект поставки, так и тот, который написали Вы сами на любом языке. В любом случае использование компонента ActiveX на сервере требует вызова метода CreateObject.

    Аргументом метода CreateObject служит ProgID (программный идентификатор) требуемого компонента ActiveX. ProgID — это содержательное имя компонента, такое как Excel.Sheet или Word.Basic. Следующая строчка показывает, как при помощи CreateObject создать экземпляр компонента с ProgID Excel.Sheet.

    Set MyObject = Server.CreateObject(«Excel.Sheet»)

    Другим полезным методом объекта Server является MapPath, возвращающий фактический путь, соответствующий заданному виртуальному каталогу.

    Компоненты ASP — это на самом деле просто компоненты ActiveX, наподобие тех, что Вы можете сами создать на Visual Basic или Visual C++. Но эти компоненты написаны Microsoft и поставляются вместе с Visual InterDev. Они предназначены для выполнения полезных для Web-узлов задач общего характера, включая доступ к данным. Создать их на своей странице Вы можете при помощи метода CreateObject объекта Server, а как только они созданы, смело обращайтесь к их свойствам и методам для выполнения нужных Вам задач.

    Компонент ActiveX Data Objects.Самым полезным изо всех компонентов ASP следует признать компонент доступа к базам данных, называемый также ActiveX Data Objects, или сокращенно ADO. Он и содержащиеся в нем объекты применяются для чтения и записи данных в источники данных ODBC при публикации в Web информации из баз данных.

    Объект Connection (подсоединение) создается методом CreateObject объекта Server, и ссылка на него помещается в переменную. Когда объект создан, его можно использовать для открытия подсоединения к любому источнику данных ODBC. Следующий фрагмент кода устанавливает подсоединение к источнику данных ODBC с названием Publications:

    ‘ Создаем объект Connection

    Set objConnection = Server.CreateObject(«ADODB.Connection»)

    ‘ Открываем подсоединение к источнику данных

    objConnection.Open «Publications», «sa», «» %>

    Здесь objConnection — переменная для объектной ссылки на экземпляр объекта Connection. Метод Open устанавливает подсоединение, принимая в качестве аргументов имя источника данных, идентификатор пользователя и пароль.

    Когда подсоединение установлено, получать информацию из источника данных можно при помощи объекта Recordset (набор записей). Этот объект умеет выполнять оператор SELECT языка SQL и возвращать набор записей, удовлетворяющих этому запросу. Как и объект Connection, Recordset создается методом CreateObject. В следующем примере программа выполняет оператор SELECT над источником данных, представленным переменной objConnection:

    После того, как записи получены, для передвижения по ним можно обращаться к методам MoveFirst, MoveLast, MoveNext и MovePrevious. Затем метод Write объекта Response помещает данные на Web-страницу, которая и посылается программе просмотра. В листинге 4.7 приведен полный пример ASP-страницы, которая строит список пользователей, со­держащихся в источнике данных Data.

    Листинг 4.7.Построение списка при помощи ADO.

    Одна из основных задач в управляемом данными Web-приложении — управление информацией в объекте Recordset. Очень часто простой запрос возвращает гораздо больше данных, чем имеет смысл показывать. Давайте, например, посмотрим, что происходит, когда Вы обращаетесь к какой-либо поисковой системе в Интернете. Поисковая машина, получив ключевое слово, возвращает ссылки на узлы, где это ключевое слово встречается. Но зачастую обнаруживаются тысячи узлов, содержащих данное ключевое слово. Совершенно очевидно, что показать все эти узлы на одной Web-странице совершенно невозможно.

    Выход состоит в разбиении на страницы (paging). Этот механизм реализован во всех поисковых системах для передачи за один раз некоей порции результатов запроса, скажем, из 10 записей. Теперь пользователь может эффективно работать с полученной информацией. Поддерживает разбиение на страницы и ADO — посредством нескольких свойств объекта Recordset: PageSize, PageCount и AbsolutePage.

    При получении набора данных можно указать, что записи следует разбить на страницы. Количество строк набора данных, составляющих страницу, задается значением свойства PageSize. Затем можно определить общее количество страниц в наборе данных посредством свойства PageCount. А доступ к заданной странице обеспечивает свойство AbsolutePage.

    В листинге 4.8 приведен полный пример, в котором пользователь может просматривать 10 записей за раз. Переменная сессии CurrentPage отслеживает текущую страницу. Пользователь может перейти к предыдущей порции данных или к следующему набору из 10 записей, выбрав одну из двух гипертекстовых ссылок на странице.

    Листинг 4.8.Разбиение набора данных на страницы средствами ADO.

    Создание ASP-компонентов в Delphi 6

    Что такое ASP

    SP (Active Server Pages) — технология, которая позволяет создавать Web-страницы, содержащие код, выполняемый Web-сервером, и динамически формировать Web-страницы. Вместе с Microsoft Internet Information Services поставляется несколько COM-объектов, выполняющих серверный код. Современная версия этой технологии позволяет использовать в ASP-страницах произвольные серверные компоненты. Клиентское приложение, использующее ASP-объекты, представляет собой HTML-документ (куда могут также входить клиентский и серверный коды на скриптовых языках), который можно прочесть практически с помощью любого Web-браузера. Обычно эти HTML-документы размещаются на каком-либо Web-сервере (как правило, это Microsoft Internet Information Server версии 3.0 и выше). Web-сервер, получив требование о предоставлении документа, считывает его из локального хранилища и передает клиенту, при этом часть информации вносится в документ Web-сервером динамически; сам же Web-сервер в этом случае может обращаться к ASP-объектам (входящим в комплект поставки Internet Information Server или созданным сторонними разработчиками). Как правило, Web-документы, содержащие обращения к ASP-объектам, имеют расширение *.asp. Примеры подобных документов можно найти в каталогах, создаваемых при установке Internet Information Server.

    Ранее (см. Компьютер Пресс, №2’2001, c. 169) мы рассказывали о создании простейших ASP-приложений, в том числе для работы с базами данных. Настоящую публикацию следует рассматривать как продолжение той статьи.

    Объекты, используемые в ASP

    ерархию объектов, используемых в технологии ASP, можно увидеть на рис. 1.

    Объект Request

    Объект Request используется для доступа к данным, которые формируются клиентом при обращении к ASP-серверу. Доступ к объекту Request получают с помощью интерфейса IRequest, которому присущи следующие основные свойства и методы:

    • свойство ClientSertificate — содержит значения всех полей клиентного сертификата, которые пересылаются в http-сообщении;
    • свойство Cookies — содержит значения всех заголовков Cookie в HTTP-запросе. Cookie — небольшие текстовые файлы, которые запоминаются на компьютере конечного пользователя и передаются на сервер в каждом запросе. С их помощью можно создать «сессию» для клиента: когда клиент обращается первоначально к одной, затем к другой странице и т.д. (при этом клиент не имеет права перейти к следующей странице, не обратившись к предыдущей);
    • свойство Form — если клиент осуществляет обращение к ASP-серверу с помощью формы, то можно получить значения заполненных полей в форме при обращении к свойству Form с добавлением имени поля;
    • свойство ServerVariables — содержат большинство переменных, необходимых для формирования HTTP-заголовков;
    • свойство TotalBytes — суммарное число байт, которые передаются клиентом на сервер. Реальное число байт может быть меньше, так как протокол HTTP не позволяет пересылать пакеты, размер которых превышает 8 Kбайт;
    • свойство QueryString — содержит имена и значения полей запроса при использовании метода GET;
    • свойство Body — содержит имена и значения полей запроса при использовании метода POST;
    • метод BinaryRead — используется для получения содержимого всего запроса, посылаемого клиентом, если размер запроса превышает 8 Kбайт. Вызов этого метода позволяет получить следующие 8 Kбайт данных HTTP-запроса. Вызов следует повторять до тех пор, пока не будет прочитан весь запрос; при этом размер последнего пакета может быть менее 8 Kбайт. Результаты вызова метода запоминаются в двоичном массиве. Следует обратить внимание на то, что после вызова этого метода нельзя обращаться к свойству Form.

    Объект Response

    В этом классе формируется отклик ASP-сервера, который передается клиенту. Доступ к этому объекту осуществляется через интерфейс IResponse. Основные свойства и методы данного интерфейса таковы:

    • свойство Cookies — позволяет создать коллекцию параметров вместе с их значениями. К этой коллекции также добавляется время, в течение которого данную коллекцию следует сохранять в клиентском приложении. При успешном получении отклика клиент запоминает эти параметры на диске в виде файла. При следующем обращении к серверу эти данные будут переданы в запросе и их можно будет получить при использовании свойства Request.Cookie. Анализ этих данных позволяет определить, обращался ли клиент к серверу ранее и если обращался, то с какими запросами. Cookie используются для создания «сессии» с клиентом в CGI-приложениях, поскольку IP-адреса клиента могут изменяться Proxy-серверами во время сессии. В ASP-приложениях возможно также создание сессии для клиента (это мы обсудим ниже);
    • свойство Buffer — если значение этого свойства равно True, то осуществляется буферизация отклика. При этом значении параметра отклик клиенту не отправляется до тех пор, пока не будет вызван метод Request.End (этот метод автоматически вызывается после обработки всего ASP-документа, то есть когда сформированы отклики от всех ASP-серверов) или Flush;
    • свойство CacheControl — определяет, может ли клиент кэшировать отклик;
    • свойство Charset — определяет имя шрифта для содержимого отклика ContentType=”text/html”;
    • свойство ContentType — указывает содержимое отклика. По умолчанию это свойство имеет значение text/html. Это значение необходимо изменять, например, при передаче картинок (image/jpeg или image/gif и т.д);
    • свойство Expires — при значении CacheControl=True определяет, сколько времени хранится отклик на клиентском месте;
    • свойство ExpiresAbsolute — то же самое, что Expires, только определяет абсолютную дату и время хранения отклика;
    • свойство IsClientConnected — указывает, был ли клиент отсоединен от сервера;
    • свойство Status — нормальное значение статуса «200 OK» означает успешную генерацию отклика. При невозможности создать отклик следует изменять значение статуса. Так, «401 Unauthorized» означает, что пользователю запрещено обращаться к данной странице по соображениям безопасности, например в случае неправильно введенного пароля;
    • метод AddHeader — добавляет заголовок в отклик. Заголовки добавляются в виде =” ”;
    • метод AppendToLog — добавляет строку в Log-файл Web-сервера. Эта строка не передается клиенту;
    • метод BinaryWrite — формирует двоичный отклик. Чаще всего используется для передачи клиенту картинок;
    • метод Clear — полностью очищает отклик. После этого его требуется формировать заново с самого начала;
    • метод End — прекращает обработку ASP-документа и немедленно возвращает результат клиенту. Вызывается автоматически после завершения обработки ASP-документа, но может быть вызван явно из кода ASP-сервера. После его вызова вызовы методов Write или BinaryWrite запрещены;
    • метод Flush — отправляет текущее содержимое буфера клиенту. Формирование отклика может продолжаться дальше;
    • метод Write — используется для записи текстовой информации в отклик;
    • метод Redirect — позволяет переадресовать запрос на другой URL. При этом можно поменять параметры запроса в объекте Request.

    Объект Server

    Этот объект позволяет обращаться к Internet Information Services и экспонирует ряд его методов и свойств:

    • свойство ScriptTimeout — время в минутах, в течение которого сессия существует без генерации нового запроса или без вызова команды Refresh со стороны клиента;
    • метод CreateObject — вызов этого метода используется для запуска COM-сервера, который будет принимать скрипты с ASP-документа и генерировать отклик, который вставляется вместо скрипта;
    • метод Execute — выполняет скрипт в указанном ASP-файле;
    • метод GetLastError — возвращает объект ASPError, в котором можно получить полную информацию о последней ошибке;
    • метод HTMLEncode — заменяет зарезервированные символы в HTML-документе подходящим набором символов, которые интерпретируются браузером и позволяют клиенту увидеть на экране зарезервированные символы. Например, дизайнер Web-сайта хочет, чтобы клиент увидел на экране следующее сочетание символов:
      . Если эту последовательность вставить в HTML-документ, то она будет интерпретирована как разрыв строки. Для этой последовательности символов метод HTMLEncode вернет: %3CBR%3E. При помещении этой последовательности символов в HTML-документ клиент увидит на экране
      ;
    • метод MapPath — конвертирует путь, выраженный в терминах виртуальных каталогов (абсолютный или относительный), в путь к физическому каталогу на данном компьютере;
    • метод Transfer — пересылает весь текущий отклик к другому ASP-серверу для продолжения формирования отклика;
    • метод URLEncode — перекодирует URL, включая специальные символы, в строку.

    Объект Session

    Этот объект создается во время первого обращения клиента к ASP-серверу. Замечательная особенность этого объекта — его способность сохраняется в течение некоторого времени после генерации отклика клиенту. Если в течение этого времени клиент вновь обратится к серверу, то сможет работать внутри ранее созданной сессии. Если внутри этого объекта объявить переменные, то в них можно запоминать состояние клиента. Этот факт значительно облегчает проведение сессий с клиентом по сравнению с CGI-приложениями, где постоянно приходится анализировать Cookie. Основные свойства и методы объекта Session:

    • свойство StaticObjects — коллекция всех объектов, добавленных к сессии при помощи тэга . Можно прочитать или изменить все значения свойств этих объектов. Вызов метода Remove удаляет данный объект. Вызов метода RemoveAll удаляет все объекты;
    • свойство Contents — коллекция всех динамически создаваемых объектов. Эти объекты можно создавать во время выполнения и использовать их при последующих обращениях клиентов к Web-серверу;
    • свойство CodePage — указывает страницу кодировки символов, которая может изменяться в зависимости от локальных настроек;
    • свойство LCID — языковой идентификатор, используемый для интерпретации текстовых строк;
    • свойство SessionID — идентификатор сессии для данного клиента. Генерируется автоматически и является постоянным для всех запросов данного клиента;
    • свойство Timeout — время в минутах, в течение которого существует сессия без генерации нового запроса или без вызова команды Refresh со стороны клиента;
    • метод Abandon — разрушает сессию и возвращает все ресурсы;
    • событие Session_OnStart — генерируется в момент создания сессии. Оно генерируется после события Application_OnStart, но до начала выполнения кода. Все переменные в сессии уже являются доступными, и к ним можно обращаться. Обработчик этого события должен быть написан на языке VBScript или JavaScript;
    • событие Session_OnEnd — наступает перед разрушением сессии по истечении времени TimeOut или после вызова метода Abandon. В обработчике событий можно работать с объектами Application, Server и Session, но не с Request и Response. Обработчик этого события должен быть написан на языке VBScript или JavaScript.

    Для сохранения состояния клиента (это главная особенность) используется следующий синтаксис:

    Рассмотрим в качестве примера Интернет-магазин. Предположим, пользователь на первой Web-странице выбирает наименование товара (например, Intel Processor), на второй странице — количество этого товара (например, 5), на третьей странице отображается цена, после чего ожидается подтверждение заказа. Ясно, что для генерации третьей страницы необходимо знать значения параметров с первых двух страниц. Поэтому после возвращения отклика с первой страницы используется команда:

    Session.Value[‘GoodName’]:=’ Intel Processor ‘;

    Имя выбранного товара можно получить после анализа свойств объекта Request. После второй страницы используем команду:

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

    В объекте Session можно также запоминать динамически создаваемые объекты (об этом будет рассказано ниже).

    Объект Application

    Этот объект используется для хранения и обработки данных, которые являются общими для всех сессий. При помощи объекта Application можно передавать данные от одного клиента к другому. Основные свойства и методы объекта Application:

    • свойство Contents – содержит список всех объектов, которые были добавлены при выполнении скриптов из ASP-документов. Объект Contents имеет два метода: Remove удаляет данный объект, а RemoveAll удаляет все объекты. Сюда же можно помещать ссылки на динамически создаваемые объекты при выполнении кода ASP-сервера;
    • свойство StaticObjects — список всех объектов, которые были добавлены при помощи тэга ;
    • метод Lock. Клиенты работают в многопоточном режиме, а переменные в объекте Application являются общими для всех клиентов. Поэтому если надо обратиться к свойствам объекта Application или к методам, которые работают с переменными данного объекта, то обязательно требуется вызов метода Lock. Это дает возможность безопасно работать с переменными Application, в то время как остальные клиенты будут ожидать окончания работы с этим объектом. После чтения или записи свойства (либо окончания работы метода) требуется вызов метода Unlock, и только после этого переменные (методы) будут доступны для других клиентов;
    • метод Unlock — делает доступными переменные или методы объекта Application другим клиентам;
    • событие Appliation_OnStart — наступает в момент первого старта приложения и продолжается до создания сессии. Из обработчика этого события можно обращаться только к объектам Server и Application. Обработчик этого события должен быть написан на языке VBScript или JavaScript;
    • событие Application_OnEnd — вызывается в момент завершения ASP-приложения, после разрушения всех сессий. Доступные объекты и языки для описания обработчика те же, что и у обработчика Application_OnStart.

    Использование объекта Session для хранения состояния

    втоматическая обработка полей Cookie в ASP-технологии позволяет определить, обращался ли ранее клиент к данному Web-серверу. При первом обращении клиента для него создается объект Session. При последующих обращениях этого же клиента для него назначается ранее созданный объект Session. Объект Session разрушается либо при отсутствии в течение интервала времени Session.TimeOut новых запросов от клиентов, либо при вызове метода Session.Abandon из кода. В объекте Session можно хранить переменные и объекты, которые динамически создаются или изменяются. Эти изменения видны при каждом последующем обращении клиента. Таким образом, объект Session может хранить состояние клиента. Данная возможность, реализованная на уровне технологии, обеспечивает ASP-приложениям существенные преимущества по сравнению с CGI- и ISAPI-приложениями, где для хранения состояния необходимо писать трудоемкий код для работы с Cookie.

    Для тестирования прежде всего требуется настроить Microsoft Internet Information Services (IIS). Для этого создадим виртуальную директорию IIS, которая обязательно должна иметь разрешение как на чтение (из нее будут читаться данные), так и на выполнениe скриптов (из нее будет загружен *.asp-документ). Директория должна быть доступна с помощью протокола HTTP. Поэтому в первую очередь нужно обратиться к Web-сервису Internet Information Server, просмотреть список доступных директорий и при необходимости создать новые с соответствующими правами доступа.

    В нашем примере на компьютере, который имеет IP-адрес 192.168.0.2, была создана виртуальная директория /Test, соответствующая физическому адресу на компьютере C:\ASPTest. В директорию, имеющую права доступа Read и Script, был скопирован файл Test.asp. Сам файл ASP01.dll (COM-сервер) можно поместить в произвольную директорию. Главное — чтобы он был зарегистрирован в системном реестре. Для этого после выполнения команды Save As в Delphi 6 выберем команду меню Run/Register ActiveX server и выполним ее.

    Продолжим работу с сессией. Воспользуемся проектом, создание которого было описано ранее (см. КомпьютерПресс, № 2’2001, c. 196). Исходный код проекта можно найти на нашем CD-ROM. Сначала разберемся, каким образом можно сохранять и изменять переменные. Для этого в секции private класса TTest модуля ASP01_U1 обьявим метод:

    В каждом методе модуля ASP01_U1 вызовем метод IncrementCallCount с параметром Name= . Например, в ранее объявленном методе GetPicture (см. КомпьютерПресс, № 2’2001, с.196) обратимся к IncrementCallCount следующим образом:

    Далее добавим в библиотеку типов новый метод GetCallCount, как было описано выше. Реализуем этот метод следующим образом:

    И наконец, создадим ASP-документ с вызовом метода GetCallCount:

    Сохраним этот документ в файле Test3.asp в директории C:\ASPTest (напомним, что она зарегистрирована в Internet Information Server и имеет разрешения на чтение и выполнение кода). Далее, обращаясь к ранее созданным ASP-документам, будем обращаться к объявленным ранее методам ASP-сервера в произвольной последовательности и произвольное число раз, пока, наконец, не дойдем до страницы Test3.asp. В результате получим примерно следующий отклик, какой представлен на рис. 2.

    Напротив названия каждого метода стоит число обращений к нему клиента в текущей сессии. Если вызвать команду Refresh в браузере, то можно заметить, что число напротив надписи GetCallCount увеличится на 1.

    Данные в коллекции Session.Value хранятся в виде вариантных переменных; иными словами, они могут принадлежать любому типу, конвертируемому в OleVariant: integer, single, double, WideString и т.д. Можно хранить и массивы — для этого вызывается функция VarArrayCreate. Доступ к переменным осуществляется по имени. Коллекция Session.Value возвращает пустое значение (null), если ранее переменная с данным именем не была добавлена к коллекции. Добавление новой переменной осуществляется в случае присвоения значения элемента коллекции с уникальным именем.

    Однако ссылки на экземпляры классов (объекты) в этой коллекции хранить нельзя. Точнее говоря, хранить их можно: например привести указатель к типу integer и сохранить в коллекции Session.Value. Далее можно получать доступ к объекту приведением типа и таким образом при каждом следующем обращении клиента получать ссылку на объект и работать с ним. Казалось бы, все хорошо, однако при разрушении сессии по истечении TimeOut деструкторы объектов вызваны не будут. Это означает, что при работе такого сервера постепенно будут исчерпываться доступные системные ресурсы и в конце концов Web-сервер просто «рухнет». Если бы существовала возможность создать обработчик события Session_OnEnd в коде Delphi, то деструкторы можно было бы вызвать явно. Однако этот обработчик может быть создан только в ASP-документе на языках VBScript или JavaScript.

    Выход из создавшейся ситуации заключается в использовании коллекции Session.Contents, которая предназначена для хранения объектов. В принципе, коллекция Session.StaticObjects также используется для хранения объектов, но ее нельзя модифицировать во время выполнения приложения. Идея хранения объектов в коллекции Session.Contents заключается в следующем: объекты, которые необходимо хранить, поддерживают интерфейс IUnknown (или его потомок). Именно ссылка на этот интерфейс и помещается в коллекцию Session.Contents. При закрытии сессии для всех интерфейсов, хранящихся в этой коллекции, вызывается метод Release. Соответственно из этого обработчика событий можно вызвать деструктор класса при равенстве нулю числа ссылок на интерфейс.

    Для проверки вышесказанного попробуем решить следующую задачу: мы хотим помещать содержимое одной записи в базе данных на отдельную Web-страницу, давая пользователю возможность передвигаться по записям вперед и назад. В этом случае требуется запоминать положение указателя текущей записи в наборе данных, что будет выполняться в компоненте Session. Наиболее простой способ запомнить положение указателя текущей записи — не закрывать набор данных после формирования отклика пользователю.

    Первоначально создадим ASP-документ, содержащий форму с двумя кнопками: Back и Next. В данном документе вызовем новый метод ASP-сервера, который назовем, например, TestSession. В этом методе будем анализировать запрос и смещать текущую запись вперед или назад. Сохраним документ в файле Test4.asp. Окончательный вид документа следующий:

    Далее создадим новый модуль данных и поместим на него компоненты TADOConnection и TADOTable. В ADOConnection1 сошлемся на базу данных Northwind. В компоненте ADOTable1 сошлемся на ADOConnection1, свойству TableName присвоим значение Alphabetical list of products, а его свойство Active установим равным True. Это означает, что немедленно после отработки конструктора будет установлена связь с сервером баз данных. Объявим новый интерфейс ISessionObject — потомок IUnknown. Полезно к этому интерфейсу добавить метод, который будет возвращать указатель на модуль данных. Несмотря на то что использовать указатели в интерфейсах запрещено вследствие необходимости осуществлять маршалинг для разных модулей, в нашем случае это оправданно, поскольку данный метод будет использоваться только внутри модуля ASP01. Все внешние приложения (в том числе Internet Information Services) будут работать с этим интерфейсом как с Iunknown, не «зная» о существовании метода, возвращающего указатель.

    Окончательный код выглядит следующим образом:

    Данный код прост и не требует комментариев. Ключевой метод — ObjRelease — уменьшает число ссылок и при их равенстве нулю вызывает деструктор класса. Некоторые изменения потребуются и в классе TTest модуля ASP01_U1. Прежде всего необходимо вызвать конструктор класса TDataModule2. Наиболее подходящее место для вызова конструктора — событие Session_OnStart — недоступно из кода Delphi. Метод AfterConstruction также подходит мало — при обращении к нему не определены ссылки на объекты Session, Application, Server. Необходимо, чтобы эти объекты были инициализированы из интерфейса IScriptingContext — именно это и делает метод OnStartPage. Поэтому будем вызывать конструктор из метода TTest.OnStartPage. При этом следует учитывать, что конструктор мог быть вызван раньше — во время предыдущего запроса клиента. Следовательно, необходима предварительная проверка существования экземпляра класса TTest. Окончательно код будет выглядеть следующим образом:

    Первоначально в переменную V пытаемся копировать переменную с именем DataModule, которая хранится в объекте Session. Если это не удается (что происходит, когда пользователь обращается к ASP-серверу в первый раз), то создаем экземпляр класса TDataModule2, получаем от него ссылку на интерфейс ISessionObject и запоминаем ее в объекте Session под именем DataModule. Теперь поведение экземпляра класса TDataModule2 будет корректным: он будет существовать, пока существует объект Session для данного клиента, и разрушаться с окончанием сессии. Чтобы убедиться в этом, достаточно переписать деструктор TDataModule2 и поместить туда оператор Beep (визуальные элементы управления в ASP-приложениях показывать запрещено). Если после этого вновь обратиться к ASP01 и затем выгрузить ASP-сервер, как было описано выше, то можно услышать звук динамика.

    Осталось реализовать метод TestSession в классе TTest — он формирует отклик для клиента. В этом методе необходимо получить доступ к хранящемуся в объекте Session экземпляру класса TDataModule2, проанализировать запрос и при нажатии кнопки Next переместить курсор на следующую запись, а при нажатии кнопки Prior — на предыдущую. Окончательный код выглядит следующим образом:

    В нем используется определенный ранее метод ISessionObject.getDataModule для получения ссылки на экземпляр класса TDataModule2. Скомпилировав этот проект и обратившись к созданной ранее странице Test4.asp, можно получить отклик, который представлен на рис. 3.

    При нажатии клавиши Next получаем страницу со следующей записью; Prior — с предыдущей.

    В заключение следует отметить, что объект Application также имеет аналогичные свойства для хранения переменных и объектов. Эти свойства имеют те же самые названия, что и в объекте Session. Существует два отличия использования аналогичных свойств объекта Application:

    Лекция 6 Active Server Pages (ASP )Active Server Pages (ASP ) –Основы. –GLOBAL.ASA –Объекты и компоненты. –Объект Application. –Объект Session. –Объект. — презентация

    Презентация была опубликована 6 лет назад пользователемИгорь Торицын

    Похожие презентации

    Презентация на тему: » Лекция 6 Active Server Pages (ASP )Active Server Pages (ASP ) –Основы. –GLOBAL.ASA –Объекты и компоненты. –Объект Application. –Объект Session. –Объект.» — Транскрипт:

    1 Лекция 6 Active Server Pages (ASP )Active Server Pages (ASP ) –Основы. –GLOBAL.ASA –Объекты и компоненты. –Объект Application. –Объект Session. –Объект Request. –Объект Response. –Объект Server.

    2 Основы ASP Active Server Pages активные серверные страницы.Active Server Pages активные серверные страницы. ASP — сценарий на VBScript, который исполняется на сервере. Когда запрашивается страница, этот сценарий порождает HTML- текст.ASP — сценарий на VBScript, который исполняется на сервере. Когда запрашивается страница, этот сценарий порождает HTML- текст. К лиент никогда не видит кода, а только результирующий HTML, который воспринимает любая программа просмотра.К лиент никогда не видит кода, а только результирующий HTML, который воспринимает любая программа просмотра.

    3 Пример Пример демонстрирует простую ASP-страницу, которая создает приветствие в соответствии со временем суток. В нем текущий час определяется при помощи кода Hour(Now), где Now функция VBScript, возвращающая текущий момент времени и дату.Пример демонстрирует простую ASP-страницу, которая создает приветствие в соответствии со временем суток. В нем текущий час определяется при помощи кода Hour(Now), где Now функция VBScript, возвращающая текущий момент времени и дату.Пример

    17 Then strGreeting = Добрый вечер! End If %>» title=»Пример Листинг 1. Простой пример ASP.Листинг 1. Простой пример ASP. Simple ASP Example Simple ASP Example 11 And Hour(Now) 11 And Hour(Now) 17 Then strGreeting = Добрый вечер! End If %>» > 4 Пример Листинг 1. Простой пример ASP.Листинг 1. Простой пример ASP. Simple ASP Example Simple ASP Example 11 And Hour(Now) 11 And Hour(Now) 17 Then strGreeting = «Добрый вечер!» End If %> 17 Then strGreeting = Добрый вечер! End If %>»> 17 Then strGreeting = «Добрый вечер!» End If %>»> 17 Then strGreeting = Добрый вечер! End If %>» title=»Пример Листинг 1. Простой пример ASP.Листинг 1. Простой пример ASP. Simple ASP Example Simple ASP Example 11 And Hour(Now) 11 And Hour(Now) 17 Then strGreeting = Добрый вечер! End If %>»>

    5 Особенности К од в листинге, окруженный угловыми скобками и знаками процента ( ) — серверный код, который выполняется перед тем, как страница будет послана программе просмотра.К од в листинге, окруженный угловыми скобками и знаками процента ( ) — серверный код, который выполняется перед тем, как страница будет послана программе просмотра. — на каком языке написан сценарий на данной странице. Можно использовать JavaScript. — на каком языке написан сценарий на данной странице. Можно использовать JavaScript. — п еременн ой strGreeting предшествует знак равенства, указывая, что в данное место HTML- кода нужно вставить текущее значение переменной. — п еременн ой strGreeting предшествует знак равенства, указывая, что в данное место HTML- кода нужно вставить текущее значение переменной.

    6 Файл GLOBAL.ASA. В Интернете сложно создать настоящее приложение. Взаимодействие программы просмотра и Web-сервера представляет собой лишенную состояния транзакцию, в ходе которой сервер посылает клиенту Web-страницу и затем забывает о его существовании. Когда клиент запрашивает другую Web-страницу, сервер ничего не помнит о предыдущем запросе.В Интернете сложно создать настоящее приложение. Взаимодействие программы просмотра и Web-сервера представляет собой лишенную состояния транзакцию, в ходе которой сервер посылает клиенту Web-страницу и затем забывает о его существовании. Когда клиент запрашивает другую Web-страницу, сервер ничего не помнит о предыдущем запросе.

    7 Файл GLOBAL.ASA. Д ля определения начала и завершения как всего приложения, так и отдельных пользовательских сессий в ASP используется файл GLOBAL.ASA.Д ля определения начала и завершения как всего приложения, так и отдельных пользовательских сессий в ASP используется файл GLOBAL.ASA. Он реагир ует на четыре ключевых события: Application_OnStart (запуск приложения), Application_OnEnd (завершение приложения), Session_OnStart (начало сессии) и Session_OnEnd (завершение сессии).Он реагир ует на четыре ключевых события: Application_OnStart (запуск приложения), Application_OnEnd (завершение приложения), Session_OnStart (начало сессии) и Session_OnEnd (завершение сессии). В листинге 2 приведен типичный файл GLOBAL.ASA.В листинге 2 приведен типичный файл GLOBAL.ASA.

    8 Файл GLOBAL.ASA. Листинг 2. Файл GLOBAL.ASA.Листинг 2. Файл GLOBAL.ASA. Sub Session_OnStart End Sub Sub Session_OnEnd End Sub Sub Application_OnStart End Sub Sub Application_OnEnd End Sub

    9 Файл GLOBAL.ASA. Для обозначения разделов сценария GLOBAL.ASA содержит теги. Эти теги имеют особый атрибут RUNAT=Server, который означает, что содержащийся в теге код на VBScript должен исполняться на сервере, а не на клиенте. Функционально RUNAT=Server означает то же, что и сочетания угловых скобок и знака процента, используемые для обозначения серверного сценария на Web- страницах.Для обозначения разделов сценария GLOBAL.ASA содержит теги. Эти теги имеют особый атрибут RUNAT=Server, который означает, что содержащийся в теге код на VBScript должен исполняться на сервере, а не на клиенте. Функционально RUNAT=Server означает то же, что и сочетания угловых скобок и знака процента, используемые для обозначения серверного сценария на Web- страницах.

    10 Файл GLOBAL.ASA. Ф ормулировк а, предложенная Microsoft, определяет Интернет- приложение как виртуальный каталог со всеми его файлами.Ф ормулировк а, предложенная Microsoft, определяет Интернет- приложение как виртуальный каталог со всеми его файлами. Если пользователь запрашивает Web-страницу из виртуального каталога под названием Bookstore, то тем самым он запускает приложение Bookstore, и в GLOBAL.ASA возбуждаются события Application_OnStart и Session_OnStart.Если пользователь запрашивает Web-страницу из виртуального каталога под названием Bookstore, то тем самым он запускает приложение Bookstore, и в GLOBAL.ASA возбуждаются события Application_OnStart и Session_OnStart.

    11 Файл GLOBAL.ASA. Согласно этому определению с приложением одновременно могут работать несколько программ просмотра.Согласно этому определению с приложением одновременно могут работать несколько программ просмотра. С обытие Application_OnStart происходит только один раз: когда первый пользователь запрашивает Web-страницу из виртуального каталога.С обытие Application_OnStart происходит только один раз: когда первый пользователь запрашивает Web-страницу из виртуального каталога. Когда страницы из этого каталога запрашивают другие пользователи, возбуждается только событие Session_OnStart.Когда страницы из этого каталога запрашивают другие пользователи, возбуждается только событие Session_OnStart. Session_OnStart

    12 Файл GLOBAL.ASA. Для конкретной программы просмотра сессия длится, пока программа продолжает запрашивать страницы виртуального каталога.Для конкретной программы просмотра сессия длится, пока программа продолжает запрашивать страницы виртуального каталога. Если пользователь не запрашивает Web-страницы (из данного виртуального каталога) на протяжении 20 минут (по умолчанию), сессия завершается, и возбуждается событие Session_OnEnd.Если пользователь не запрашивает Web-страницы (из данного виртуального каталога) на протяжении 20 минут (по умолчанию), сессия завершается, и возбуждается событие Session_OnEnd. Когда в данном виртуальном каталоге завершаются все сессии, возбуждается событие Application_OnEnd.Когда в данном виртуальном каталоге завершаются все сессии, возбуждается событие Application_OnEnd.

    13 Объекты и компоненты. VBScript не является полнофункциональным языком. Так, в VBScript нет встроенных функций доступа к данным; не умеет он и открывать текстовые файлы.VBScript не является полнофункциональным языком. Так, в VBScript нет встроенных функций доступа к данным; не умеет он и открывать текстовые файлы. Все это и многое другое реализуется объектами и компонентами ASP.Все это и многое другое реализуется объектами и компонентами ASP. ASP-объекты и компоненты это компоненты ActiveX, подобные обычным DLL ActiveX.ASP-объекты и компоненты это компоненты ActiveX, подобные обычным DLL ActiveX.

    14 Объекты и компоненты. ASP-объекты это элементы управления ActiveX, которые в коде на VBScript доступны всегда: их не нужно создавать явно. В число объектов ASP входят Application, Session, Request, Response и Server.ASP-объекты это элементы управления ActiveX, которые в коде на VBScript доступны всегда: их не нужно создавать явно. В число объектов ASP входят Application, Session, Request, Response и Server. ASP-компоненты — это DLL, существующие вне структуры ASP. ASP-компоненты нужно явно создавать в коде. ASP поддерживает компоненты Database Access, File Access, Browser Capabilities, Ad Rotator и Content Linking.ASP-компоненты — это DLL, существующие вне структуры ASP. ASP-компоненты нужно явно создавать в коде. ASP поддерживает компоненты Database Access, File Access, Browser Capabilities, Ad Rotator и Content Linking.

    15 Объект Application. Объект Application (приложение) позволяет создавать переменные приложения (application variables), доступные всем пользователям данного приложения. Все, кто обращается к Web-страницам данного виртуального каталога, могут совместно использовать любую переменную приложения определенную для этого каталога.Объект Application (приложение) позволяет создавать переменные приложения (application variables), доступные всем пользователям данного приложения. Все, кто обращается к Web-страницам данного виртуального каталога, могут совместно использовать любую переменную приложения определенную для этого каталога. В листинге 3 приведен пример программы, в не й переменная приложения служит для отслеживания времени последнего обращения к страницам приложения.В листинге 3 приведен пример программы, в не й переменная приложения служит для отслеживания времени последнего обращения к страницам приложения.пример

    16 Объект Application. Листинг 3. Объект Application.Листинг 3. Объект Application. Application Variables Application Variables Эта страница последний раз посещалась: Эта страница последний раз посещалась:

    17 Объект Application. Имя может быть произвольным, а переменная может содержать любую информацию, будь то число или текст.Имя может быть произвольным, а переменная может содержать любую информацию, будь то число или текст. Т акие переменные доступны нескольким пользователям одновременно.Т акие переменные доступны нескольким пользователям одновременно. Для разрешения коллизий объект Application поддерживает методы Lock и UnLock. Метод Lock блокирует весь объект Application, поэтому после изменения значения переменной разблокируйте объект.Для разрешения коллизий объект Application поддерживает методы Lock и UnLock. Метод Lock блокирует весь объект Application, поэтому после изменения значения переменной разблокируйте объект.

    18 Объект Application. П еременные приложения пригодны лишь для временного хранения данных, их нельзя использовать для долговременного хранения.П еременные приложения пригодны лишь для временного хранения данных, их нельзя использовать для долговременного хранения. Все данные в переменных приложения уничтожаются, когда происходит событие Application_OnEnd. Так что, если вы хотите, чтобы они сохранились после завершения приложения, позаботьтесь о их переносе в файл или базу данных.Все данные в переменных приложения уничтожаются, когда происходит событие Application_OnEnd. Так что, если вы хотите, чтобы они сохранились после завершения приложения, позаботьтесь о их переносе в файл или базу данных.

    19 Объект Session. ASP поддерживает переменные для индивидуального пользователя при помощи объекта Session (сессия), который позволяет создавать переменные сессии (session variables).ASP поддерживает переменные для индивидуального пользователя при помощи объекта Session (сессия), который позволяет создавать переменные сессии (session variables). Sub Session_OnStart Session(«Company»)=»NewTech» End Sub

    20 Объект Session. Переменные сессии можно создавать на любой Web-странице или в файле GLOBAL.ASA, а доступны они на любой Web- странице приложения, в котором эти переменные были первоначально созданы.Переменные сессии можно создавать на любой Web-странице или в файле GLOBAL.ASA, а доступны они на любой Web- странице приложения, в котором эти переменные были первоначально созданы. Получить значения переменных сессии можно, считывая их из объекта Session. Следующий пример считывает переменные сессии выводит их в полях ввода:Получить значения переменных сессии можно, считывая их из объекта Session. Следующий пример считывает переменные сессии выводит их в полях ввода: пример

    21 Объект Session. Как ASP запоминает переменные сессии для каждого пользователя приложения:Как ASP запоминает переменные сессии для каждого пользователя приложения: эти переменные сохраняются на сервере для каждого клиента. Программа просмотра получает от сервера уникальный идентификатор, позволяющий определить, какой набор переменных кому принадлежит. Клиент этот идентификатор (Globally Unique >

    22 Объект Session. Д ля установки или считывания в р емени жизни сессии (в минутах) применяется свойство Timeout объекта Session:Д ля установки или считывания в р емени жизни сессии (в минутах) применяется свойство Timeout объекта Session: Session.Timeout=30Session.Timeout=30 Для принудительного окончания сессии и ликвидации сессионных переменных применяют метод AbandonДля принудительного окончания сессии и ликвидации сессионных переменных применяют метод Abandon Session.AbandonSession.Abandon

    23 Объект Request. Для передачи данны х серверу программа просмотра использует отправку формы (form submission).Для передачи данны х серверу программа просмотра использует отправку формы (form submission). Данные имеют вид пар Поле=Значение, отсылаемых серверу открыты м текст ом.Данные имеют вид пар Поле=Значение, отсылаемых серверу открыты м текст ом. На сервере эти данные разбирает по полям объект Request. Например, следующий код вернет вам значение поля формы Name:На сервере эти данные разбирает по полям объект Request. Например, следующий код вернет вам значение поля формы Name:

    24 Объект Request. Request.Form применяется, когда данные были отправлены методом POST и именно этому сценарию.Request.Form применяется, когда данные были отправлены методом POST и именно этому сценарию. Если для отправки данных используется метод GET или сценарий вызывается с передачей параметров в гиперссылкеЕсли для отправки данных используется метод GET или сценарий вызывается с передачей параметров в гиперссылке Чтобы отправить данные, щелкните здесь! Чтобы отправить данные, щелкните здесь! то для разбота данных применяют свойство Request.QueryString:то для разбота данных применяют свойство Request.QueryString:


    25 Объект Request. Request.Cookies используются для извлечения информации из кукисов (cookies), отосланных вместе с запросом строке пользовательского агента программы просмотра.Request.Cookies используются для извлечения информации из кукисов (cookies), отосланных вместе с запросом строке пользовательского агента программы просмотра. Л истинг 5 демонстрирует применение свойства ServerVariables для определения имени компьютера, с которого клиент вызвал сценарий.Л истинг 5 демонстрирует применение свойства ServerVariables для определения имени компьютера, с которого клиент вызвал сценарий.демонстрирует

    26 Объект Request. Листинг 5. Определение компьютера пользователя.Листинг 5. Определение компьютера пользователя. Server Variables Server Variables Вы вошли с компьютера Вы вошли с компьютера Переменные сервера представляют широкий круг информации о клиенте и Web-сервере. Доступ к каждой конкретной переменной сводится к чтению соответствующей переменной.Переменные сервера представляют широкий круг информации о клиенте и Web-сервере. Доступ к каждой конкретной переменной сводится к чтению соответствующей переменной.

    27 Объект Response. Фактически в комбинации знак равенства представляет собой сокращенное обозначение метода Write объекта Response.Фактически в комбинации знак равенства представляет собой сокращенное обозначение метода Write объекта Response. С ледующие две строки кода эквивалентны:С ледующие две строки кода эквивалентны: Поскольку объект Response используется очень часто, такое сокращение оправдано.Поскольку объект Response используется очень часто, такое сокращение оправдано.

    28 Объект Response. Полезное свойство объекта Response — Expires. Оно задает время (в минутах) за которое страница устаревает. Если установить его в нуль, то страница будет устаревать в момент загрузки и Internet Explorer не будет ее кэшировать. Кэширование сильно влияет на разработку и может привести к тому, что приложение будет функционировать неправильно. IE кэширует страницы двумя способами: на диске и в памяти.Полезное свойство объекта Response — Expires. Оно задает время (в минутах) за которое страница устаревает. Если установить его в нуль, то страница будет устаревать в момент загрузки и Internet Explorer не будет ее кэшировать. Кэширование сильно влияет на разработку и может привести к тому, что приложение будет функционировать неправильно. IE кэширует страницы двумя способами: на диске и в памяти.

    29 Объект Response. Рассмотрим такой фрагмент кода, показывающий текущее время и дату:Рассмотрим такой фрагмент кода, показывающий текущее время и дату: Сейчас Сейчас Когда IE запрашивают страницу с этим кодом, на сервере выполняется сценарий, и на странице появляется текущее время. Однако, если программа просмотра переходит к другой странице, а затем возвращается к этой, со временем, то время не изменится, поскольку IE не запрашивает ее повторно.Когда IE запрашивают страницу с этим кодом, на сервере выполняется сценарий, и на странице появляется текущее время. Однако, если программа просмотра переходит к другой странице, а затем возвращается к этой, со временем, то время не изменится, поскольку IE не запрашивает ее повторно.

    30 Объект Response. В листинге 6 приведена исправленная версия примера, устаревающая уже в момент загрузки.В листинге 6 приведена исправленная версия примера, устаревающая уже в момент загрузки.приведена Листинг 6. Страница, устаревающая уже в момент загрузки.Листинг 6. Страница, устаревающая уже в момент загрузки. Forcing a Page to Expire Forcing a Page to Expire Сейчас Сейчас

    31 Объект Response. Еще один полезный метод объекта Response — Redirect, перенаправляющий программу просмотра на указанный URL:Еще один полезный метод объекта Response — Redirect, перенаправляющий программу просмотра на указанный URL:

    32 Объект Response. Кроме методов (Write и Redirect) и свойства Expires у объекта Response имеется коллекция (набор однотипных объектов) Cookies. Создание элемента коллекции означает запись теневой посылки на компьютер посетителя. Каждый элемент коллекции имеет имя, одно или несколько значений и несколько свойств:Кроме методов (Write и Redirect) и свойства Expires у объекта Response имеется коллекция (набор однотипных объектов) Cookies. Создание элемента коллекции означает запись теневой посылки на компьютер посетителя. Каждый элемент коллекции имеет имя, одно или несколько значений и несколько свойств:

    33 Объект Response. срок жизни (Expires),срок жизни (Expires), имя папки на сервере, сценарии из которой имеют право чтения этой теневой посылки (Path),имя папки на сервере, сценарии из которой имеют право чтения этой теневой посылки (Path), имя сервера, сценарии которого имеют право чтения этой теневой посылки (Domain).имя сервера, сценарии которого имеют право чтения этой теневой посылки (Domain).

    34 Объект Response. Обязательным параметром теневой посылки является только ее имя. Остальные параметры можно не указывать. В этом случае:Обязательным параметром теневой посылки является только ее имя. Остальные параметры можно не указывать. В этом случае: Отсутствие значения приводит к стиранию теневой посылки с компьютера посетителя;Отсутствие значения приводит к стиранию теневой посылки с компьютера посетителя; Отсутствие срока жизни приводит к устареванию теневой посылки в момент закрытия браузера;Отсутствие срока жизни приводит к устареванию теневой посылки в момент закрытия браузера;

    35 Объект Response. Отсутствие имени папки означает разрешение чтения теневой посылки сценариями из текущей папки;Отсутствие имени папки означает разрешение чтения теневой посылки сценариями из текущей папки; Отсутствие имени сервера означает разрешение чтения теневой посылки сценариям любого сервера (если они знают имя теневой посылки).Отсутствие имени сервера означает разрешение чтения теневой посылки сценариям любого сервера (если они знают имя теневой посылки).

    36 Объект Response. Приведем пример записи теневой посылки:Приведем пример записи теневой посылки: Response.Cookies(«visit»)(«Value ) = dataResponse.Cookies(«visit»)(«Value ) = data Response.Cookies(«visit»).Expires = Date + 365Response.Cookies(«visit»).Expires = Date Response.Cookies(«visit»).Path= » / «Response.Cookies(«visit»).Path= » / » Response.Cookies(«visit»).Domain= Request.ServerVariables(SERVER_N AME )Response.Cookies(«visit»).Domain= Request.ServerVariables(SERVER_N AME )

    37 Объект Server. Объект Server (сервер) содержит функции, никак не связаны между собой.Объект Server (сервер) содержит функции, никак не связаны между собой. С амая важная функци я объекта Server это метод CreateObject, который создает экземпляр компонента ActiveX.С амая важная функци я объекта Server это метод CreateObject, который создает экземпляр компонента ActiveX. Аргументом метода CreateObject служит Prog >

    38 Объект Server. Следующая строчка показывает, как при помощи CreateObject создать экземпляр компонента с Prog >

    Технология активных серверных страниц ASP

    ASP (англ. Active Server Pages — «активные серверные страницы») — технология, предложенная компанией Microsoft для создания Web-приложений в 1996 году вместо провалившегося проекта Dynamic HTML, в котором была сделана попытка «динамизировать» web-страницы за счет модернизации HTML, внедрением в него «динамических тэгов», то есть тэгов, имеющих алгоритмические свойства наподобие объектов в ООП. Но появление JavaScript от корпорации Netscape сделало это бессмысленным.

    Технология ASP также, как и Dynamic HTML, основана на внедрении в обыкновенные веб-страницы специальных элементов управления, допускающих программное управление, но с куда большим риском для безопасности клиента.

    По своей сути, ASP — это технология динамического создания страниц на стороне сервера, приблизившая проектирование и реализацию Web-приложений к той модели, по которой проектируются и реализуются обычные приложения.

    Для реализации приложений ASP используются языки сценариев (VBScript или JScript). Также допускается применение COM-компонентов.

    Технология ASP разработана для операционных систем из семейства Windows NT/Server и функционирует под управлением веб-сервера Microsoft IIS.

    Технология ASP получила своё развитие в виде ASP.NET — технологии создания веб-приложений, основанной уже на платформе Microsoft .NET.

    Синтаксис

    Страница на ASP — это обычная страница HTML, со вставками, обозначенными ограничителями :

    То что находится внутри ограничителей — это текст программы, интерпретируемый при запросе страницы. VBScript является языком по умолчанию, хотя возможно использование и JScript[источник не указан 1108 дней] (или любого другого языка, если установлен соответствующий интерпретатор):

    Версии

    ASP в своём развитии прошёл через несколько версий:

    • ASP 1.0 (распространяется с IIS 3.0) в декабре 1996 года.
    • ASP 2.0 (распространяется с IIS 4.0) в сентябре 1997 года.
    • ASP 3.0 (распространяется с IIS 5.0) в ноябре 2000 года.

    Apache::ASP

    Apache::ASP (англ.) предоставляет функциональность ASP на основе веб-сервера Apache, со скриптами на основе Perl.

    ASP в Sambar Server

    На сервере Sambar Server используется функциональность ASP, которая использует язык CScript в качестве основного языка программных вставок.

    Обзор технологии Active Server Pages (ASP)

    Сергей Верязов, Microsoft Special Interest Group «Neva»

    Active Server Pages это среда программирования, которая обеспечивает возможность комбинирования HTML, скриптов и компонент для создания динамических Web-приложений. Возможность встраивания в Web-страницы скриптов (кода, написанного на языке программирования, например, VBScript или JScript) позволяет логичным образом объединить оформление с данными, полученными из различных источников, например, из БД.

    Идеология создания современных Web-приложений заключается в инкапсуляции бизнес-логики в отдельные компоненты, написанные по технологии COM. Технология ASP в данном случае является связующим звеном между этими компонентами и интерфейсом Web-приложения.

    Принципы функционирования

    Использование Active Server Pages как бы не требует специфичных браузеров, но требует включения небезопасного ActiveX. Все ASP-скрипты запускаются и выполняются на Web-сервере, причем брaузер получает только результирующие HTML-файлы. Microsoft Internet Information Server, начиная с версии 3.0, поддерживает Active Server Pages.
    Рассмотрим последовательность функционирования ASP. Клиент запрашивает ASP-страницу на Web-сервере. Сервер принимает запрос и начинает его обрабатывать. По расширению файла (.asp) определяет, что данный файл содержит ASP-скрипт, и начинает анализировать его содержимое, последовательно интерпретируя и выполняя вставки ASP-кода. ASP-код, в свою очередь, может содержать обращения к различным источникам данных, осуществлять обработку полученных данных и добавлять содержимое генерируемой страницы. В результате формируется обычная HTML-страница (уже не содержащая ASP-кода), которая и отправляется обратно клиенту.

    Внешне ASP функционирует также, как CGI. Аналогичным образом передаются параметры (формат-строки запроса) и осуществляется вывод результатов. Однако производительность ASP оказывается гораздо выше, т. к. при каждом запросе не происходит отдельной загрузки ASP-интерпретатора. Использование компонент ActiveX также значительно повышает производительность Web-сервера.

    Описание синтаксиса

    ASP-код, который нужно выполнить на сервере, размещается внутри специальных тегов . Так как данный код обрабатывается на сервере, он не доступен пользователю. Сам код может быть написан с использованием Visual Basic Scripting Edition (VBScript) или JScript (JavaScript). Технология ASP позволяет использовать и другие языки программирования. По сути, нужно говорить не о синтаксисе ASP, а о том языке, который используется для написания ASP-кода. Синтаксис VBScript намного проще других языков, поэтому новичку будет легко в нем разобраться.

    Объекты и компоненты

    VBScript не является полнофункциональным языком программирования и использования встроенных в него средств явно недостаточно. Поэтому в ASP-страницах используются специальные объекты и компоненты ActiveX.

    Существует набор встроенных объектов, которые инициализируются и предоставляются ASP-скрипту автоматически при начале обработки. Эти объекты обеспечивают доступ к основным жизненно важным функциям:

    • Объект Application позволяет создавать переменные, доступные всем пользователям Web-приложения.
    • Объект Session позволяет сохранять данные, связанные с отдельным пользователем.
    • Объект Request предоставляет параметры CGI-запроса, отправленные методом POST 99или GET.
    • Объект Response предоставляет методы для добавления информации, а также для формирования заголовков страницы ответа Web-сервера.
    • Объект Server содержит множество различных методов, одним из которых является метод CreateObject, позволяющий создавать экземпляры компонент ActiveX.

    В отличие от встроенных ASP-объектов, ASP-компоненты явно необходимо создавать в коде скрипта. Существует огромное количество ActiveX-компонент, которые можно использовать в ASP-страницах, причем большинство из них распространяются бесплатно. Более того, разработчик может сам создавать ActiveX-компоненты в любой среде программирования, поддерживающей COM-технологию, например, Visual C++ или Visual Basic.

    Следует уделить особое внимание объектам ADO (ActiveX Data Objects), которые представляют собой мощные интегрированные средства для создания приложений для работы с БД. Компоненты ADO обеспечивают быстрый и удобный интерфейс к БД на самом высоком уровне, при этом сохраняется переносимость разрабатываемых приложений для работы с другими БД. Использование компонент ADO значительно упрощает работу программиста, ему остается лишь правильно составить SQL-запросы к БД и позаботиться о выводе результатов.

    В рамках функционирования Web-приложения существует возможность создания обработчиков основных событий, таких как запуск и остановка Web-приложения, а также открытие и закрытие пользовательской сессии. Эти события описываются в специальном ASP-файле global.asa. Обработчики данных событий можно использовать для инициализации объектов или установки значений глобальных переменных.

    Средства разработки

    Создавать ASP-страницы можно в любом текстовом редакторе, но это далеко не всегда удобно. Помимо написания кода на VBScript, необходимо осуществлять его отладку, что возможно только на функционирующем Web-сервере (IIS) и при наличии специальных средств.

    Microsoft Visual InterDev 6.0 (входящий в состав Microsoft Visual Studio) является одним из лучших средств, которое позволяет не только быстро и эффективно создавать ASP-код, но и осуществлять расширенную отладку кода. Основные особенности этого продукта:

    • Просмотр списка используемых объектов, и возможность быстрого написания кода.
    • Подсветка синтаксиса кода (VBScript и JScript).
    • Автоматическое формирование содержимого global.asa.
    • При запуске в режиме отладки InterDev автоматически настраивает Web-сервер (IIS) в нужный режим, а по окончании отладки восстанавливает настройки.
    • Возможность установки точек прерывания (breakpoints).
    • Просмотр значений переменных (watches) и списка вызванных процедур (call stack).

    Существуют также и другие специализированные редакторы, позволяющие разрабатывать ASP-приложения, например, Home Site 4.5, Macromedia UltraDev 4.0 или ASP Express. Однако эти средства не полностью охватывают возможности Visual InterDev.

    Новые возможности в IIS 5.0

    Последняя версия Web-сервера Internet Information Server (IIS) 5.0 значительно усовершенствована, благодаря чему повышена надежность и производительность ASP-приложений. Встроенные объекты ASP в Windows 2000 обладают новыми методами, которые расширяют возможности разработчика.
    Появились новые средства обработки ошибок. С помощью нового объекта AppError теперь можно получать сведения об ошибках, происходящих как на стадии выполнения, так и на стадии разбора страницы.

    В новой версии ядра управления сценариями Script Engine из состава Windows 2000 появились новые мощные средства поддержки языков VBScript и JScript. В сценариях на VBScript теперь можно пользоваться средствами проверки и разбора сложных выражений, а также создавать классы.
    Средства доступа к данным также претерпели значительные изменения теперь в составе ОС поставляется ядро MDAC 2.5, которое, в частности, обеспечивает интеграцию со средствами XML.

    Поддержка других языков программирования

    Наравне с Visual Basic Scripting Edition (VBScript), IIS поддерживает обработку JScript (JavaScript). Вы можете использовать все те же объекты, при этом меняется только синтаксис связующих конструкций.
    Преимущество технологии ASP в том, что она позволяет использовать и другие языки программирования. Для их поддержки необходимо установить соответствующие модули Script Engine. Например, поддержку языка Perl (а точнее ActivePerl) можно осуществить с помощью модуля от компании ActiveState (http://www.activestate.com/). Также существуют модули для поддержки REXX и Python.
    Существуют продукты сторонних компаний, поддерживающие технологию ASP на других платформах. Например, Chili!Soft ASP, компании Chili!Soft, Inc., (http://www.chilisoft.com/) обеспечивает поддержку ASP на множестве Web-серверов, таких как: Apache, Lotus, Netscape, OReilly, которые могут функционировать под управлением различных ОС.

    Достоинства и недостатки

    Язык VBScript, обычно используемый в ASP, имеет менее удобный синтаксис, чем другие языки, например язык PHP. Однако основной недостаток VBScript — неприемлемо снижающаяся безопасность клиента, а в связке с ActiveX — практически нулевая. Не является компенсацией этого и то, что производительность интерпретатора VBScript значительно выше, чем PHP.

    JScript от Microsoft лишен этого недостатка, но имеет другой, более серьёзный — неприятную обработку типов данных OLE Automation, что приводит к скрытым, трудным в обнаружении ошибкам.

    ASP может использовать очень довольно набор классов для работы с SQL базами данных — ADO, который примерно аналогичен Perl DBI и лучше, чем вызовы mysql_xxx в PHP. Однако технология ADO тоже устарела.

    ASP поддерживает объекты Session и Application, с которыми в PHP/Apache традиционно есть огромные сложности, связанные с архитектурой процессов Apache 1.x (а она восходит к нелюбви к потокам в мире UNIX и использованию fork() вместо них везде, где возможно).

    Однако, так как объект Session ныне считается совершенно не удовлетворяющим требованиям безопасности, и зачастую вместо него все его содержимое помещают в один огромный cookie, и передают туда-обратно между клиентом и сервером. Такое легко реализуемо в PHP, этим пользуются, например, phpBB и его коммерческий дериватив vBulletin.

    Объекты запроса и ответа (Request & Response Objects)

    Содержание

    Объекты запроса и ответа (Request & Response Objects) являются абстрактными представителями HTTP-запросов и ответов. Объект запроса в CakePHP позволяет работать с входящим запросом, в то время как объект ответа позволяет легко создавать ответы HTTP от контроллеров приложения.

    Запрос (Request)

    class Cake\Http\ServerRequest

    ServerRequest — это объект запроса, используемый в CakePHP по умолчанию. Он централизует ряд функций для опроса и взаимодействия с данными запроса. По каждому запросу создается один такой объект, который затем передается по ссылке на различные уровни приложения, использующего данные запроса. По умолчанию запрос присваивается $this->request и доступен в Контроллерах (Controllers), Ячейках (Cells), Представлениях (Views) и Помощниках (Helpers). Вы также можете получить доступ к нему в компонентах (Components) контроллеровв, используя ссылку на контроллер. Некоторые из обязанностей ServerRequest включают в себя:

    • Обработку массивов GET, POST и FILES в структурах данных;
    • Обеспечение интроспекции среды, относящейся к запросу. Сюда входит такая информация, как отправленные заголовки, IP-адрес клиента и субдомен/домен сервера, на котором запущено приложение;
    • Предоставление доступа к параметрам запроса как индексов массивов, так и свойств объекта.

    Начиная с версии 3.4.0, объект запроса CakePHP реализует PSR-7 ServerRequestInterface, что упрощает использование библиотек вне CakePHP.

    Параметры запроса

    Параметры маршрутизации из объекта запроса можно получить используя метод getParam():

    Через этот интерфейс доступны все элементы маршрута.

    Помимо Route Elements (элементов маршрута),также часто необходим доступ к Passed Arguments (передаваемым аргументам). Они также доступны в объекте запроса:

    Всё это предоставят доступ к переданным аргументам. Существует несколько важных/полезных параметров, которые CakePHP использует внутренне, все они также находятся в параметрах маршрутизации:

    • plugin — Плагин, который обрабатывает текущий запрос. Будет null, если нет плагина;
    • controller — Контроллер, который обрабатывает текущий запрос;
    • action — Экшен, который обрабатывает текущий запрос;
    • prefix — Префикс для текущего действия (экшена). См. «Использование префиксов в маршрутизации» для получения дополнительной информации.

    Параметры строки запроса

    Cake\Http\ServerRequest::getQuery($name)

    Параметры строки запроса можно прочитать с помощью метода getQuery():

    Вы можете либо напрямую получить доступ к свойству запроса, указав имя свойства, либо использовать метод getQuery() без указания имени (ключа) для чтения всего массива запроса. Любые ключи, которые не существуют, будут приводить к возвращению значения null:

    Так же, для получения доступа ко всем параметрам запроса, можно использовать getQueryParams ():

    Новое в версии 3.4.0: getQueryParams() и getQuery() добавлены в 3.4.0

    Данные тела запроса

    Cake\Http\ServerRequest::getData($name, $default = null)

    Доступ ко всем данным POST можно получить с помощью Cake\Http\ServerRequest::getData(). Любые данные, отправленные из формы, содержащие многомерный массив, будут иметь префикс данных. Например:

    Любые ключи, которые не существуют, будут возвращать значение null:

    Данные методов PUT, PATCH или DELETE в запросе

    Cake\Http\ServerRequest::input($callback[, $options])

    При создании REST сервиса часто бывает необходимо принимать в запросе данные PUT и DELETE. Любые application/x-www-form-urlencoded данные тела запроса автоматически анализируются, парсятся и заносятся в $this->data для запросов PUT и DELETE. Если вы принимаете данные JSON или XML, то ниже показано, как можно получить доступ к телам этих запросов.

    Для доступа к входным данным вы можете декодировать их с помощью дополнительной функции. Это полезно при взаимодействии с содержимым тела запроса XML или JSON. Дополнительные параметры для функции декодирования могут передаваться в качестве аргументов для input():

    Переменные среды (от $_SERVER и $_ENV)

    Cake\Http\ServerRequest::env($key, $value = null)

    ServerRequest::env() — это оболочка для глобальной функции env() и действует как получатель/установщик переменных среды без изменения глобальных переменных $_SERVER и $_ENV:

    Чтобы получить доступ ко всем переменным среды в запросе, используется getServerParams():

    Новое в версии 3.4.0: Метод getServerParams() добавлен в 3.4.0

    XML или JSON данные

    Приложения, использующие REST, часто обмениваются данными без URL-кодирования. Прочитать входные данные любого формата, можно используя Http\\ServerRequest::input(). Указывая функцию декодирования, вы можете получать контент в десериализованном формате:

    Некоторые методы десериализации требуют дополнительных параметров при вызове, таких как параметр «ассоциативный массив» при использовании json_decode. Если вы хотите преобразовать XML в объект DOMDocument, Http\ServerRequest::input() поддерживает передачу дополнительных параметров:

    Информация о пути (Path)

    Объект запроса также предоставляет информацию о путях в вашем приложении. Атрибуты base и webroot полезны для создания URL-адресов и определения того, находится ли ваше приложение в подкаталоге. Возможно использование следующих атрибутов:

    Проверка условий запроса

    Cake\Http\ServerRequest::is($type, $args. )

    Объект запроса обеспечивает простой способ проверки определенных условий в запросе. Используя метод is(), можно проверить ряд общих условий, а также другие критерии запроса конкретного приложения:

    Так же, можно расширить условия проверки запросов, используя Cake\Http\ServerRequest::addDetector() для создания новых типов детекторов. Существует четыре разных типа детекторов, которые могут быть созданы:

    • Сравнение значений среды — сравнивает значение, полученное из env() с предоставленным значением;
    • Сравнение по шаблону — позволяет сравнить значение, полученное из env(), с представленным значением, через регулярное выражение;
    • Сравнение на основе опций — использует список вариантов для создания регулярного выражения;
    • Детекторы обратного вызова — позволяют выдавать «обратный вызов» для обработки проверки. Обратный вызов получит объект запроса в качестве единственного параметра.

    Cake\Http\ServerRequest::addDetector($name, $options)

    Вот некоторые примеры:

    Request также включает в себя такие методы, как: Cake\Http\ServerRequest::domain(), Cake\Http\ServerRequest::subdomains() и Cake\Http\ServerRequest::host(), чтобы помочь облегчить жизнь при создании приложений с субдоменами.

    Существует несколько встроенных детекторов, которые вы можете использовать:

    • is(‘get’) Проверка, является ли текущий запрос запросом GET;
    • is(‘put’) Проверка, является ли текущий запрос запросом PUT;
    • is(‘patch’) Проверка, является ли текущий запрос запросом PATCH;
    • is(‘post’) Проверка, является ли текущий запрос запросом POST;
    • is(‘delete’) Проверка, является ли текущий запрос запросом DELETE;
    • is(‘head’) Проверка, является ли текущий запрос запросом HEAD;
    • is(‘options’) Проверка, является ли текущий запрос запросом OPTIONS;
    • is(‘ajax’) Проверка, поступил ли текущий запрос с помощью X-Requested-With = XMLHttpRequest;
    • is(‘ssl’) Проверка, выполняется ли запрос через SSL;
    • is(‘flash’) Проверка, имеет ли запрос в User-Agent Flash;
    • is(‘requested’) Проверка, имеет ли запрос параметр ‘requested’ со значением 1;
    • is(‘json’) Проверка, имеет ли запрос расширение «json» и принимает MIME-тип «application/json»;
    • is(‘xml’) Проверка, имеет ли запрос расширение «xml» и принимает MIME-тип ‘application/xml’ или ‘text/xml’.

    Новое в версии 3.3.0: Детекторы могут принимать дополнительные параметры начиная с версии 3.3.0

    Данные сессии (Session Data)

    Для доступа к сессии текущего запроса используется метод session():

    Хост и доменное имя

    Cake\Http\ServerRequest::domain($tldLength = 1)

    Возвращает имя домена, в котором работает ваше приложение:

    Cake\Http\ServerRequest::subdomains($tldLength = 1)

    Возвращает субдомены, в которых работает ваше приложение, в виде массива:

    Cake\Http\ServerRequest::host()

    Возвращает хост, на котором установлено ваше приложение:

    Чтение HTTP-метода

    Cake\Http\ServerRequest::getMethod()

    Возвращает метод HTTP, на основе которого был выполнен запрос:

    Ограничение того, какой метод HTTP может принимать экшен

    Cake\Http\ServerRequest::allowMethod($methods)

    После установки допустимых методов HTTP, если они не будут согласованы с запросом, выбросится исключение MethodNotAllowedException. Ответ 405 будет включать заголовок с указанием разрешенных методов:

    Чтение заголовков HTTP

    Позволяет получить доступ к любому из заголовков HTTP_ *, которые были использованы для запроса. Например:

    Хотя некоторые установки Apache делают заголовок при авторизации не доступным, CakePHP сделает его доступным по специальным методам apache в случае необходимости.

    Cake\Http\ServerRequest::referer($local = false)

    Возвращает URL адрес источника запроса.

    Cake\Http\ServerRequest::clientIp()

    Возвращает IP-адрес текущего посетителя.

    Заголовки доверенного прокси

    Если ваше приложение находится за балансировщиком нагрузки или работает в облачном сервисе, часто бывает необходимо получать от них хост, порт и схему в своих запросах. Такие балансировки нагрузки также отправляют заголовки HTTP-X-Forwarded- * с исходными значениями. Пересылаемые заголовки не будут использоваться CakePHP из коробки. Чтобы объект запроса использовал эти заголовки, для свойства trustProxy необходимо установить значение true:

    Проверка принимающих заголовков

    Cake\Http\ServerRequest::accepts($type = null)


    Можно узнать, какие типы данных (Content-Type) принимает клиент, или проверьте, принимает ли он конкретный Content-Type.

    Получить все типы:

    Проверка конкретного типа:

    Cake\Http\ServerRequest::acceptLanguage($language = null)

    Получить все языки, принятые клиентом, или проверить, принят ли конкретный язык.

    Получить список принятых языков::

    Проверьте, принят ли конкретный язык::

    Куки запроса можно прочитать несколькими способами:

    См. документацию по Cake\Http\Cookie\CookieCollection для работы с экземпляром коллекции файлов куки.

    Новое в версии 3.5.0: ServerRequest::getCookieCollection() добавлен в версии 3.5.0

    Ответ (Response)

    class Cake\Http\Response

    Cake\Http\Response — это класс ответа по умолчанию в CakePHP. Он объединяет в себе определенный функционал для генерации HTTP ответов приложения. Cake\Http\Response также помогает при тестировании, поскольку его можно обойти/пропустить, для проверки заголовков, которые будут отправлены. Подобно Cake\Http\ServerRequest, Cake\Http\Response объединяет ряд методов, ранее относящихся к контроллеру: RequestHandlerComponent и Dispatcher. Старые методы устарели в пользу использования Cake\Http\Response.

    Response предоставляет интерфейс для объединения задач, связанных с ответом, таких как:

    • Отправка заголовков для перенаправления;
    • Отправка content type заголовков;
    • Отправка прочих заголовков;
    • Отправка тела ответа.

    Работа с типами контента

    Cake\Http\Response::withType($contentType = null)

    Вы можете управлять Content-Type в ответах приложения с помощью Cake\Http\Response::withType(). Если приложению нужно иметь дело с Content-Types, которые не встроены в Response, их можно также сопоставить с type():

    Обычно необходимо отображать дополнительные Content-Type в обратном вызове beforeFilter() контроллера, для этого можно использовать функции автоматического переключения вида RequestHandlerComponent, при его использовании.

    Отправка файлов

    Cake\Http\Response::withFile($path, $options = [])

    Бывают случаи, когда необходимо отправлять файлы в качестве ответов на запросы. Это можно делать, используя Cake\Http\Response::withFile():

    Как показано в приведённом выше примере, необходимо в метод передать путь к файлу. CakePHP отправит соответствующий заголовок типа контента, если это известный тип файла, указанный в Cake\Http\Reponse::$_mimeTypes. Вы можете добавлять новые типы до вызова Cake\Http\Response::withFile() с помощью метода Cake\Http\Response::withType().

    Также можно принудительно загрузить файл вместо отображения страницы в браузере, указав параметры:

    • name — позволяет указать альтернативное имя файла для отправки пользователю;
    • download — логическое значение, указывающее, следует ли устанавливать заголовки для принудительной загрузки.

    Отправка строки в виде файла

    Так же, можно ответить файлом, который не существует на диске, например, pdf или ics, сгенерированным «на лету» из строки:

    Обратные вызовы также могут возвращать тело в виде строки:

    Настройка заголовков

    Cake\Http\Response::withHeader($header, $value)

    Настройка заголовков выполняется с помощью метода Cake\Http\Response::withHeader(). Как и все методы интерфейса PSR-7, этот метод возвращает экземпляр new с новым заголовком:

    Заголовки не отправляются при установке. Вместо этого они сохраняются до тех пор, пока не будет получен ответ Cake\Http\Server.

    Теперь вы можете использовать удобный метод Cake\Http\Response::withLocation(), чтобы напрямую установить или получить заголовок местоположения перенаправления.

    Настройка body

    Cake\Http\Response::withStringBody($string)

    Чтобы установить строку в качестве тела ответа, необходимо выполнить следующие действия:

    What is the difference between the Response object and Request object?

    What is the difference between the Response object and Request object in ASP?

    5 Answers 5

    Generally, the request object is going to hold information about the current user request, that is the client browser requesting a webpage from your server. The response object contains the response data that will be sent back to the user. Think of it in terms of a http request/response cycle. The objects hold the respective data.

    The ASP Request object is used to get information from a visitor. Usually, you read the contents of the request to determine the course of action and the proper response.

    The ASP Response object is used to send output to the user from the server.

    Request Object: is used to read the data submitted by the client (i.e. the data comes with the client request)

    Response Object: is used to send instructions to the client browser.

    This might help you further. Request object: from client (you) to server. Response object: from Server to client (you) rendering back to the service. These objects are called intrinsic object of ASP.Net.

    Request Object: Used to send information to the clients. Response Object: Used to retrieve information included with the request from server.

    Not the answer you’re looking for? Browse other questions tagged asp-classic or ask your own question.

    Hot Network Questions

    Subscribe to RSS

    To subscribe to this RSS feed, copy and paste this URL into your RSS reader.

    site design / logo © 2020 Stack Exchange Inc; user contributions licensed under cc by-sa 4.0 with attribution required. rev 2020.11.11.35402

    Корректный ASP.NET Core

    Специально для любителей книг из серии «С++ за 24 часа» решил написать статью про ASP.NET Core.

    Если вы раньше не разрабатывали под .NET или под какую-то аналогичную платформу, то смысла заходить под кат для вас нет. А вот если вам интересно узнать что такое IoC, DI, DIP, Interseptors, Middleware, Filters (то есть все то, чем отличается Core от классического .NET), то вам определенно есть смысл нажать на «Читать дальше», так как заниматься разработкой без понимания всего этого явно не корректно.

    IoC, DI, DIP

    Если театр начинается с вешалки, то ASP.NET Core начинается с Dependency Injection. Для того, чтобы разобраться с DI нужно понять, что такое IoC.

    Говоря о IoC очень часто вспоминают голливудский принцип «Don’t call us, we’ll call you». Что означает «Не нужно звонить нам мы позвоним вам сами».

    Различные источники приводят различные паттерны, к которым может быть применен IoC. И скорее всего они все правы и просто дополняют друг друга. Вот некоторые их этих паттернов: factory, service locator, template method, observer, strategy.

    Давайте разберем IoC на примере простого консольного приложения.

    Допустим у нас есть два простых класса, реализующих интерфейс с одним методом:

    Они оба зависят от абстракции (в данном случае в виде абстракции выступает интерфейс).

    И, допустим, у нас есть объект более высокого уровня, использующий эти классы:

    В зависимости от параметра конструктора переменная _instance инициализируется определенным классом. Ну и далее при вызове Write будет совершен вывод на консоль или в Debug. Все вроде бы неплохо и даже, казалось бы, соответствует первой части принципа Dependency Inversion

    Объекты более высокого уровня не зависят от объектов более низкого уровня. И те, и те зависят от абстракций.

    В качестве абстракции в нашем случае выступает ILayer.

    Но у нас должен быть еще и объект еще более высокого уровня. Тот, который использует класс Logging

    Инициализируя Logging с помощью 1 мы получаем в классе Logging экземпляр класса, выводящего данные на консоль. Если мы инициализируем Logging любым другим числом, то log.Write будет выводить данные в Debug. Все, казалось бы, работает, но работает плохо. Наш объект более высокого уровня Main зависит от деталей кода объекта более низкого уровня – класса Logging. Если мы в этом классе что-то изменим, то нам необходимо будет изменять и код класса Main. Чтобы это не происходило мы сделаем инверсию контроля – Inversion of Control. Сделаем так чтобы класс Main контролировал то, что происходит в классе Logging. Класс Logging будет получать в виде параметра конструктора экземпляр класса, реализующего интерфейс интерфейс ILayer

    И теперь нас класс Main будет выглядеть таким образом:

    Фактически мы декорируем наш объект Logging с помощью необходимого для нас объекта.

    Теперь наше приложение соответствует и второй части принципа Dependency Inversion:

    Абстракции не зависят от деталей. Детали зависят от абстракций. Т.е. мы не знаем деталей того, что происходит в классе Logging, мы просто передаем туда класс, реализующий необходимую абстракцию.

    Есть такой термин tight coupling – тесная связь. Чем слабее связи между компонентами в приложении, тем лучше. Хотелось бы заметить, что данный пример простого приложения немного не дотягивает до идеала. Почему? Да потому что в классе самого высокого уровня в Main у нас дважды используется создание экземпляров класса с помощью new. А есть такая мнемоническая фраза «New is a clue» — что означает чем меньше вы используется new, тем меньше тесных связей компонентов в приложении и тем лучше. В идеале мы не должны были использовать new DebugLayer, а должны были получить DebugLayer каким-нибудь другим способом. Каким? Например, из IoC контейнера или с помощью рефлексии из параметра передаваемого Main.

    Теперь мы разобрались с тем, что такое Inversion of Control (IoC) и что такое принцип Dependency Inversion (DIP). Осталось разобраться с тем, что такое Dependency Injection (DI). IoC представляет собой парадигму дизайна. Dependency Injection это паттерн. Это то, что у нас теперь происходит в конструкторе класса Logging. Мы получаем экземпляр определенной зависимости (dependency). Класс Logging зависит от экземпляра класса, реализующего ILayer. И это экземпляр внедряется (injected) через конструктор.

    IoC container

    IoC контейнер это такой объект, который содержит в себе множество каких-то определенных зависимостей (dependency). Зависимость можно иначе назвать сервисом – как правило это класс с определенным функционалом. При необходимости из контейнера можно получить зависимость необходимого типа. Внедрение dependency в контейнер — это Inject. Извлечение – Resolve. Приведу пример самого простого самостоятельно написанного IoC контейнера:

    Всего дюжина строчек кода, а уже можно использовать (не в продакшн, разумеется, а в учебных целях).

    Зарегистрировать зависимость (допустим, ConsoleLayer или DebugLayer которые мы использовали в прошлом примере) можно так:

    А извлечь из контейнера в необходимом месте программы так:

    В реальных контейнерах еще реализуется и Dispose(), позволяющий уничтожать ставшие ненужными ресурсы.

    Кстати, имя IoC контейнер не совсем точно передает смысл, так как термин IoC гораздо шире по применению. Поэтому в последнее время все чаще применяется термин DI контейнер (так как все-таки применяется dependency injection).

    Service lifetimes + various extension methods in Composition Root

    Приложения ASP.NET Core содержат файл Startup.cs который является отправной точкой приложения, позволяющей настроить DI. Настраивается DI в методе ConfigureServices.

    Этот код добавит в DI контейнер класс SomeRepository, реализующий интерфейс ISomeRepository. То, что сервис добавлен в контейнер с помощью AddScoped означает, что экземпляр класса будет создаваться при каждом запросе страницы.
    Добавить сервис в контейнер можно и без указания интерфейса.

    Но такой способ не рекомендуется, так как у вашего приложения теряется гибкость и появляются тесные связи. Рекомендуется всегда указывать интерфейс, так как в таком случае в любой момент времени можно заменить одну реализацию интерфейса другой. И если реализации поддерживают принцип Liskov substitution, то «легким движением руки» сменив название класса реализации вы измените и функционал всего приложения.

    Есть еще 2 варианта добавить сервис – AddSingleton и AddTransient.
    При использовании AddSingleton сервис создается один раз и при использовании приложения обращение идет к одному и тому же экземпляру. Использовать этот способ нужно особенно осторожно, так как возможны утечки памяти и проблемы с многопоточностью.

    У AddSingleton есть небольшая особенность. Он может быть инициализирован либо при первом обращении к нему

    либо сразу же при добавлении в конструктор

    Вторым способом можно даже добавить параметр в конструктор.
    Если хочется добавить параметр в конструктор сервиса, добавленного не только с помощью AddSingleton, но и с помощью AddTransient/AddScoped, то можно использовать лямбда выражение:

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

    Если с AddSingleton и AddScoped все должно быть более-менее понятно, то AddTransient требует разъяснений. Официальная документация приводит пример, в котором определенный сервис добавлен в DI контейнер и в качестве параметра конструктора другого сервиса и отдельно самостоятельно. И вот в случае, если он добавлен отдельно с помощью AddTransient, он создает свой экземпляр 2 раза. Приведу очень-очень упрощенный пример. В реальной жизни к применению не рекомендуется, т.к. классы для упрощения не наследуют интерфейсы. Допустим у нас есть простой класс:

    И есть второй класс, который содержит первый как зависимый сервис и получает эту зависимость в качестве параметра конструктора:

    Теперь совершаем inject двух сервисов:

    И в каком-нибудь контроллере в Action добавим получение наших зависимостей и вывод значений в окно Debug.

    Так вот в результате мы получим 2 разных значения Guid. А вот если мы заменим AddTransient на AddScoped, то в результате мы получим 2 одинаковых значения.

    В IoC контейнере приложений ASP.NET Core по умолчанию содержатся уже некоторые сервисы. Например, IConfiguration – сервис с помощью которого можно получить настройки приложения из файлов appsettings.json и appsettings.Development.json. IHostingEnvironment и ILoggerFactory с помощью которых можно получить текущую конфигурацию и вспомогательный класс, позволяющий проводить логирование.

    Извлекают классы из контейнера с помощью следующей типичной конструкции (самый банальный пример):

    В области видимости контроллера создается переменная с модификаторами доступа private readonly. Зависимость получается из контейнера в конструкторе класса и присваивается приватной переменной. Далее эту переменную можно использовать в любых методах или Action контроллера.
    Иногда не хочется создавать переменную для того, чтобы использовать ее только в одном Action. Тогда можно использовать атрибут [FromServices]. Пример:

    Выглядит странно, но для того, чтобы в коде не вызывать метод статического класса DateTime.Now() иногда делают так, что значение времени получается из сервиса в качестве параметра. Таким образом появляется возможность передать любое время в качестве параметра, а значит становится легче писать тесты и, как правило, становится проще вносить изменения в приложение.
    Нельзя сказать, что static – это зло. Статические методы выполняются быстрее. И скорее всего static может использоваться где-то в самом IoC контейнере. Но если мы избавим наше приложение от всего статического и new, то получим большую гибкость.

    Сторонние DI контейнеры

    То, что мы рассматривали и то, что фактически реализует ASP.NET Core DI контейнер по умолчанию, — constructor injection. Имеется еще возможность внедрить зависимость в property с помощью так называемого property injection, но эта возможность отсутствует у встроенного в ASP.NET Core контейнера. Например, у нас может быть какой-то класс, который вы внедряем как зависимость, и у этого класса есть какое-то public property. Теперь представьте себе, что во время или после того как мы внедряем зависимость, нам нужно задать значение property. Вернемся к примеру похожему на пример, который мы недавно рассматривали.
    Если у нас есть такой вот класс:

    который мы можем внедрить как зависимость,

    то используя стандартный контейнер задать значение для свойства мы не можем.
    Если вы захотите использовать такую возможность задать значение для свойства OperationId, то вы можете использовать какой-то сторонний DI контейнер, поддерживающий property injection. К слову сказать property injection не особо рекомендуется использовать. Однако, существуют еще Method Injection и Setter Method Injection, которые вполне могут вам пригодится и которые также не поддерживаются стандартным контейнером.

    У сторонних контейнеров могут быть и другие очень полезные возможности. Например, с помощью стороннего контейнера можно внедрять зависимость только в контролеры, у которых в названии присутствует определенное слово. И довольно часто используемый кейс – DI контейнеры, оптимизированные на быстродействие.
    Вот список некоторых сторонних DI контейнеров, поддерживаемых ASP.NET Core: Autofac, Castle Windsor, LightInject, DryIoC, StructureMap, Unity

    Хоть при использовании стандартного DI контейнера и нельзя использовать property/method injection, но зато можно внедрить зависимый сервис в качестве параметра конструктора реализовав паттерн «Фабрика» следующим образом:

    В данном случае GetService вернет null если зависимый сервис не найден. Есть вариация GetRequiredService, которая выбросит исключение в случае, если зависимый сервис не найден.
    Процесс получения зависимого сервиса с помощью GetService фактически применяет паттерн Service locator.

    Autofac

    Разберем Autofac на практическом примере. Удобно то, что сервисы из контейнера можно будет регистрировать и получать, как и дефолтным способом, так и с помощью Autofac.

    Установим NuGet пакет Autofac.Extensions.DependencyInjection.
    Изменим возвращаемое методом ConfigureServices значение с void на IServiceProvider. И добавим property

    После этого станет возможным добавить в конец метода ConfigureServices класса Startup код вроде следующего (это лишь один из вариантов регистрации сервисов):

    Здесь builder.Populate(services); добавляет в контейнер сервисы из IServiceCollection. Ну и далее уже можно регистрировать сервисы с помощью builder.RegisterType. Ах, да. Чуть не забыл. Необходимо изменить с void на IServiceProvider возвращаемое значение метода ConfigureServices.

    AOP с помощью ASP.NET Core — Autofac Interseptors

    Говоря про аспектно-ориентированное программирование, упоминают другой термин – cross-cutting concerns. Concern – это какая-то часть информации, которая влияет на код. В русском варианте употребляют слово ответственность. Ну а cross-cutting concerns это ответственности, которые влияют на другие ответственности. А в идеале ведь они не должны влиять друг на друга, так ведь? Когда они влияют на друг друга, то становится сложнее изменять программу. Удобнее, когда у нас все операции происходят по отдельности. Логирование, транзакции, кеширование и многое другое можно совершать с помощью AOP не изменяя код самих классов и методов.

    В мире .NET часто применяется способ, когда AOP код внедряется с помощью пост-процессора в уже откомпилированный код приложения (PostSharp) Или же альтернативно можно применять интерцепторы – это такие перехватчики событий, которые можно добавлять в код приложения. Эти перехватчики, как правило, используют для своей работы уже рассмотренный нами паттерн декоратор.

    Давайте создадим свой интерцептор. Самый простой и типичный пример, который проще всего воспроизвести — это логирование.
    Установим дополнительно к пакету Autofac.Extensions.DependencyInjection еще и пакет Autofac.Extras.DynamicProxy
    Установили? Добавим простенький класс лога, который будет вызываться при обращении к определенным сервисам.

    Добавляем в нашу регистрацию Autofac регистрацию интерцептора:

    И теперь при каждом обращении к классу будет вызван метод Intercept класса Logger.
    Таким образом мы можем упростить себе жизнь и не писать в начале каждого метода запись в лог. Она у нас будет вестись автоматически. И при желании нам будет несложно ее изменить или отключить для всего приложения.

    Также мы можем убрать .InterceptedBy(typeof(Logger)); и добавить перехват вызовов только для конкретных сервисов приложения с помощью атрибута [Intercept(typeof(Logger))] – необходимо указать его перед заголовком класса.

    Middleware

    В ASP.NET существует определенная цепочка вызовов кода, которая происходит при каждом request. Еще до того, как загрузился UI/MVC выполняются определенные действия.

    То есть, например, если мы добавим в начало метода Configure класса Startup.cs код

    то мы сможем посмотреть в консоли дебага какие файлы запрашивает наше приложение. Фактически мы получаем возможности AOP “out of box”
    Немного useless, но понятный и познавательный пример использования middleware я вам сейчас покажу:

    При каждом запросе начинает выполнятся цепочка вызовов. Из каждого app.Use после вызова next.invoke() совершается переход ко следующему вызову. И все завершается после того как отработает app.Run.
    Можно выполнять какой-то код только при обращении к определенному route.
    Сделать это можно с помощью app.Map:

    Теперь если просто перейти на страницу сайта, то можно будет увидеть текст “Hello!”, а если добавить к строке адреса /Goodbye, то вам будет отображено Goodbye.

    Кроме Use и Map можно использовать UseWhen или MapWhen для того, чтобы добавлять код в цепочку middleware только при каких-то определенных условиях.

    До сих пор были все еще useless примеры, правда? Вот вам нормальный пример:

    Здесь мы добавляем к каждому запросу заголовки, помогающие обезопасить страницу от хакерских атак.

    Или же вот пример локализации:

    Теперь если вы к адресу страницы добавите параметр ?culture=fr то вы сможете переключить язык приложения на французский (если в ваше приложение добавлена локализация, то все сработает)

    Filters

    Если цепочка middleware относятся к процессам до MVC, то фильтры работают вместе с MVC.
    Следующее схематическое изображение показывает, как отрабатывают фильтры

    Сначала отрабатывают фильтры авторизации. Т.е. можно создать какой-то фильтр или несколько фильтров и вписать в них какой-то свой код авторизации, который будет отрабатывать при запросах.

    Затем отрабатывают фильтры ресурсов. С помощью этих фильтров можно, например, вернуть какую-то информацию из кеша.

    Затем происходит привязка данных и выполняются Action фильтры. С их помощью можно манипулировать параметрами передаваемыми Action и возвращаемым результатом.

    Exception фильтры как намекает название позволяют добавить какую-то общую обработку ошибок для приложения. Должно быть довольно удобно обрабатывать ошибки везде одинаково. Эдакий AOP-шный плюс.

    Result фильтры позволяют совершить какие-то действия до выполнения Action контроллера или после. Они довольно похожи на Action фильтры, но выполняются только в случае отсутствия ошибок. Подходят для логики завязанной на View.

    Все должно быть более понятно на примере. А у меня под рукой как раз есть пример упрощенного авторизационного фильтра:

    Добавляете этот класс в DI контейнер (как обычно в Startup.cs)

    И теперь становится возможным добавить какую-то свою авторизацию любому Action добавив следующий атрибут

    Забавная штука – можно создать свое middleware и добавлять его каким-то action в качестве фильтра. Для того чтобы сделать так нужно создать класс с произвольным названием и методом Configure

    Теперь этот класс можно добавлять Action-ам с помощью следующего атрибута

    Илон Маск рекомендует:  Faq как узнать местоположение специальных папок у windows
  • Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL