Что такое код asp application_onend


Содержание

Файл global.asax

Файл global.asax позволяет записывать обработчики событий, реагирующие на глобальные события. Пользователи не могут запрашивать файл global.asax напрямую. Файл global.asax выполняет свой код автоматически в ответ на некоторые события приложения.

Код в файле global.asax пишется точно так же, как и для веб-формы. Отличие заключается в том, что файл global.asax не содержит дескрипторов HTML или ASP.NET. Вместо этого он содержит методы со специфическими предопределенными именами.

Хотя в показанном коде это не отражено, в каждом файле global.asax определены методы для единственного класса — класса приложения. Класс приложения унаследован от HttpApplication, что позволяет работать в коде со всеми его общедоступными и защищенными членами. В этом примере используется объект Response, который является встроенным свойством класса HttpApplication, точно так же, как и встроенным свойством класса Page.

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

Как и в случае веб-форм, содержимое файла global.asax также можно разнести в два файла: один — с объявлением, а второй — непосредственно с кодом. Однако поскольку поверхности проектирования для файлов global.asax не предусмотрено, в этом нет никакой необходимости, поэтому в Visual Studio и не предлагается опция для создания файла global.asax с классом отделенного кода.

В случае создания веб-приложения как веб-проекта Visual Studio будет применять подход с отделенным кодом и создавать два файла: global.asax (который будет практически пустым) и связанный с ним global.asax.cs (который содержит класс приложения со всеми обработчиками событий). Конечный результат будет точно таким же.

Файл global.asax является необязательным, но каждому веб-приложению разрешено иметь не более одного файла global.asax, который должен находиться в корневом каталоге приложения, а не в каком-то из его подкаталогов. Чтобы добавить файл global.asax в проект, выберите в меню Website (Веб-сайт) (или в меню Project (Проект), если используется модель веб-проекта) пункт Add New Item (Добавить новый элемент) и укажите шаблон Global Application Class (Глобальный класс приложения). (Если в проекте уже присутствует файл global.asax, этот шаблон отображаться не будет.)

При добавлении файла global.asax Visual Studio включает в него пустые обработчики для большинства наиболее распространенных событий приложений, поэтому разработчику остается только поместить свой код в нужные методы.

Стоит отметить, что обработчики событий приложения в файле global.asax присоединяются не так, как обработчики событий обычных элементов управления. Чаще всего для присоединения обработчика событий приложения используется распознаваемое имя метода. Например, если создан защищенный метод по имени Application_OnEndRequest(), то ASP.NET будет автоматически вызывать его при возникновении события HttpApplication.EndRequest. В действительности все зависит от соглашения. Разработчик вполне может решить присоединить обработчик событий к событию HttpApplication.EndRequest, а не предоставлять метод Application_OnEndRequest().

При первой загрузке домена приложения ASP.NET создает пул объектов приложения и использует его для обслуживания каждого запроса. Размер этого пула может варьироваться в зависимости от системы и количества доступных потоков, но обычно включает от 1 до 100 экземпляров. Каждому запросу предоставляется эксклюзивный доступ к одному из этих объектов приложения, а когда обработка запроса завершается, объект становится доступным для повторного использования. По мере прохождения приложением различных стадий обработки ASP.NET вызывает соответствующие методы, которые приводят в действие написанный разработчиком код. Конечно, в случае, если имена методов указаны неправильно, ASP.NET не может вызывать их, и тогда написанный разработчиком код просто игнорируется.

События приложения

В файле global.asax могут обрабатываться события двух следующих типов:

события, которые возникают всегда, для каждого запроса. К числу таких событий относятся события, связанные запросом, и события, связанные с ответом;

события, которые возникают только при определенных условиях.

Обязательные события разворачиваются в описанном ниже порядке:

Application_BeginRequest(). Этот метод вызывается в начале каждого запроса.

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

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

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

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

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

Application_PreRequestHandlerExecute(). Этот метод вызывается перед тем, как соответствующий обработчик HTML выполнит запрос.

В этот момент производится обработка запроса соответствующим обработчиком. Например, если это запрос веб-формы, то выполняется код обработки события для страницы, и для страницы генерируется HTML-код.

Application_PostRequestHandlerExecute(). Этот метод вызывается сразу после того, как будет обработан запрос.

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

Application_UpdateRequestCache(). Этот метод вызывается перед добавлением информации в кэш выходных данных. Например, если вы включили кэширование выходных данных для веб-страницы, то ASP.NET в этот момент поместит сгенерированный HTML-код страницы в кэш.

ApplicationEndRequest(). Этот метод вызывается в конце запроса перед тем, как объекты будут освобождены и восстановлены. Это подходящая точка для кода очистки.

На рисунке показан процесс обработки одного запроса:

Некоторые события срабатывают не при каждом запросе:

Application_Start()

Этот метод вызывается, когда впервые запускается приложение и создается домен приложения. В данный обработчик события удобно помещать код инициализации всего приложения. Например, в этот момент можно загрузить и кэшировать данные, которые не будут изменяться в течение времени жизни приложения; к ним можно отнести деревья навигации, статические каталоги товаров и т.п.

Session_Start()

Этот метод вызывается каждый раз, когда начинается новый сеанс. Он часто применяется для инициализации информации, специфичной для пользователя.

Application_Error()

Этот метод вызывается всякий раз, когда в приложении возникает необработанное событие.

Session_End()

Этот метод вызывается всякий раз, когда сеанс пользователя завершается. Сеанс завершается, когда код явно освобождает его или когда истекает срок его действия из-за отсутствия запросов на протяжении указанного периода времени (обычно 20 минут). Как правило, этот метод применяется для очистки любых связанных с сеансом данных. Однако вызывается этот метод только в том случае, если используется внутрипроцессный режим хранения состояния сеансов (режим InProc, а не StateServer или SQLServer).

Application_End()

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

Application_Disposed()

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

События приложений обычно используются для выполнения инициализации приложения, очистки, регистрации использования, профилирования и поиска и устранения неисправностей. Однако не следует думать, что приложению обязательно нужны глобальные события приложения. Многие приложения ASP.NET вообще не используют файл global.asax.

Файл global.asax не является единственным местом, где можно реагировать на глобальные события веб-приложений. Можно также создать специальные модули, принимающие участие в обработке веб-запросов.

Демонстрация событий приложения

В следующем веб-приложении используется файл global.asax, который реагирует на событие HttpApplication.Error. Он перехватывает ошибку и отображает некоторую информацию в предопределенном формате:

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

Запросив эту страницу, вы увидите следующий результат:

Обычно вы не будете использовать метод ApplicationError(), поскольку он не обладает достаточной гибкостью для работы с различными типами ошибок (если только не предусмотреть большой объем условного кода). Конфигурировать страницы специальных ошибок можно с использованием IIS. Однако метод ApplicationError() может оказаться чрезвычайно полезным, если вы захотите зарегистрировать ошибку, чтобы исследовать ее в будущем или даже отправить администратору системы электронное письмо с уведомлением о ней. В действительности, во многих случаях вам понадобятся именно эти технологии, поскольку объект Response не будет доступен. Двумя такими примерами являются методы Application_Start() и Application_End().

Что такое код asp application_onend

Описание объекта Application

Вы можете использовать данный метод для того, чтобы сделать доступной информацию между всеми пользователями данного приложения. Основанное на ASP приложение определено как все .asp-файлы в виртуальной директории и всех ее поддиректориях. Из-за того, что объект Application может быть доступен («зашарен») более чем одному пользователю, то в нем предусотренно два метода — Lock и Unlock (заблокировать и разблокировать) для того, чтобы быть уверенным, что сразу несколько пользователей не смогут попытаться изменять свойства одновременно.

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

Application(«greeting») = «Добро пожаловать на наш вэб-сервер!»
Application(«num») = 25
%>

Для каждой из этих переменных предполагается их членство в коллекции Application Contents.

Вы можете также связать компонент с переменной. Если вы связываете сомпонент к переменной с помощью объекта Server.CreateObject, то переменная будет членом коллекции Application.Contents. Если переменная связана с тэгом , то переменная будет членом коллекции Application StaticObjects.

Если вы связываете конкретный компонент с переменной в коллекцией Application Contents Collection и используете Visual Basic Scripting Edition как основной язык написания скриптов, вы должны использовать ключевое слово Set. Это иллюстрированно следующим примером.


Вы можете также определить методы и свойства компонента MyComponent следующим скриптом

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

Set MyLocalObj1 = Application(«Obj1»)
MyLocalObj1.MyObjMethod
%>

Другой способ, чтобы создать объект с использованием тэга в файле Global.asa. Для более полной информации смотрите описание Global.asa.

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

Set Application(«var1») = Session
Set Application(«var2») = Request
Set Application(«var3») = Response
Set Application(«var4») = Server
Set Application(«var5») = Application
Set Application(«var6») = ObjectContext
%>

Если вы храните массив в объекте Application то вы не должны пытаться обращаться к элементам, хранящимся в массиве напрямую. К примеру, следующий скрипт не работает

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

—file1.asp—

‘Создаем и инициируем массив
dim MyArray()
Redim MyArray(5)
MyArray(0) = «привет!»
MyArray(1) = «какая-либо другая строка»

‘Запоминание массива в объекте Application
Application.Lock
Application(«StoredArray») = MyArray
Application.Unlock

—file2.asp—

‘Получение массива из объекта Application
‘и модицикация второго элемента
LocalArray = Application(«StoredArray»)
LocalArray(1) = » Люди!»

‘вывод строки «привет! Люди!»
Response.Write(LocalArray(0)&LocalArray(1))

‘Перезапись массива в объект Application
‘Данное действие перепишет значения в StoredArray на новые
Application.Lock
Application(«StoredArray») = LocalArray
Application.Unlock
%>

Следующий пример использует переменную NumVisits для хранения числа посещений, когда страница была получена клиентом. Метод Lock вызывается тогда, когда есть возможность того, что к переменной NumVisits может возникнуть паралелльное обращение. Вызывая метод Unlock вы разрешаете обращаться к данной переменной (объекту Application) другим пользователям.

Application.Lock
Application(«NumVisits») = Application(«NumVisits») + 1
Application.Unlock
%>

Вы посетитель этой страницы!

Коллекция Application. Contents

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

ключ
Указанное имя элемента для его получения.

Коллекция Application.Contents содержит те элементы которые были определены на уровне приложения без использования тэга . Это касается обеих объектов — созданных с использованием Server.CreateObject и с использованием скалярных переменных установленных через определение Application. В следующем скрипте, к примеру, оба и MyVar и MyObj будут членами коллекции Application.Contents.

Application(«MyVar») = «Привет!»
Set Application(«MyObj») = Server.CreateObject(«MyComponent»)
%>

Коллекция Application.Contents поддерживает циклы типа For. Each и For. Next.
Следующие два примера иллюстрируют каждый из вышеуказанных методов циклов использования Application.Contents.

For Each Key in Application.Contents
response.write («key»)
Next Key
%>

For i = 1 to Application.Contents.Count
response.write(«key»)
Next Key
%>

Коллекция Application. StaticObjects

Коллекция StaticObjects содержит все объекты, созданные с использованием тэга и объекта Application. Вы можете использовать коллекцию для того, чтобы определить значения указанных свойств для объекта или создать цикл по коллекции и получить все свойства для всех статических объектов.

ключ
Указанное имя элемент для обращения к нему.

Вы можете использовать управление циклом чтобы перебирать ключи в коллекции StaticObjects. Это продемонстрированно следующим примером:

For Each ObjProp in Application.StaticObjects
response.write(ObjProperty & » : » & Application.StaticObjects(ObjProp) & «
«)

Метод Application. Lock

Метод Lock блокирует для других клиентов переменные, хранимые в объекте Application от изменеия. Потому, как только один клиент может в данный момент времени получить доступ к переменным объекта. Если вы не вызываете метод Unlock после обработики переменных, то сервер сам разблокирует данный объект, когда истечет время (timeout) работы скрипта .asp.

Application.Lock
Application(«NumVisits») = Application(«NumVisits») + 1
Application.Unlock
%>

Вы посетитель данной страницы.

В предыдущем примере метод Lock предохраняет переменную NumVisits объекта Application от доступа к нему одновременно нескольких клиентов. Если бы приложение не было бы заблокированно, то два клиента попробывали-бы одновременно увеличить значение переменной NumVisits.

Метод Application. Unlock

Метод Unlock разблокирует заблокированные ранее переменные c помощью метода Lock.

Application.Lock
Application(«NumVisits») = Application(«NumVisits») + 1
Application.Unlock
%>

Вы посетитель данной страницы.

В предыдущем примере метод Unlock разблокирует переменную NumVisits объекта Application, заблокированную ранее объектом Lock от доступа к нему одновременно нескольких клиентов.

Событие Application_OnEnd

Данное событие активизируется, когда приложение закрывается, а точнее после события Session_OnEnd. Только встроеные объекты Application и Server доступны.

язык_программирования
параметр, который указывает на то, каким языком будет написан скрипт. Например JavaScript или VisualBasic.

Вы не можете вызывать метод MapPath (объект Server) в подпрограмме Application_OnEnd.

Событие Application_OnStart

Данное событие активизируется, когда активируется новая сессия, такая, как, к примеру, Session_OnStart. Только встроенные объекты Application и Server доступны. Обращение к объектам Session, Request или Response в подпрограмме Application_OnStart вызовет ошибку.

язык_программирования
параметр, который указывает на то, каким языком будет написан скрипт. Например JavaScript или VisualBasic.

Что такое код asp application_onend

The Application_OnEnd event occurs when the application ends, after the Session_OnEnd event (see below). Only the Server and Application objects are available.

Syntax: ASP Application_OnEnd Event
Parameters: ASP Application_OnEnd Event

Specifies the scripting language used to write the event script, either Sun ONE ASP VBScript or Sun ONE ASP JavaScript. If more than one event uses the same scripting language, the events can be enclosed within a single set of tags.

Что такое код asp application_onend

Этот текст предназначен для тех, кто никогда не имел дела с 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’е.

Илон Маск рекомендует:  Sqlоперации выборки из представлений


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

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-сервера. Вот пример ее использования:

Создание 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.

Рис. 1. Иерархия объектов ASP-сервера

Объект 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.

Рис. 2. Результат выполнения метода GetCallCount в ASP-сервере

Напротив названия каждого метода стоит число обращений к нему клиента в текущей сессии. Если вызвать команду 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.

Рис. 3. Навигация по набору данных в ASP-приложении

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

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

Программирование на ASP

Основы ASP

С помощью объекта Response код ASP может выполнять запись текста на клиенте – любого содержимого, включая код, выполняющийся на клиенте. IIS различает код, выполняющийся на сервере, и содержимое, отправляемое клиенту с помощью расширения ISAPI ASP . DLL , анализируя файл ASP на наличие начального (» «) тега и выполняя код, расположенный между ними, с помощью WSH.

На рисунке 12.7 показан пример редактирования страницы ASP с помощью Visual Interdev. На одной и той же ASP -странице расположены строки содержимого, записываемые на клиенте с помощью объекта Response , и код, выполняемый на сервере.

Первая строка кода – – сообщает ASP . DLL о том, что необходимо начать поиск кода для интерпретации. В данном примере для обработки ASP -страницы установлен язык ASP , поэтому тег %> в конце выполняемого кода означает, что все последующие строки кода должны игнорироваться, за исключением тега .

Как показано на рисунке 12.7, если ASP . DLL встречает тег после строки с тегом , то интерпретирует последующие строки кода вплоть до конечного тега %> , расположенного после строки Response.Write(«what time is it? ->» & now()) . Результат запроса браузером файла MyAspFile1.asp (страница ASP на рис. 12.7) показан на рис. 12.8.

Объекты ASP

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

  • Объект Response. Используется для записи данных в запрос HTTP, возвращаемый клиенту.
  • Объект Aplication. Содержит параметры и конфигурации по настройке работы ASP для данного веб-сайта.
  • Объект Request. Хранит содержимое HTTP-запроса и обеспечивает вспомогательные функции для обработки разработчиком данных HTTP-запроса.
  • Объект Server. Содержит информацию о веб-сервере, веб-сайте, а также обеспечивает поддержку вызывающего программного обеспечения.
  • Сеанс. Представляет собой состояние заданного веб-сеанса с заданным хостом и клиентом.

Объект Response

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

Объект Application

Объект Application используется, в основном, в файле global. asa для фиксирования событий приложения ASP. Объектом Application фиксируются следующие события.

  • Session_OnStart. Вызывается при первом запросе пользователя к веб-сайту.
  • Session_OnEnd. Вызывается по завершении сеанса пользователя.
  • Application_OnStart. Вызывается при первом запросе пользователем страницы.
  • Application_OnEnd. Вызывается при отключении IIS.

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

Путь ASP.NET Core [уровень 1] Основы

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

Если вы считаете, что уже достаточно круты в новом фреймворке — можете попробовать пройти тест до того, как прочтете статью. Линк. Весь код проекта можно посмотреть на гитхабе.

Первая часть включает:

  • Что такое .NET Core и ASP.NET Core?
  • Основы создания приложения и его структура
  • Добавление новых элементов, скаффолдинг
  • Основы встроенного Dependency Injection
  • Деплоймент в Azure

Разберемся в терминах. Один из наиболее не понятных моментов — это зависимость между старым фреймворком ASP.NET MVC и новым ASP.NET Core, а также в чем отличия .NET и .NET Core. Начнем с последнего. .NET Core — это общая платформа для разработки программного обеспечения. Фактически это еще одна реализация стандарта .NET (другие реализации — .NET, Mono). Отличия и особенности этой реализации (.NET Core) в том, что она:

  • С открытым исходным кодом
  • Кроссплатформенная
  • Гибкая в установке — может быть внутри приложения и можно поставить несколько версий на одной и той же машине
  • Все сценарии работы поддерживаются с помощью консольных инструментов

Перейдем к ASP.NET Core. Это новый фреймворк от Microsoft для разработки Веб приложений, который появился вследствие редизайна ранее существующего фреймворка ASP.NET MVC. Нужно понимать, что ASP.NET Core не обязательно должен базироваться на .NET Core. Можно создать ASP.NET Core приложение на основе старого доброго .NET. Такая опция есть в стандартном диалоге создания нового проекта:

В чем же тогда особенности и отличия ASP.NET Core от предыдущего ASP.NET? Некоторые из них это:

  • Возможность намного лучше контролировать нужные модули, сборки. Например, нет жесткой привязки к IIS, System.Web.dll
  • Встроенный функционал для внедрения зависимостей
  • Открытый исходный код

Кроме того, Core приложение теперь унифицировано с другими типами приложений. Теперь, оно таким же образом включает метод Main, который вызывается при запуске приложения, а тот в свою очередь просто запускает Веб часть. Минимальное приложение выглядит примерно таким образом:

Класс Statup можно, в какой-то степени, охарактеризовать как новый вариант Global.asax (Это класс для глобальной настройки всего приложения в предыдущей версии ASP.NET). Грубо говоря, можно сказать, что метод ConfigureServices нужен для конфигурации контейнера для внедрения зависимостей и его сервисов, а метод Configure для конфигурации конвейера обработки запросов.

Приступим к практической реализации

Для того, чтобы лучше понять все новшества, создадим ASP.NET Core приложение на основе .NET Core.

Чтобы облегчить себе жизнь, выберем Web Application и поменяем аутентификацию на Individual User Accounts. Таким образом Visual Studio уже сгенерирует весь нужный код для базового приложения.

Рассмотрим детальней что же нового появилось в ASP.NET Core. С точки зрения разработки вся концепция осталась прежней. Структура проекта базируется на паттерне MVC. Для работы с данными по умолчанию используем Entity Framework, логика описана в классах-контроллерах, на уровне представлений используем синтаксис cshtml + новая фишка tag helpers.

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

Дополним модель базы данных сущностями для создания и прохождения тестов. Будем использовать следующие сущности: Набор тестовых вопросов — TestPackage, Сам вопрос (тест) — TestItem, Результат теста — TestResult. Пример можно посмотреть тут. Радует, что EntityFramework Core уже поддерживает большинство функционала и можно полноценно пользоваться Code First миграциями.

Добавляем логику

Теперь, когда у нас есть модель базы данных, мы можем приступить к созданию логики для нашего приложения. Самый простой способ создания админки — это механизм scaffolding. Для этого, кликаем правой кнопкой мыши по папке контроллеров и выбираем Add → New Scaffold Item:

Выбираем «MVC Controller с представлениями, с использованием Entity Framework». Этот шаблон позволяет нам быстро создать контроллер и вьюхи для управления одной конкретной моделью. Проделаем такой трюк для TestPackage и TestItem. В результате у нас есть готовый прототип админки для нашей системы. Можно запустить проект и зайти на страницы этих контроллеров, просто добавить его имя без слова Controller в конец адреса, например, /testpackages. Конечно в ней еще не все идеально, поэтому нужно допилить некоторые моменты и сделать их более удобными.


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

В общем, все что нужно для теста у нас есть.

Основы Dependency Injection в ASP.NET Core

Важным новшеством новой версии ASP.NET так же является встроенный механизм внедрения зависимостей. В 2020 году уже никого не удивишь тем, что механизм внедрения зависимостей можно перенести внутрь фреймворка. Мало какое серьёзное приложение пишут без использование этого подхода. DI в ASP.NET Core реализован достаточно базово, но в то же время позволяет решить большинство задач управления зависимостями.

Конфигурация контейнера осуществляется в методе ConfigureServices класса Startup. Пример:

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

После регистрации сервисов, самый легкий способ получить из в коде (например, в контроллерах) — это просто добавить параметр конструктора типа, который был зарегистрирован. Такие контроллеры по умолчанию создаются скаффолдингом.

Деплой

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

Выводы

Пока не известно будущее «классического» .NET фреймворка, так как он, все же, является более стабильным и проверенным, поэтому может существовать еще довольно долго (привет, Python 2), хотя возможна и ситуация быстрой миграции большинства девелоперов на Core версии (не такой уже .NET и старый — 14 лет всего лишь).

ASP Application_OnStart and Application_OnEnd Events

Application_OnStart Event

The Application_OnStart event occurs before the first new session is created (when the Application object is first referenced).

This event is placed in the Global.asa file.

Note: Referencing to a Session, Request, or Response objects in the Application_OnStart event script will cause an error.

Application_OnEnd Event

The Application_OnEnd event occurs when the application ends (when the web server stops).

This event is placed in the Global.asa file.

Note: The MapPath method cannot be used in the Application_OnEnd code.

ASP.Net — папки App_Data & App_Code?

В чем смысл наличия папок App_code и App_data ?

Почему мой объект objectDataSource не обнаруживает классы, если файлы не находятся в App_Code?

Пожалуйста, предоставьте как можно больше деталей, я новичок в ASP.Net

Эти папки имеют особое назначение. Из этой статьи — Структура папок веб-проекта ASP.NET.

App_Code содержит исходный код для общих классов и бизнес-объектов (например. cs и .vb файлы), которые вы хотите скомпилировать как часть вашего приложения. В динамически скомпилированном проекте веб-сайта ASP.NET компилирует код в папке App_Code при первоначальном запросе вашего приложения. Элементы в этой папке затем перекомпилируются, когда обнаружены какие-либо изменения.

Примечание. Вы можете добавить любой тип файла класса в папку App_Code, чтобы создать строго типизированные объекты, которые представляют эти классы. Например, если вы помещаете файлы веб-сервиса (.wsdl и .xsd) в папку App_Code, ASP.NET создает строго типизированные прокси для этих классов.

Код в папке App_Code автоматически ссылается в вашем приложении. Папка App_Code может содержать подкаталоги файлов, которые могут включать файлы классов, которые находятся на разных языках программирования.

Что такое код asp application_onend

ASP скрипту, которому передаются данные абсолютно без разницы, какой метод передачи вы используете. Так что лучше, когда вы передаёте данные из HTML формы, используйте метод Post.

Переменные уровня сессии и приложения

Часто бывает необходимо, чтобы хранимые в приложении переменные были доступны в течение всей сессии. Для этого можно использовать так называемые cookies, но у клиента может быть отключена поддержка cookies и в этом случае ваша затея потерпит неудачу.
В ASP существует объект Session. Сессия начинается при первом обращении пользователя к страницам приложения и заканчивается при отсутствии активности пользователя в течении времени, установленного в настройках сервера. В объекте Session можно хранить переменные, которые будут доступны всем страницам вашего приложения на время сессии. Запись данных производится просто:

Session («email») = «pavel@vbnet.ru»

А считываются данные ещё проще:

Dim email
email = Session («email»)
Response.Write email

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

Application («url») = «http://vbnet.ru»

Dim url
url = Application («url»)
Response.Write «Это » & url & «»

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

Работа с базами данных на ASP осуществляется с помощью технологий ADO и ODBC. Для соединения с базой данных нужно обязательно указывать источник данных. Источник данных — информация о базе данных, главным образом о её типе и местонахождении.
ADO (ActiveX Data Objects) — библиотека, содержащая объекты, с помощью которых можно работать с БД. Чаще всего используются объекты Connection и Recordset. Экземпляры объектов создаются с помощью метода CreateObject объекта Server. Сначала нужно создать соединение (объект Connection), открыть его с помощью метода Open, затем создаём рекордсет (объект Recordset) и открываем его методом Open.
Например:

Set RS = Server.CreateObject («ADODB.Recordset») ‘создаём рекордсет
sSQL = «Select * From Authors Order By name;» ‘формируем SQL запрос
RS.Open sSQL, Conn ‘открываем рекордсет

If RS.BOF = False Or RS.EOF = False Then ‘если в рекордсете есть записи, то
RS.MoveFirst ‘перемещаемся к первой записи
%>

Рекордсет следует использовать только если нужно получить данные из БД. Если же нужно только выполнить SQL команду действия, то рекордсет не нужен. Для выполнения SQL запроса действия используется метод Execute объекта Connection.

) ‘Получаем значение переменной id
sSQL = «Update articles Set hits=hits+1 Where > Conn.Execute sSQL ‘Выполняем запрос
Conn.Close ‘закрываем соединение
Set Conn = Nothing ‘уничтожаем соединение
%>

Включение файлов

Вы можете включать в ASP страницу код из других файлов. Для этого используется команда #include. Рассмотрим её работу на примере включения меню сайта, расположенного в файле menu.inc в ASP страницу.

Теперь в ASP странице там, где нужно поместить меню, вставляем эту строку:

Плюсы использования этой возможности ASP очевидны. В примере, расположенном выше, для изменения меню сайта не нужно править все ASP страницы, а нужно исправить только один файл menu.inc.
Все команды include обрабатываются сервером до выполнения кода. Например, следующий скрипт не сможет открыть файл Header1.inc, так как в ASP попытка выполнить команду #include будет предпринята раньше, чем имя файла будет назначено переменной name.

Возможно использование вложенных include файлов. Например в файле menu.inc имеется команда включения файла copyright.inc.
Недопустимы так называемые «перекрёстные» include файлы. Например в файле menu.inc имеется команда включения файла include.inc, а в include.inc расположена команда включения menu.inc. Такие включения не будут обработаны сервером и будет сгенерирована ошибка.
Команды и процедуры скриптов полностью должны быть заключены в ограничители сценариев , теги HTML или теги HTML . То есть, нельзя открыть ограничитель скрипта во включающем файле .asp и закрыть его во включаемом файле; скрипт или команда скрипта должны присутствовать в виде отдельных законченных модулей. Например, следующий скрипт не будет работать:

Следующий скрипт будет работать:

Обработка событий приложения

В ASP имеется четыре события, которые может обрабатывать разработчик. Это старт/стоп сессии и старт/стоп приложения. Обработчики этих событий размещаются в файле global.asa в корневом каталоге приложения. Макет этого файла:

HTTP переменные

Используя объект Request можно получить некоторые переменные, полученные от браузера. Ниже перечислены некоторые из них:

ID Имя E-mail URL
Переменная Описание
ALL_HTTP Все HTTP заголовки.
ALL_ROW Все заголовки в raw-форме. Отличие от ALL_HTTP состоит в том, что в ALL_HTTP имя заголовка стоит после HTTP_ и написано заглавными буквами. А в ALL_ROW имена заголовков передаются в таком виде, в каком они были посланы пользователем.
APPL_MD_PATH Передаёт логический путь к приложению для ISAPI DLL.
APPL_PHYSICAL_PATH Передаёт физический путь к приложению.
AUTH_PASSWORD Значение, введённое пользователем в диалог аутотентификации. Переменная доступна только если была использована аутентификация.
AUTH_TYPE Метод аутотентификации, используемый сервером для ограничения доступа пользователей к защищённому скрипту.
AUTH_USER Имя аутотентифицированного пользователя.
CERT_COOKIE Уникальный ID для сертификата клиента.
CERT_FLAGS Bit0 равен 1, если присутствует сертификат пользователя. Bit1 равен 1, если Certifying Authority пользователя недействительно (отсутствует в списке CA на сервере).
CERT_ISSUER Значение поля Issuer сертификата пользователя (O=MS, OU=IAS, CN=user name, C=USA).
CERT_KEYSIZE Размер ключа в соединении Secure Sockets Layer.
CERT_SECRETKEYSIZE Размер ключа личного сертификата сервера.
CERT_SERIALNUMBER Серийный номер сертификата пользователя.
CERT_SERVER_ISSUER Значение поля Issuer сертификата сервера.
CERT_SERVER_SUBJECT Значение поля Subject сертификата сервера.
CERT_SUBJECT Значения поля Subject сертификата пользователя.
CONTENT_LENGTH Длина данных, переданных пользователем скрипту.
CONTENT_TYPE Тип данных, переданных пользователем. Используется при запросах, как Get, Post, Put.
HTTP_ Передаёт значение заголовка HTTP_ .
Примечание: Сервер заменяет знак подчёркивания [_] в ИмяЗаголовка на тире [-]. Например, если Вы запросите заголовок HTTP_MY_HEADER, то сервер будет искать заголовок с именем HTTP_MY-HEADER.
HTTPS Возвращает ON, если запрос от пользователя был получен через защищённый канал и возвращает OFF, если запрос получен через незащищённый канал.
HTTPS_KEYSIZE Размер ключа в соединении Secure Sockets Layer.
HTTPS_SECRETKEYSIZE Количество бит в личном ключе сертификата сервера. Например, 1024.
HTTPS_SERVER_ISSUER Значение поля Issuer сертификата сервера.
HTTPS_SERVER_SUBJECT Значение поля Subject сертификата сервера.
INSTANCE_ID ID копии IIS в текстовом формате.
INSTANCE_META_PATH Metabase путь копии IIS, которая отвечает на запрос.
LOCAL_ADDR IP адрес сервера.
LOGON_USER Логин пользователя в Windows NT.
PATH_INFO Дополнительная информация о пути, переданная клиентом.
PATH_TRANSLATED Физический путь, полученный из виртуального пути PATH_INFO.
QUERY_STRING Информация запроса, находящаяся в url после знака вопроса [?].
REMOTE_ADDR IP адрес пользователя.
REMOTE_HOST Имя компьютера пользователя.
REMOTE_USER Имя пользователя, посланное пользователем.
REQUEST_METHOD Метод отправки запроса. Для HTTP это: Get, Head или Post.
SCRIPT_NAME Виртуальный путь к исполняемому скрипту.
SERVER_NAME Имя сервера, DNS или IP адрес сервера.
SERVER_PORT Номер порта сервера, на который был послан запрос.
SERVER_PORT_SECURE Если порт, на который был послан запрос, охраняется, то эта переменная будет иметь значение 1. В отличном случае — 0.
SERVER_PROTOCOL Название и версия протокола запроса информации. Имеет формат: Протокол/Версия.
SERVER_SOFTWARE Название и версия программного обеспечения сервера, которое отвчает на запрос и стартует сессию.
URL Основная часть url.

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

Dim IP
IP = Request («REMOTE_ADDR»)
Response.Write IP

Так как все HTTP заголовки входят в коллекцию ServerVariables, можно использовать для получения их значений цикл For Each . Next.





Переменные сервера Value

Работа с почтой

Рано или поздно у разработчика ASP-приложения появляется необходимость работы с электронной почтой. Например, нужно отправить пользователю забытый пароль или направить автору вопроса на форуме ответ на него и т.д. Для этого можно воспользоваться стандартной библиотекой CDO (Collaboration Data Objects). Эта библиотека имеет очень разветвлённую объектную структуру. В этой статье мы рассмотрим только отправку сообщений с помощью CDO. Для этого используется объект Message. Мы воспользуемся такими свойствами, как From, To, Subject, BodyPar, Body, HTMLBody и одним методом Send.
Сначала, как всегда, создаём ссылку на объект.

Dim mailMessage, sBody
Set mailMessage = Server.CreateObject («CDO.Message»)

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

mailMessage.From = «mailrobot@vbnet.ru@
mailMessage.To = «vasya@pupkin.ru»
mailMessage.BodyPart.Charset = «koi8-r»
mailMessage.Subject = «Тема собщения»
sBody = «Уважаемый Василий Пупкин!» & vbCrLf & «Вы приглашены на открытие раздела сайта VBNet.ru Справочник Visual Basic» & vbCrLf & «С наилучшими пожеланиями, Администрация VBNet.ru»
mailMessage.Body = sBody

Если Вы хотите отправить сообщение не в текстовом, а HTML формате, то нужно использовать свойство htmlBody вместо Body:

sBody = «Уважаемый Василий Пупкин!
Вы приглашены на открытие раздела сайта VBNet.ru Справочник Visual Basic
С наилучшими пожеланиями, Администрация VBNet.ru»
mailMessage.htmlBodyBody = sBody

Теперь отправляем сообщение, используя метод Send.

После того, как письмо отправлено, уничтожаем объект mailMessage для освобождения памяти.

Илон Маск рекомендует:  Что такое код w32api_set_call_method
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL