Asp возможности клиента


Содержание

Asp возможности клиента

Данный документ подготовлен мною после просмотра материалов российского сервера http://www.activeserverpages.ru/, чей логотип служит заголовком этой статьи. Невозможность получить серьезную документацию по ASP на русском языке подтолкнули меня к написанию данного материала. Документ предназначен для оказания первой помощи всем желающим в ознакомлении и применении технологии активных серверных страниц и не предназначен для коммерческого использования.

Что такое Активные Серверные Страницы (Active Server Pages — ASP)?

Основная идея заключается в том, чтобы заставить Web-сервер посылать клиенту информацию в стандартном формате HTML, формируемую «налету» и способную изменять свое содержимое в зависимости от некоторых условий, например, текущего времени или даты, предыдущего запроса пользователя или точки вызова. Понятно, что необходимо определить алгоритм такого «интеллектуального» поведения, а, значит, без программирования, ну хотя бы на простеньком Бейсике, тут не обойтись. Так вот, кстати, документ ASP, запрашиваемый пользователем и состоит из HTML-тэгов, форматирующих некоторые строки информации, с вплетенными в них строками алгоритма на языке Visual Basic Script. Так что основой ASP лично я считаю HTML + VBScript + изучение весьма немногочисленных особенностей в рамках технологии ASP.

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

. В этот выходной рабочий день мы желаем вам хорошего настроения.

Функция Visual Basic WeekDay (ДеньНедели) определяет день недели от текущей даты (Date). Если это 1 (воскресенье — см. справочник по VB), то пользователю будет отослано слово выходной , иначе — рабочий , но ни в коем случае оба сразу. Пользователь видит только окончательно сформированные строки документа и не видит строки VBScript, т.е. он получает либо » В этот выходной день мы желаем вам хорошего настроения » либо » В этот рабочий день мы желаем вам хорошего настроения «. Таким образом, язык скрипта позволяет управлять различными фрагментами документа: операторы ветвления заставляют сервер выдавать одни фрагменты и пропускать другие, операторы циклов позволяют повторять выдачу похожих или однотипных фрагментов документа.

Две вещи восхищают в технологии ASP: первое — пользователь получает только HTML-документ, поэтому не требуется какого-то особого браузера (это может быть и Internet Explorer и Netscape Communicator); второе — пользователь никогда не увидит, каким алгоритмом этот документ сформирован, что в какой-то мере защищает ваши авторские права как программиста. К тому же формирование самого ASP-документа, согласитесь, достаточно прозрачно и может выполняться тем же инструментом, что при создании обычных HTML-страниц. С моей точки зрения, использование CGI, языков типа PHP или Perl хотя и позволяет достичь аналогичного эффекта, но делает весь процесс создания документа гораздо менее удобным и более ориентированным в сторону программирования. Кстати, приверженцы JavaScript совершенно свободно могут использовать его в ASP-документе вместо VBScript.

Таким образом, VBScript и JavaScript могут использоваться на стороне клиента (пользователю отсылаются строки HTML-документа вместе со строками скриптов), при этом пользователь может видеть исходный код программ. Эти же средства могут использоваться и на стороне сервера в рамках технологии ASP. Оба случая не идентичны друг другу и служат различным целям. Я рекомендую на стороне сервера использовать VBScript как более простой и удобный, а на стороне клиента — JavaScript, поскольку Netscape, к сожалению, пока не встраивает VBScript в свои браузеры. Использование 2-3 языков сегодня для разработчика считается приемлемым и оптимальным (для использования какого-то одного языка пока нет реальных возможностей). К тому же VBScript является средством автоматизации работы пользователя почти во всех продуктах фирмы Microsoft, последних продуктах фирмы Corel и некоторых других фирм, лицензирующих использование данного языка в своих продуктах как средство, испытанное временем и позволяющее получать потрясающие результаты. ASP можно использовать для придания документу необходимого «с точки зрения» сервера вида, а скрипты, встроенные в документ и выполняемые на стороне клиента браузером, — для интенсивной работы клиента с документом, когда уже сам документ «должен решать», как реагировать на конкретные действия клиента. Если хотите, скрипт, выполняемый сервером — это «мозги» родителя, создающего документ, а скрипт, выполняемый внутри документа браузером клиента, — это «мозги» самого ребенка, т.е. документа.

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

Какой сервер нужен для работы ASP?

Возможность работать с ASP-документами встроена Microsoft в Internet Information Server (IIS для Windows NT) и Personal Web Server (PWS для Windows-9x), начиная с версии 4.0. Существует также отдельное бесплатное приложение ASP, которое может быть дополнительно инсталлировано под IIS 2.0 или 3.0 для Windows NT. PWS удобно использовать для персональных разработок под Windows-95,98 (дистрибутив Windows-95 OSR-2 имеет встроенный PWS, для Windows-98 нужно искать дистрибутив, в котором имеется дополнительный каталог типа AddOn\PWS). Дистрибутив Windows NT имеет встоенный IIS 2.0 или 3.0 (начиная с Service Pack 3 и выше). Однако предоставить возможность клиентам пользоваться в сети прелестями вашей информационной службы можно только с помощью NT и IIS.

Если вы используете другой сервер, то Chili!ASP для вас будет полнофункциональным аналогом Microsoft’s ASP-сервера, позволяющего работать на серверах, отличных от IIS. К примеру, это Netscape Enterprise сервер, Netscape FastTrack сервер, ISAPI-совместимый сервер, IBM ICSS 4.2 сервер и, конечно же, сервер под UNIX-платформу. Chili!ASP полностью поддерживает ActiveX-компоненты, построенные на Java, C++, VB, Delphi и языках скрипта, таких как VBScript, JScript, и HTML. Данный сервер доступен на http://www.chilisoft.com/.

С чего лучше начать для овладения технологией ASP?

Конечно же нужно знать и уметь работать с HTML. Неплохо, если вы умеете хоть немного программировать в рамках любого распространенного языка типа Бейсик, Паскаль или Си. Предварительно ознакомьтесь с языком сценариев VBScript, хотя бы в объеме для начинающих. Если у вас есть пробелы в указанных средствах, рекомендую временно отложить изучение ASP и заняться их восполнением.

Итак, вы разбираетесь с HTML и ориентируетесь в базовых конструкциях VBScript. ASP — это одна из тех технологий, которые принято называть словами клиент-сервер. В этих рамках ASP использует два основных объекта: Request (запрос, с помощью которого клиент получает необходимую информацию) и Response (ответ, с помощью которого сервер отсылает клиенту затребованную информацию). Строка запроса формируется для клиента чаще всего в виде гиперссылки и имеет формат:

«Запрашиваемый_файл» — для нас это ASP-файл — должен иметь возможность проанализировать строку запроса и определить значения конкретных параметров. После этого сервер может сформировать должным образом ответный документ. Как видно, параметры отделяются от имени файла символом «?», а друг от друга — символом «&». С помощью таких ссылок-запросов документ может обращаться сам к себе, а с помощью различных значений параметров изменять свое содержимое порой самым кардинальным образом.

Изучение интереснее и эффективнее всегда проводить на примерах. Поэтому далее я покажу несколько несложных примеров, часть из которых приводится в документации с уже упоминавшимся бесплатным приложением ASP. При желании вы можете подробнее ознакомиться с данной документацией, правда для этого необходимо хотя бы сносно владеть английским языком, или использовать эту документацию в дальнейшем в качестве справочной. При создании собственных активных страничек на локальной машине не забывайте, что ASP-файлы нельзя просто просмотреть браузером в дисковом каталоге, как HTML-файлы. Необходимо обязательно установить либо IIS, либо PWS и поместить такую страничку в какой-либо Web-каталог и обращаться к ней с помощью URL:

Не очень удобно? Ну, так ведь это же клиент-серверная технология. Как же вы обойдетесь без сервера? Итак, приступим.

Пример 1: «Hello, World!»

Все примеры, включая и данный, оформлены в виде отдельных ASP-файлов. Специальный модуль, кстати тоже выполненный в виде отдельного ASP-файла, позволит вам просмотреть исходный текст представляемого примера. Изучайте все, начиная от ссылки (см. строку статуса вашего браузера), с помощью которой вызывается пример, и заканчивая комментариями к примеру. Если все понятно, тут же придумывайте что-то свое и пробуйте это реализовать. Материал лучше изучать небольшими порциями и обязательно закреплять практикой. Банальные вещи, но это вековой опыт наших предков. Так что не будем нарушать традиций.

Щелкнув по следующей ссылке, вы увидете результат работы первого примера. Просмотрите его исходный текст и изучите дальнейшие пояснения, следующие в данном документе ниже. Рекомендую еще сделать вот что. Прежде чем просматривать исходный текст ASP, щелкните правой кнопкой мыши в окне с результатом работы примера и выберите «View Source» или «HTML текст». У вас появится возможность сравнить тот текст, который посылается клиенту, с тем, который «читает» сервер в ASP-источнике. Это поможет вам лучше понять работу сервера при выпонении активного сценария.

Внешне до заголовка тела документа пример похож на обычный HTML-документ. А далее написан сценарий, который семь раз циклически печатает одну и ту же строку «Hello, World!». Поскольку тэги HTML — это тоже текст, команды скрипта можно также применять и для формирования тэгов. Здесь с помощью значения счетчика цикла изменяется размер шрифта текста от 1 до 7. Обратите внимание, что тэг позволяет в этом месте документа, посылаемого клиенту, вставлять значение указанной переменной. В конце исходного текста можно заметить строку, которая выглядит как комментарий:

На самом деле директива #include с параметром virtual заставляет Web-сервер вставить в данное место документа текст из указанного файла. Это удобно, когда некоторый фрагмент несколько раз встречается в различных документах. Конкретно данная вставка формирует ссылку для вызова модуля формирования исходного текста примера. Так что мы с ним еще встретимся в других примерах.

А как этот же документ создать с помощью JavaScript? Посмотрите следующий пример:

Первая строка задает язык скрипта по умолчанию для всего документа. На самом деле это не совсем JavaScript, а лишь его разновидность JScript в интерпретации Microsoft. Хотя и весьма близкая. Аналогично можно было писать и для VBScript: . Однако, если не писать, то это подразумевается по умолчанию. Ну, а в остальном все понятно.

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

Перед началом формирования заголовка документа я хочу разобраться с параметрами запроса. Имя параметра — color , обращение к нему — с помощью объекта Request. Значение параметра сохраняется в переменной Color . Не смотря на то, что имя параметра и переменной одинаковы, на самом деле — это разные вещи. К переменной можно обращаться прямо по имени, а к параметру — только с помощью объекта Request. Далее с помощью оператора выбора select в зависимости от значения параметра формируется либо массив цветов, либо простая переменная с соответствующим значением. В теле документа с помощью оператора if выбирается нужный фрагмент документа для работы. Формирование параметров шрифта уже должно быть понятно. Можно было поступить немного по-другому: общий оператор IF убрать вообще, вместо двух фрагментов оставить один, а параметр цвета формировать, например, так:

. color= >Hello, World.

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

Пример 2: Использование Request и Response

Объект Request имеет весьма небольшую коллекцию свойств. За полным списком обращайтесь к английской документации по ASP, здесь же мы рассмотрим только два, с моей точки зрения наиболее часто встречающиеся, — QueryString и Form.

QueryString содержит строку параметров, передаваемых клиентом. Данное свойство имеет дополнительный параметр Count, с помощью которого можно получить количество переданных параметров. Form содержит значения элементов формы, находящейся в теле документа и использующей метод POST для передачи информации.

Ну, если с Request более или менее все ясно, то как же используется объект Response ? Ведь, скажите вы, информация и так прекрасно посылается клиенту в виде HTML-строк и вроде никакого Response мы при этом не использовали. Дело в том, что существует два основных способа, с помощью которых сервер посылает информацию клиенту. Все, что находится вне тэгов скрипта, считается строками HTML-документа и отсылается клиенту без изменений. Внутри скрипта при необходимости выдать строку информации в браузер клиента используется объект Response с методом Write. Response имеет несколько свойств и несколько методов. Свойства используются редко, а из методов наиболее часто используются Write и Redirect.

Write посылает в окно браузера клиента указанную строку. Redirect перенаправляет клиента по указанному URL.

Рассмотрим работу описанных свойств и методов. Все это демонстрирует один и тот же ASP-документ (см. ссылки в строке статуса).

Не ожидали? Обращались к документу RequestResponse.asp, а получили старый пример «Hello, World!». Исходный текст нового примера вы увидите чуть позже. Просто я указал параметр «mode» («режим») со значением «redirect» («перенаправить»), и был вызван метод Redirect объекта Response. После этого чтение исходного документа прерывается (поэтому до тела документа дело просто не дошло) и загружается перенаправляемый документ (я указал hello.asp).

Здесь тоже пока доступа к исходному тексту не видно. Я намеренно указал только один параметр «name» и сервер с помощью объекта Response и его метода Write вывел в браузер полученное вами сообщение, не сформировав самого HTML-документа.

А вот теперь все в порядке. Рассмотрим сценарий нового примера. В переменной k запоминается количество параметров, передаваемых в строке запроса (элементы формы при этом не учитываются). Если k = 1 (как в предыдущих двух случаях), то при наличии параметра mode = «redirect» происходит перенаправление на документ hello.asp (первый случай) и далее больше ничего не выполняется. Если же параметр mode отсутствует (во втором случае посылается только один параметр name), в качестве его значения возвращается пустая строка «», оператор if пропускается и осуществляется переход на выдачу сообщения с помощью Response.Write. Если же параметров более одного (последний случай), то, пройдя все препоны, мы переходим на формирование HTML-документа. Если вы нажмете кнопку формы (это будет чуть дальше), то k будет равен 0 и вы увидете фрагмент, работающий с элементом формы. Иначе вы видите обработку параметров запроса. Количество параметров = 2 потому, что параметр name воспринимается как один, но представленный в виде массива (запомните этот прием для передачи массива параметров). Работа с ним демонстрируется с помощью сканирующей конструкции For Each и с помощью индекса (как с обычным массивом). В отличие от массивов нумерация параметров начинается не с 0, а с 1.

А теперь введите в следующее поле ваше имя и нажмите кнопку «Старт».

Поле, в которое вы вводили свое имя, имеет имя «YourName». Как видно из исходного текста, обращаться к значению этого поля можно как с помощью свойства Form объекта Request, так и точно таким же образом, как будто вы в строке запроса передали параметр с именем «YourName».

Пример 3: Работа с базой данных

Для выполнения сложной работы в рамках технологии ASP используются специальные OLE-объекты, называемые ActiveX-компоненты сервера (ActiveX Server Components). Данные объекты имеют достаточно сложную программную реализацию и служат для расширения базовых возможностей Web-сервера. Объекты удобны тем, что они работают на стороне сервера и не доставляют никаких лишних хлопот клиенту. Так, например, имеется объект Ad Rotator, позволяющий организовать в некоторой области окна браузера клиента ротацию некоторого набора картинок (своеобразный рекламный ролик или слайд-шоу), объект Browser Capabilities, позволяющий как в Explorer (в Проводнике) выводить на экран иерархические списки в виде раскрывающихся деревьев, и другие объекты (просмотрите раздел Tutorial документации). Однако, наиболе полезным, на мой взгляд, является набор объектов ADO (ActiveX Data Objects) — объектов доступа к данным. С объектами очень легко работать, если изучить их свойства (параметры) и методы (набор действий, которые могут выполнять эти объекты). В рамках краткого обзора я покажу только два основных объекта ADO: Connection (соединение) и Recordset (набор записей, получаемых из таблиц базы данных), а также несколько простых примеров работы с ними. Однако, уже даже этого будет достаточно, чтобы организовать приличную работу Web-сервера совместно с файловой базой данных или SQL-сервером.

Для демонстрации я подготовил небольшую базу данных в формате Microsoft Access, содержащую таблицу рейсов самолетов, вылетающих из аэропортов г. Киева, а также две таблицы с автобусными маршрутами, проходящими через Хмельницкую область (к сожалению, это данные 1997 года). Итак, для начала посмотрим, как получить таблицу рейсов самолетов из Киева.

Данный пример классическим образом можно использовать как заготовку для своих будущих разработок. Оказывается, все достаточно просто. Поскольку я не передаю никакого параметра, то по умолчанию устанавливается название таблицы «Самолеты из Киева». Так как название содержит пробелы, при формировании SQL-строки его необходимо заключить в квадратные скобки. Сначала создается объект Connection и ссылка на него устанавливается на переменную Conn. С помощью этого объекта Web-сервер будет осуществлять связь с базой данных.

Далее необходимо определить строку подсоединения. Обычно это имя источника данных (Alias), прописанного в службе ODBC вашего сервера. Под именем «Справочник» на закладке ODBC «System DSN» я прописал параметры базы данных, расположенной в файле «Справочник.mdb». Использование данной службы удобно тем, что все параметры подсоединения определяются именно там, что позволяет легче сопровождать работу всей информационной системы. Вы можете изменить через ODBC порядок доступа к базе, ее место расположения, даже перевести из одного формата в другой (например, из Access на SQL-сервер). Оставив имя источника тем же самым, вам ничего не придется менять в ASP-документе. Правда, вы можете покопаться в документации и найти все параметры строки подсоединения для указания вручную драйвера базы данных, путь к источнику базы данных, имя и пароль пользователя для входа и некоторые другие параметры, но этот вариант я считаю менее гибким и достаточно неудобным.

Далее созданный объект Conn открывает указанное соединение. Теперь вы можете обращаться к любым таблицам и объектам подсоединенной базы данных. Данные извлекаются с помощью SQL-запросов, которые выполняются методом Execute объекта соединения. Запросы могут выполнять действия без возвращения наборов записей (запросы на вставку, удаление и изменение записей), но могут и осуществлять выборки данных, в результате чего всегда возвращается некоторый набор отобранных записей. Создавая набор записей, объект соединения автоматически порождает объект Recordset, ссылку на который необходимо сохранить для дальнейшей работы. У нас для этого служит переменная RS. Объект Recordset имеет несколько свойств и методов для работы с набором записей. К полям записей можно обращаться по именам или по индексам. Свойство Fields содержит семество всех полей набора записей. В свою очередь, Fields обладает свойством Count, где хранится количество всех полей. Для перемещения по записям набора Recordset имеет весьма прозрачные методы MoveNext, MovePrevious, MoveFirst, MoveLast. Для контроля выхода за конец набора используется свойство EOF, за начало — BOF. Так же, как и при работе с файлами, по окончании работы со всеми объектами их надо закрыть, используя их методы Close.

Формирование таблицы начинается с заголовочной строки, куда помещаются названия полей. Обратите внимание, как динамично формируется строка. Цикл For пробегает по всем полям с помощью индекса (нумерация полей начинается, как в массивах, с нуля). Используя имя переменной типа Recordset, можно обратиться к значению поля: RS(i). Если использовать свойство Name поля, то можно получить имя этого поля. Количество столбцов, формируемых тэгами , будет ровно столько, сколько и полей в наборе записей.

Далее с помощью цикла While формируются строки со значениями полей каждой записи до тех пор, пока не будет достигнут конец набора записей. Будьте очень внимательны: после того, как обработана текущая строка набора записей, нужно обязательно дать команду на перемещение к следующей записи. Если вы это забудете, ваш скрипт зациклится, бесконечно выводя текущую (первую) строку набора. Внутри строки таблицы колонки со значениями полей формируются уже знакомым циклом For по полям текущей записи. Только на этот раз выводятся значения, а не имена полей.

По окончанию набора записей структура таблицы закрывается тэгом , объекты Recordset и Connection также закрываются. Пример интересен тем, что может использоваться для просмотра данных любой таблицы, достаточно в параметре клиентского запроса передать название таблицы и соответствующим образом сформировать строку SQL-запроса. Взгляните, как этот же документ выводит данные таблицы с автобусными маршрутами:

Неожиданно некоторые ячейки оказались непрорисованными. Происходит это в тех случаях, когда значение поля пусто (Null). Поэтому я рекомендую проверять значение поля и в случае, если оно пусто, посылать в ячейку непустой пробел » » (к сожалению, в исходном тексте этот код выглядит как обычный пробел). Я немного изменил файл предыдущего документа, добавив в него функцию, выдающую либо значение поля, либо непустой пробел. Кстати, обратите внимание, как можно комбинировать скрипты сразу на двух (. ) языках. Посмотрите что получилось:

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

Здесь демонстрируется доступ к значениям полей по их именам (если структура таблицы вам известна и не нужно выводить все поля, то это удобно потому, что помнить индекс конкретного поля весьма обременительно). Сначала с помощью параметра клиентского запроса определяем номер рейса. Затем с помощью SQL-запроса получаем набор из одной записи таблицы «Автобусы», которая соответствует указанному рейсу. Если запись присутствует, то в качестве заголовка таблицы выводятся данные в виде отдельных полей. Затем набор записей закрывается и с помощью этой же уже освободившейся переменной RS мы получаем доступ к записям другой таблицы «Автобусы (расписание)», которая по указанному номеру рейса выдает только принадлежащие ему строки маршрута.

Аналогичную структуру может иметь любой документ, который извлекает данные из какой-то конкретной таблицы. Какой из показанных структур документов отдать предпочтение — решать вам самим в каждом конкретном случае.

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

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

Технология активных серверных страниц 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.

Замена ASP

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

НОВОСТИ ФОРУМА
Рыцари теории эфира
01.10.2020 — 05:20: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ — Upbringing, Inlightening, Education ->
[center][Youtube]69vJGqDENq4[/Youtube][/center]
[center]14:36[/center]
Osievskii Global News
29 сент. Отправлено 05:20, 01.10.2020 г.’ target=_top>Просвещение от Вячеслава Осиевского — Карим_Хайдаров.
30.09.2020 — 12:51: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ — Upbringing, Inlightening, Education ->
[center][Ok]376309070[/Ok][/center]
[center]11:03[/center] Отправлено 12:51, 30.09.2020 г.’ target=_top>Просвещение от Дэйвида Дюка — Карим_Хайдаров.
30.09.2020 — 11:53: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ — Upbringing, Inlightening, Education ->
[center][Youtube]VVQv1EzDTtY[/Youtube][/center]
[center]10:43[/center]

интервью Раввина Борода https://cursorinfo.co.il/all-news/rav.
мой телеграмм https://t.me/peshekhonovandrei
мой твиттер https://twitter.com/Andrey54708595
мой инстаграм https://www.instagram.com/andreipeshekhonow/

[b]Мой комментарий:
Андрей спрашивает: Краснодарская синагога — это что, военный объект?
— Да, военный, потому что имеет разрешение от Росатома на манипуляции с радиоактивными веществами, а также иными веществами, опасными в отношении массового поражения. Именно это было выявлено группой краснодарцев во главе с Мариной Мелиховой.

[center][Youtube]CLegyQkMkyw[/Youtube][/center]
[center]10:22 [/center]

Доминико Риккарди: Россию ждёт страшное будущее (хотелки ЦРУ):
https://tainy.net/22686-predskazaniya-dominika-rikardi-o-budushhem-rossii-sdelannye-v-2000-godu.html

Завещание Алена Даллеса / Разработка ЦРУ (запрещено к ознакомлению Роскомнадзором = Жид-над-рус-надзором)
http://av-inf.blogspot.com/2013/12/dalles.html

[center][b]Сон разума народа России [/center]

[center][Youtube]CLegyQkMkyw[/Youtube][/center]
[center]10:22 [/center]

Доминико Риккарди: Россию ждёт страшное будущее (хотелки ЦРУ):
https://tainy.net/22686-predskazaniya-dominika-rikardi-o-budushhem-rossii-sdelannye-v-2000-godu.html

Завещание Алена Даллеса / Разработка ЦРУ (запрещено к ознакомлению Роскомнадзором = Жид-над-рус-надзором)
http://av-inf.blogspot.com/2013/12/dalles.html

[center][b]Сон разума народа России [/center]

LAV_ СИТспец_маг2014-15 / Модуль1_2013-14 / Web-приложения ASP_NET

Разработка Web-приложений ASP .NET с использованием Visual Studio .NET

Принципы работы и структура Web-приложений на основе ASP.NET

Основы работы в Visial Studio .NET

Основы Web-программирования с использованием ASP.NET

Принципы разработки пользовательского интерфейса интернет-приложения

Использование Master Page и навигация при построении интернет-приложений

Навигация по Web-приложению

Использование тем при оформлении Web-приложения

Использование кэширования в Web-приложениях

Использование баз данных в приложениях ASP.NET

Принципы работы и структура Web-приложений на основе ASP.NET

Рассматривается архитектура современных Web-приложений, взаимодействие клиентской и серверной частей таких приложений, принципы их организации в среде ASP.NET

Цель лекции: познакомиться с архитектурой и особенностями организации Web-приложений, особенностями архитектуры ASP.NET и .NET Framework, принципами взаимодействия клиента и сервера при выполнении Web-приложения на основе ASP.NET.

Web-приложения представляют собой особый тип программ, построенных по архитектуре «клиент-сервер». Особенность их заключается в том, что само Web-приложение находится и выполняется на сервере — клиент при этом получает только результаты работы. Работа приложения основывается на получении запросов от пользователя (клиента), их обработке и выдачи результата. Передача запросов и результатов их обработки происходит через Интернет ( рис.1.1).

Рис. 1.1. Архитектура Web-приложения

Отображением результатов запросов, а также приемом данных от клиента и их передачей на сервер обычно занимается специальное приложение — браузер (Internet Expolrer, Mozilla, Opera и т. д.). Как известно, одной из функций браузера является отображение данных, полученных из Интернета, в виде страницы, описанной на языке HTML, следовательно, результат, передаваемый сервером клиенту, должен быть представлен на этом языке.

На стороне сервера Web-приложение выполняется специальным программным обеспечением (Web-сервером), который и принимает запросы клиентов, обрабатывает их, формирует ответ в виде страницы, описанной на языке HTML, и передает его клиенту. Одним из таких Web-серверов является Internet Information Services (IIS) компании Microsoft. Это единственный Web-сервер, который способен выполнять Web-приложения, созданные с использованием технологии ASP.NET.

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

За счет наличия исполняемой части, Web-приложения способны выполнять практически те же операции, что и обычные Windows-приложения, с тем лишь ограничением, что код исполняется на сервере, в качестве интерфейса системы выступает браузер, а в качестве среды, посредством которой происходит обмен данными, — Интернет. К наиболее типичным операциям, выполняемым Web-приложениями, относятся:

прием данных от пользователя и сохранение их на сервере;

выполнение различных действий по запросу пользователя: извлечение данных из базы данных (БД), добавление, удаление, изменение данных в БД, проведение сложных вычислений;

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

отображение постоянно изменяющейся оперативной информации и т. д.

Краткое описание архитектуры ASP.NET и .NET Framework

ASP.NET — это платформа для создания Web-приложений и Web-сервисов, работающих под управлением IIS. Сегодня существуют другие технологии, позволяющие создавать Web-приложения. К ним относятся прежде всего, очень популярные сегодня языки PHP и PERL, более старая и менее популярная технология CGI и т. д. Однако ASP.NET отличается от них высокой степенью интеграции с серверными продуктами, а также с инструментами Microsoft для разработки доступа к данным и обеспечения безопасности. Кроме того, ASP.NET позволяет разрабатывать Web- и Windows-приложения, используя очень похожие технологические цепочки, одинаковые языки программирования, технологии доступа к данным и т. д. Более того, базовые языки программирования, с помощью которых сегодня возможна разработка Web-приложений, являются полностью объектно-ориентированными, что делает разработку исполнимой части, а также ее модификацию, обслуживание, отладку и повторное использование гораздо более простым занятием, чем в других технологиях. Существует достаточно большой перечень сильных сторон использования ASP.NET для создания сложных Web-приложений. Целью данного курса не является описание всех сильных и слабых сторон этой платформы.

Заметим лишь, что ASP.NET функционирует исключительно на серверах Windows, так как требует наличия IIS. Для создания Web-приложений, не требующих IIS, а использующих, например, Web-сервер Apache и работающих на серверах под управлением операционных систем, отличных от Windows, применяются другие технологии.

Важным моментом в понимании архитектуры ASP.NET является тот факт, что она является частью инфраструктуры .NET Framework. Более подробно об архитектуре и принципах работы .NET Framework можно узнать в [2]. Так как эта тема является слишком объемной и выходит за рамки данного курса, ограничимся лишь кратким описанием инфраструктуры .NET Framework.

Архитектура .NET Framework

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

набор языков, куда входят С# и Visual Basic .NET; набор инструментальных средств разработки, в том числе Visual Studio .NET; обширная библиотека классов для построения Web-служб и приложений, работающих в Windows и в Интернете; а также среда выполнения программ CLR (Common Language Runtime — общеязыковая среда выполнения), в которой выполняются объекты, построенные на этой платформе;

набор серверов .NET Enterprise Servers, ранее известных под именами SQL Server 2000, Exchange 2000, BizTalk 2000 и др., которые предоставляют специализированные функциональные возможности для обращения к реляционным базам данных, использования электронной почты, оказания коммерческих услуг «бизнес-бизнес» (В2В) и т. д.;

богатый выбор коммерческих Web-служб, называемых .Net My Services. За умеренную плату разработчики могут пользоваться этими службами при построении приложений, требующих идентификации личности пользователя и других данных;

новые некомпьютерные устройства, поддерживающие средства .NET, — от сотовых телефонов до игровых приставок.

Microsoft .NET поддерживает не только языковую независимость, но и языковую интеграцию. Это означает, что разработчик может наследовать от классов, обрабатывать исключения и использовать преимущества полиморфизма при одновременной работе с несколькими языками. Платформа .NET Framework предоставляет такую возможность с помощью спецификации CTS (Common Type System — общая система типов), которая полностью описывает все типы данных, поддерживаемые средой выполнения, определяет, как одни типы данных могут взаимодействовать с другими и как они будут представлены в формате метаданных .NET. Например, в .NET любая сущность является объектом какого-нибудь класса, производного от корневого класса System.Object. Спецификация CTS поддерживает такие общие понятия, как классы, делегаты (с поддержкой обратных вызовов), ссылочные и размерные типы.

Важно понимать, что не во всех языках программирования .NET обязательно должны поддерживаться все типы данных, которые определены в CTS. Спецификация CLS (Common Language Specification — общая языковая спецификация) устанавливает основные правила, определяющие законы, которым должны следовать все языки: ключевые слова, типы, примитивные типы, перегрузки методов и т. п. Спецификация CLS определяет минимальные требования, предъявляемые к языку платформы .NET. Компиляторы, удовлетворяющие этой спецификации, создают объекты, способные взаимодействовать друг с другом. Любой язык, соответствующий требованиям CLS, может использовать все возможности библиотеки FCL (Framework Class Library — библиотека классов платформы). CLS позволяет и разработчикам, и поставщикам, и производителям программного обеспечения не выходить за пределы общего набора правил для языков, компиляторов и типов данных.

Платформа .NET Framework является надстройкой над операционной системой, в качестве которой может выступать любая версия Windows 1) . На сегодняшний день платформа .NET Framework включает в себя:

четыре официальных языка: С#, VB.NET, Managed C++ (управляемый C++) и JScript .NET;

объектно-ориентированную среду CLR (Common Language Runtime), совместно используемую этими языками для создания приложений под Windows и для Internet;

ряд связанных между собой библиотек классов под общим именем FCL (Framework Class Library).

Отношения архитектурных компонентов платформы .NET Framework с концептуальной точки зрения представлены на рис.1.2.

Рис. 1.2. Архитектура .NET Framework

Самым важным компонентом платформы .NET Framework является CLR (Common Language Runtime), предоставляющая среду, в которой выполняются программы. Главная ее роль заключается в том, чтобы обнаруживать и загружать типы .NET и производить управление ими в соответствии с полученными командами. CLR включает в себя виртуальную машину, во многих отношениях аналогичную виртуальной машине Java. На верхнем уровне среда активизирует объекты, производит проверку безопасности, размещает объекты в памяти, выполняет их, а также запускает сборщик мусора.

Под сборкой мусора понимается освобождение памяти, занятой объектами, которые стали бесполезными и не используются в дальнейшей работе приложения. В ряде языков программирования (например, C/C++) память освобождает сам программист, в явной форме отдавая команды как на создание, так и на удаление объекта. В этом есть своя логика — «я тебя породил, я тебя и убью». Однако в CLR задача сборки мусора (и другие вопросы, связанные с использованием памяти) решается в нужное время и в нужном месте исполнительной средой, ответственной за выполнение вычислений.

На на рис.1.2. над уровнем CLR находится набор базовых классов платформы, над ним расположены слой классов данных и XML, а также слой классов для создания Web-служб (Web Services), Web- и Windows-приложений (Web Forms и Windows Forms). Собранные воедино, эти классы известны под общим именем FCL (Framework Class Library). Это одна из самых больших библиотек классов в истории программирования. Она открывает доступ к системным функциям, включая и те, что прежде были доступны только через API Windows, а также к прикладным функциям для Web-разработки (ASP.NET), доступа к данным (ADO.NET), обеспечения безопасности и удаленного управления. Имея в своем составе более 4000 классов, библиотека FCL способствует быстрой разработке настольных, клиент-серверных и других приложений и Web-служб.

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

Над этим уровнем находится уровень классов, которые расширяют базовые классы с целью обеспечения управления данными и XML. Классы данных позволяют реализовать управление информацией, хранящейся в серверных базах данных. В число этих классов входят классы SQL (Structured Query Language, язык структурированных запросов), дающие программисту возможность обращаться к долговременным хранилищам данных через стандартный интерфейс SQL. Кроме того, набор классов, называемый ADO.NET, позволяет оперировать постоянными данными. Платформа .NET Framework поддерживает также целый ряд классов, позволяющих манипулировать XML-данными и выполнять поиск и преобразования XML.

Базовые классы, классы данных и XML расширяются классами, предназначенными для построения приложений на основе трех различных технологий: Web Services (Web-службы), Web Forms (Web-формы) и Windows Forms (Windows-формы). Web-службы включают в себя ряд классов, поддерживающих разработку облегченных распределяемых компонентов, которые могут работать даже с брандмауэрами и программами трансляции сетевых адресов (NAT). Поскольку Web-службы применяют в качестве базовых протоколов связи стандартные протоколы HTTP и SOAP, эти компоненты поддерживают в киберпространстве подход «Plug & Play».

Инструментальные средства Web Forms и Windows Forms позволяют применять технику RAD (Rapid Application Development — быстрая разработка приложений) для построения Web- и Windows-приложений. Эта техника сводится к перетаскиванию элементов управления с панели инструментов на форму, двойному щелчку по элементу и написанию кода, который обрабатывает события, связанные с этим элементом.

Компиляция и язык MSIL

.NET-приложения исполняются иначе, чем традиционные Windows-приложения. Такие программы компилируются фактически в два этапа. На первом этапе исходный код компилируется во время построения проекта и вместо исполняемого файла с машинными кодами получается сборка 2) (assembly), содержащая команды промежуточного языка MSIL (Microsoft Intermediate Languageпромежуточный язык Microsoft). Код IL сохраняется в файле на диске. При этом файлы MSIL (сокращенно IL), генерируемые компилятором, например, С#, идентичны IL-файлам, генерируемым компиляторами с других языков .NET. В этом смысле платформа остается в неведении относительно языка. Самой важной характеристикой среды CLR является то, что она общая; одна среда выполняет как программы, написанные на С#, так и программы на языке VB.NET.

Второй этап компиляции наступает непосредственно перед фактическим выполнением страницы. На этом этапе CLR транслирует промежуточный код IL в низкоуровневый собственный машинный код, выполняемый процессором. Процесс происходит следующим образом: при выполнении .NET-программы системы CLR активизирует JIT-компилятор, который затем превращает MSIL во внутренний код процессора. Этот этап известен как оперативная компиляция «точно к нужному моменту» (Just-In-Time) или JIT-компиляция (JIT’ing), и он проходит одинаково для всех приложений .NET (включая, например, приложения Windows). При исполнении программы CLR берет на себя управление памятью, контроль типов и решает за приложение ряд других задач. На рис.1.3. показан этот двухэтапный процесс компиляции.

Рис. 1.3. Схема компиляции .NET-приложения

Стандартный JIT-компилятор работает по запросу. Когда вызывается тот или иной метод, JIT-компилятор анализирует IL-код и производит высокоэффективный машинный код, выполняемый очень быстро. JIT-компилятор достаточно интеллектуален, чтобы распознать, был ли код уже скомпилирован, поэтому во время выполнения программы компиляция происходит лишь при необходимости. По ходу своего выполнения .NET-программа работает все быстрее и быстрее, так как повторно используется уже скомпилированный код.

Спецификация CLS подразумевает, что все языки платформы .NET генерируют очень похожий IL-код. Кроме того, при компилировании программы в дополнение к MSIL формируется еще один компонент — метаданные. Они описывают данные, используемые программой, и это позволяет коду взаимодействовать с другим кодом. В результате объекты, созданные на одном языке, доступны и могут наследоваться на другом. То есть можно создать базовый класс на языке VB.NET, а производный от него класс — на языке С#.

В целом при написании приложения создается так называемый управляемый код (managed code), который выполняется под контролем среды исполнения CLR-приложения, не зависящей от языка. Поскольку приложение запускается под контролем CLR, управляемый код должен соответствовать определенным требованиям (т. е. компилятор должен создать MSIL-файл, предназначенный для CLR, а также использовать библиотеки .Net Framework 3) ), при выполнении которых он получает множество преимуществ, включая современное управление памятью, способность совмещать языки, высокий уровень безопасности передачи данных, поддержку контроля версии и понятный способ взаимодействия компонентов программного обеспечения 4) .

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

Конечно, компиляция не будет столь полезна, если ее выполнение будет необходимо каждый раз при запросе пользователем Web-страницы. К счастью, приложения ASP.NET не нужно компилировать всякий раз при запросе Web-страницы или Web-службы. Вместо этого код IL создается один раз и повторно генерируется только при изменении исходного кода. Подобным образом файлы собственного машинного кода кэшируются в системном каталоге с путем вроде С:\[WinDir]\Microsoft.NET\ Framework\[Version]\Temporary ASP.NET Files, где WinDir является каталогом Windows, a Version — номером установленной в данный момент версии .NET.

Каждое Web-приложение, разрабатываемое на основе ASP.NET состоит из информационной части, программного кода и сведений о конфигурации.

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

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

Сведения о конфигурации представляют собой файлы, содержащие параметры, определяющие способ исполнения приложения на сервере, параметры безопасности, реакцию приложения на возникающие ошибки и т. д.

Основным элементом Web-приложения является Web-форма (или Web-страница), которая, с одной стороны, похожа на Windows-форму, т. к. позволяет размещать внутри себя различные элементы управления, способные отображать данные и реагировать на действия пользователя, а с другой — представляет собой HTML-страницу, т. к. содержит все ее атрибуты. Описания элементов управления, упомянутых ранее, представляются в коде HTML-страницы в виде специальных тегов.


На рис.1.4. представлен пример простейшей страницы Web-приложения, содержащего всего лишь один элемент — кнопку. Как видно из рисунка, основой страницы является тело стандартного HTML-документа, внутри которого находится элемент form, а также кнопка button. Кроме того, в начале документа здесь присутствуют некоторые дополнительные элементы, которые будут рассмотрены позднее.

Рис. 1.4. Пример простейшей страницы Web-приложения

При запуске приложения данная страница отображается в окне браузера и выглядит следующим образом (рис.1.5.).

Рис. 1.5. Отображение страницы Web-приложения в окне браузера

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

Рис. 1.6. Файл, содержащий программный код Web-страницы

На самом деле при разработке Web-приложений на основе ASP.NET возможны два варианта организации Web-форм.

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

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

В примере, рассмотренном ранее, Web-страница разделена на две части, при этом форма и программный код хранятся в разных файлах.

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

Рис. 1.7. Пример Web-формы, содержащей описание формы и программный код в одном файле

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

Рис. 1.8. Типовой сценарий взаимодействия элементов Web-приложения с клиентом

Как видно из рис.1.8, при обращении клиента к Web-приложению последнее запускается на сервере IIS. Запущенное приложение формирует отклик. Для этого на сервере создается экземпляр запрошенной Web-формы, она генерирует HTML-текст отклика, который и передается браузеру клиента. Сразу после этого экземпляр Web-формы уничтожается. Пользователь, получив HTML-страницу, сгенерированную приложением, имеет возможность заполнять различные поля формы (тестовые поля, переключатели и т. п.). После заполнения всех необходимых полей формы пользователь инициирует отправку данных, введенных им в страницу, обратно на сервер. Это происходит за счет использования технологии обратной отсылки, которая вызывается при выполнении определенных действий (например, нажатия на кнопку). Получив данные от пользователя, сервер создает новый экземпляр Web-формы, заполняет его полученными данными и обрабатывает все необходимые события. По окончании обработки сервер формирует HTML-код ответа и отправляет его клиенту, а затем уничтожает экземпляр Web-формы. Более подробно описанный сценарий изображен на рис. 1.9 и 1.10

Рис. 1.9. Подробный сценарий взаимодействия элементов Web-приложения с клиентом при первом запросе

Рис. 1.10. Подробный сценарий взаимодействия элементов Web-приложения с клиентом при запросе обратной отсылки

В момент окончания работы с Web-приложением пользователь либо закрывает браузер, либо переходит на другую интернет-страницу. В этот момент завершается сеанс работы пользователя с данным приложением, однако само приложение может быть завершено сервером не сразу после окончания последнего сеанса работы пользователя. Это связано с управлением распределением памяти платформой .NET Framework, которая основана на периодической проверке ссылок объектов. Если в результате такой проверки обнаружится, что объект больше не используется, сервер уничтожает его, освобождая таким образом занимаемую им память. Поэтому нельзя точно сказать, когда именно наступит событие Application_End для данного Web-приложения.

Такой принцип организации выполнения Web-приложений хорошо подходит для масштабируемых приложений с интенсивным сетевым обменом. Однако у него есть и недостатки. В частности, оказывается невозможным сохранять данные, принадлежащие форме, даже в течение работы пользователя с приложением. Т. е. если мы захотим создать некую переменную, хранящую, например идентификатор заказа, с которым мы в данный момент работаем, сделать это будет невозможно, т. к. форма после отправки клиенту сразу же уничтожается. Чтобы обойти этот недостаток, ASP.NET использует специальный механизм для сохранения данных, введенных в элементы управления Web-формы. Согласно этому принципу, в рамках каждого запроса на сервер отправляются все данные, которые были введены в элементы управления. При этом, как уже упоминалось выше, на сервере возникает событие Page_Init, целью которого является создание Web-формы и ее инициализация. В процессе инициализации в элементы управления созданной формы записываются переданные от клиента данные. Теперь эти данные становятся доступны приложению посредством обработки события Page_Load, возникающего при каждом обращении к странице.

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

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

После этого инициируется событие Page_Load. Большинство Web-страниц используют это событие для выполнения инициализации, например, заполнения полей данными, установки начальных значений для элементов управления и т. д. Кроме того, в процедуре обработки данного события возможно определение того, была ли загружена страница впервые или обращение к ней осуществляется повторно в рамках технологии обратной отсылки, произошедшей в результате нажатия пользователем кнопки либо другого элемента управления, размещенного на странице. В английской терминологии обратная отсылка данных на сервер называется post back. Для определения текущего состояния страницы необходимо проверить свойство Page.IsPostBack, которое будет иметь значение false при первом запуске страницы. Определение того, производится ли первое обращение к данной странице либо повторное, важно, так как позволяет производить инициализацию только в том случае, когда страница запрашивается впервые. Так, например, при обратной отсылке данных на сервер не только нет необходимости производить инициализацию, устанавливая начальные значения элементов управления, но это даже может быть ошибкой, так как эти элементы управления должны получить значения, переданные им от пользователя. В дальнейшем, в случае, если для страницы была произведена обратная отсылка, вызываются события элементов управления, размещенных на странице. Эти события запоминаются в тот момент, когда пользователь производил действия с элементами управления в окне браузера, а при передаче данных на сервер исполняются по порядку.

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

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

Пусть у нас существует страница с кнопкой (Button) «Отправить» и текстовым полем (TextBox) без автоматической обратной отсылки. При изменении текста в текстовом поле и щелчке на кнопке «Отправить» инициируется обратная отправка данных страницы на сервер (этого не произошло при изменении текста в текстовом поле, так как соответствующая опция этого элемента управления AutoPostBack установлена в false). В момент обратной отправки страницы на сервер ASP.NET запускает следующие события:

В результате обработки всех инициированных событий генерируется HTML-код страницы, который и передается клиенту, после чего выполняется Очистка, в рамках которой инициируется событие Page_Unload. Оно предназначено для освобождения ресурсов, занятых данной страницей. Событие Page.PreRender инициируется после того, как сервер обработал все события страницы, но генерация ее HTML-кода еще не произошла. Обычно это событие используется ASP.NET для привязки элементов управления к источникам данных непосредственно перед созданием HTML-кода и отправкой его клиенту.

Описанная последовательность событий позволяет создать описание жизненного цикла Web-страницы, изображенного на рис 1.11.

Рис. 1.11. Жизненный цикл страницы ASP.NET

Вернемся, однако, к проблеме сохранения данных страницы в промежутке между обращениями к ней. Для реализации этого механизма в ASP.NET используются состояния отображения (view state). Состояние отображения Web-формы доступно только внутри этой Web-формы. Если необходимо сделать данные, введенные в Web-форму, доступными другим Web-формам одного и того же приложения, эти данные необходимо сохранить в объектах с более глобальной областью видимости, которые называют переменными состояния. Объектов переменных состояний два: Application и Session. Переменные состояния Application доступны всем пользователям приложения и могут рассматриваться как глобальные переменные, обращение к которым возможно из любых сеансов. Переменные состояния Session доступны только в рамках одного сеанса, и поэтому они оказываются доступными только одному пользователю. В переменных состояния можно хранить данные любого типа. В силу того, что переменные состояния фактически являются глобальными переменными, для работы с ними желательно выработать стратегию их использования в приложении.

Более подробно работа с состояниями отображения и переменными состояния будет рассмотрена в разделе «Класс Page» в лекции 2.

Web-приложения представляют собой особый тип программ, основанных на архитектуре «клиент-сервер». Web-приложение располагается и исполняется на сервере, получая от клиента исходные данные для работы, а также передавая ему результаты работы в виде HTML-кода, отображаемого в браузере.

Существует несколько технологий разработки информационных систем, ориентированных на Интернет. Одной из наиболее мощных технологий является ASP.NET. Web-приложения, разработанные на основе ASP.NET работают исключительно в среде IIS платформы Windows. ASP.NET является частью инфраструктуры .NET Framework. Данная архитектура является основой для построения современных приложений, ориентированных на работу в среде Windows, и может использовать любой из совместимых языков программирования для написания программного кода. Особенностью .NET Framework является то, что различные модули одной и той же программной системы могут быть написаны на различных языках программирования. Одним из важнейших элементов данной архитектуры является наличие сборщика мусора, осуществляющего очистку неиспользуемых областей памяти и избавляющего программиста от проблемы «утечки памяти».

Каждое Web-приложение ASP.NET состоит из 3 частей: информационной, программного кода и сведений о конфигурации. Информационная часть включает в себя описание страницы в формате HTML и содержит как элементы языка гипертекстовой разметки документа, так и элементы ASP.NET. Программный код реализует бизнес-логику, оформленную в виде процедур обработки данных. Этот код исполняется сервером и взаимодействует с динамическими элементами информационной части, позволяя динамически формировать содержимое страницы, передаваемой клиенту. Сведения о конфигурации содержат параметры, определяющие способ исполнения приложения на сервере, параметры безопасности, реакцию на возникающие ошибки и др.

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

1) Благодаря архитектуре среды CLR в качестве операционной системы может выступать любая версия Unix и вообще любая ОС. 2) Сборка (assembly) – это коллекция файлов, которая предстает перед программистом в виде единой библиотеки динамической компоновки (DLL) или исполняемого файла (EXE). В технологии .NET сборка является базовой единицей для повторного использования, контроля версий, защиты и развертывания. Среда CLR представляет программисту ряд классов, позволяющих манипулировать сборками. 3) Библиотека классов .NET открывает доступ ко всем возможностям CLR. Классы, составляющие эту библиотеку, организованы при помощи пространств имен. Каждое пространство имен заключает в себе классы, выполняющие близкие функции. 4) Альтернативой управляемому коду является неуправляемый код, который не выполняется CLR. Однако до появления .NET Framework все Windows-программы использовали именно неуправляемый код.

ASP-технологии в логистике: миф или реальность?

По мере совершенствования IT-технологий и рыночных отношений привычным станет и применение ASP, поскольку это отвечает требованиям современной, ориентированной на активное использование информационных систем в управлении экономики.

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

Технология, о которой заговорили в специализированных изданиях три-четыре года назад и на которую возлагали надежды многие серьезные компании, вновь начинает вызывать информационно-практический интерес у высшего персонала отделов логистики организаций, ориентированных в первую очередь на сотрудничество с западными фирмами в рамках формирования глобальных цепей поставок товаров, берущих курс на активные формы ведения бизнеса. И интерес этот, несомненно, связан с развитием в логистике направления SCM (Supply Chain Management) — управления цепями поставок. Именно в управлении поставками, особенно в интернет-исполнении, могут проявиться все достоинства ASP-технологии (Application Service Provision) — аренды приложений. Об этом свидетельствует опыт США, Великобритании и ряда других ведущих в экономическом и технологическом отношении стран. Переход на ASP предполагает интеграцию информационных ресурсов всех участников цепи поставок на единой технологической платформе — платформе провайдера ASP-услуг, что сулит серьезные конкурентные преимущества и обеспечивает возможность выхода на новые, передовые формы организации бизнес-процессов на основе доверительных отношений между всеми участниками сети поставок, включая ASP-провайдеров и конечных потребителей. Эта технология, реализуемая на основе классического аутсорсинга, как нельзя лучше отвечает современным рыночным концепциям SCM и CRM (Customer Relationship Management) — управления взаимоотношениями с клиентами.

Факторы спроса

Аутсорсинг как явление зародился в сфере информационных технологий в 70-80-х годах XX века. Технология ASP, являясь разновидностью IT-аутсорсинга в области информационно-управляющих систем автоматизации бизнес-процессов компании, начинает свою историю в конце 90-х годов в США. Идея использовать клиент-серверные решения в работе со сложными информационными системами ERP-класса в удаленном режиме через WEB-сервер поначалу казалась весьма перспективной. К тому же рядом ведущих производителей ERP-систем в то время уже были разработаны интернет-версии для локальных вычислительных сетей компаний.

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

С окончательным формированием рынка потребителя и утверждением парадигмы всеобщего сотрудничества в части создания ценностных цепочек, развитием аутсорсинга и систем управления взаимоотношениями с клиентами (потребителями) интерес к ASP вновь стал расти. Сегодня IT-аутсорсинг (и ASP в том числе) составляет неотъемлемую часть систем управления бизнесом на Западе (табл. 1,2).

таблица 1. Наиболее распространенные в США и в Великобритании ASP-решения для управления бизнесом компании

Аренда и аутсорсинг — в чем различия?

С точки зрения классического аутсорсинга, любая не основная в формировании ценности компании функция должна быть передана внешнему, специализирующемуся в этой области исполнителю (провайдеру). В современных компаниях информационные технологии органично вплетены в бизнес, особенно если используются ERP-системы. В этом случае на IT базируется все управление компанией и трудно выделить «основные» и «второстепенные» (передаваемые провайдерам) бизнес-процессы. При отсутствии должной доверительности в отношениях с IT-провайдером риск потери управляемости из-за проблем в информационном обеспечении может быть очень высок. Это сдерживает распространение ASP. Более того, до 35% соглашений о передаче IT-функций компаний провайдерам не возобновляются или прекращаются досрочно. Иными словами, рыночная привлекательность ASP тесно связана с доверительностью и коммерческой заинтересованностью провайдера в успехе бизнеса клиента. Именно в этом кроется отличие аутсорсинга (outsourcing) от обычной аренды (rent, lease) информационных ресурсов, — первый предполагает активное сотрудничество между провайдером и клиентом в создании дополнительной ценности1. А классическая аренда или сервис — это просто продажа услуг. ASP может быть реализовано в форме аутсорсинга или обычной аренды, при которой ценность (value) у покупателя этих услуг может и не увеличиваться. Это в явной форме проявляется на рынке продавца (где последний, в виду своей доминирующей позиции, не заинтересован в создании этой дополнительной ценности у покупателя), что весьма характерно для ASP-проектов в России.

таблица 2. Некоторые примеры практической реализации сложных ASP-решений на основе управленческого ПО

Услуги и решения

Аутсорсинг начинался с передачи функций создания, внедрения и сопровождения заказных информационных систем разработчику. Раньше это обеспечивало работой многочисленные фирмы, специализировавшиеся на разработке ПО для управления бизнесом. Затем, в пору расцвета ERP-систем и увлечения так называемой коробочной автоматизацией, интерес к заказным системам и IT-аутсорсингу резко снизился. Однако недавно он возобновился, но в новой (интегрированной) форме, получившей название Task Sourcing (TS). Примерами реализации TS на рынке РФ, в частности, можно считать услуги:

  • по заказному планированию оптимальных маршрутов доставки товаров (www.elfor.ru);
  • по решению задач оптимизации загрузки транспортных единиц (www.packer3d.ru), оказываемые интерактивно через интернет.

Среди множества ASP-решений можно выделить:

  • ПО, реализующее функции электронных платежей в системах электронной коммерции;
  • ПО, реализующее функции интернет-магазина;
  • системы дистанционного обучения для организации виртуальных учебных классов;
  • почтовые и офисные системы;
  • системы защиты данных (включая антивирусные);
  • информационно-правовые системы;
  • ПО, обеспечивающие функционирование Call Centers;
  • системы автоматизации бизнес-процессов компании (системы ERP, CRM и SCM — классов).
  • Способы предоставления ASP-услуг

Существует два варианта реализации ASP, каждый из которых характеризуется особой организацией использования приложения:

  • Классический (отношение «один — многим») — провайдер предоставляет одну программу в распоряжение множеству клиентов (рисунок 1). Особенностью варианта является, с одной стороны, невысокая стоимость, а с другой — использование на 85-90% типизированного решения, требующего от компании применения в управлении стандартизированных технологий.
  • Персонифицированный (отношение «один — одному») — приложение полностью предоставляется одному клиенту, чем обеспечивается возможность гибкой настройки под существующие бизнес-процессы. Однако такое решение существенно дороже первого.

рис1. классическая схема реализации ASP (БД — база данных, СУБД — система управления базами данных)

Преимущества ASP-решений

К сожалению, сегодня в РФ спрос на ASP-решения невелик. Что касается аутсорсинга бизнес-приложений, то этот опыт практически ограничивается проектом Data Fort компании IBS, в рамках которого предлагались бизнес-решения Microsoft Navision-Axapta и система «Босс-Кадровик». Тем не менее перспективы применения ASP в управлении цепями поставок очевидны. Об этом свидетельствуют обнадеживающие сведения с западного рынка ASP-услуг. В частности, появление программных продуктов для управления, ориентированных на малый и средний бизнес, способствует активному формированию новой, ASP-перспективной целевой группы. В удачных ASP-проектах обеспечивается существенная экономия IT-ресурсов (более чем на 20%) за счет снижения совокупной стоимости владения этими ресурсами (ТСО — Total Cost of Ownership). Выявляются и сокращаются прежде не учитываемые затраты.

Возрастающая конкуренция на рынках заставляет компании искать новые средства и технологии достижения конкурентных преимуществ. А именно на это ориентирован аутсорсинг в ASP-варианте. Основные преимущества ASP-решений состоят в следующем:

  • оперативный доступ к новейшим IT-решениям и лучшим практикам управления бизнес-процессами, реализованным в информационных системах (ИС) ведущих производителей. И благодаря этому быстрое продвижение на рынок товаров и услуг компании;
  • затраты на управленческое ПО фиксированы на уровне арендной платы. Отсутствуют непредвиденные затраты на сопровождение и эксплуатацию ИС, что повышает точность прогнозирования расходов и способствует финансовой устойчивости компании. Отсутствуют затраты на сопровождение и эксплуатацию ИС;
  • высвобождение внутренних IT-ресурсов компании (прежде всего персонала) за счет передачи функций автоматизации управления ASP-провайдеру. Это тем более актуально для компаний, испытывающих нехватку квалифицированных IT-специалистов;
  • низкие стартовые затраты на автоматизацию управления и низкий финансовый порог внедрения системы современного ERP-управления;
  • существенное снижение риска, связанного с выбором и внедрением ИС. По сути, риск определяется суммой месячной арендной платы, поскольку имеется возможность отказа от услуг провайдера в любой момент. Риски, связанные с реализацией IT-проекта, делятся между клиентом и провайдером;
  • независимый доступ к ИС посредством сети интернет удаленного клиента с любого терминала (включая мобильный вход);
  • возможность снижения налогооблагаемой базы за счет отнесения расходов, связанных с ASP, на себестоимость товаров (услуг);
  • обеспечение более высокой, чем при внутреннем развертывании, надежности функционирования ИС. Провайдер располагает более мощным и совершенным оборудованием, а также более квалифицированным персоналом, чем клиенты;
  • возможность реализации распределенного офиса для координации работы всех участников цепи поставок через Call Center или Центр управления данными предприятия (EDM — Enterprise Data Management) (рисунок 2).

рис2. схема совместного использования ASP-решения в цепях поставок

Еще немного о выгодах

Классический вариант ASP, в основе которого лежит типизированное приложение, существенно снижает ТСО, ускоряет окупаемость IT-проекта (ROI — Return on Investment) за счет оптимизации бизнес-процессов и сокращения персонала, повышает качество контроля над операционными расходами, эффективность управления изменениями, связанными с реинжинирингом. Последнее становится все более актуальным из-за перманентного сокращения жизненного цикла товаров и услуг на современных динамично развивающихся рынках, а также из-за частой смены руководителей высшего звена. В этих условиях ASP-технология становится выгодной для среднего и малого бизнеса, поскольку требует меньших ресурсов для модернизации системы управления. Особенно целесообразно использование технологии ASP на стадиях активного развития бизнеса, при реализации пилотных бизнес-проектов и проектов с коротким жизненным циклом, а также при необходимости внедрить единую модель управления в сложноструктурированной компании (группе компаний) с филиалами и отделениями (рисунок 2).

Риски, проблемы и факторы успеха

Аутсорсинг (и, в частности, IT-аутсорсинг) редко применяется в виде нововведения по собственной инициативе. Обычно к нему прибегают под давлением рыночных обстоятельств, заставляющих искать новые способы обеспечения конкурентоспособности. Наиболее активно IT-аутсорсинг используют крупные компании (более 1000 человек персонала), работающие на инновационных и высококонкурентных рынках. Основным мотивом при этом обычно является желание резко сократить количество «второстепенных» обеспечивающих отделов, служб и департаментов, чтобы сосредоточиться на основных для компании бизнес-процессах и проблемах стратегии. Помимо того, расходы на ASP контролировать гораздо легче, чем средства, выделяемые на поддержание собственных IT-структур. Дополнительными мотивационными факторами могут быть:

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

Несомненно, выбору ASP способствует наличие качественного интернет-канала, безопасные и надежные коммуникационные сети, а также стандартизация документооборота в компании и ориентация на технологии электронной коммерции (e-commerce).

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

  • ограниченность выбора поставщиков ASP-услуг и как следствие отсутствие достаточно привлекательных предложений по соотношению цена/качество. В свою очередь низкий спрос не позволяет провайдерам улучшить это соотношение из-за невозможности использования эффекта масштаба (типизированные решения);
  • конфликт интересов: провайдеру выгоден долгосрочный контракт, а клиенту зачастую — на сравнительно небольшой срок, обусловленный жизненным циклом товара или бизнес-проекта;
  • недостаточную заинтересованность аутсорсеров (и провайдеров ASP-решений) в развитии доверительных отношений с клиентами (особенно в России);
  • высокие транзакционные издержки и организационные сложности в обеспечении взаимодействия с клиентами, посредниками и поставщиками через IT-провайдера;
  • неадекватную оценку рисков при анализе расходов на IT (мало кто оценивает ТСО!). Руководству компании представляется, что «свое», то есть приобретаемое в собственность и эксплуатируемое своими сотрудниками, ПО выгоднее.

Камнем преткновения на пути широкого распространения ASP в России остается и неотлаженность законодательства, в частности отсутствие единых норм регулирования договорных отношений, предоставления отчетности и формализации контроля за бизнес-процессами на основе SLA и разделения рисков. Достаточно высокими остаются и расходы на высокоскоростные коммуникационные каналы (оптоволоконные) и средства защиты информации.

ASP и безопасность

В качестве одной из причин, сдерживающих переход на ASP, часто указывают риск утечки конфиденциальной информации через внешний канал (интернет, сотрудники провайдера). Насколько справедливы эти опасения? Прежде всего необходимо учесть, что провайдер в этом явно не заинтересован. Но достаточны ли предпринимаемые им меры по защите информации? На этот вопрос, безусловно, следует ответить утвердительно, если в качестве провайдера выступает не случайная компания, а солидная, известная на рынке IT-услуг фирма. Такие компании вкладывают огромные средства в создание систем информационной безопасности (СИБ) как на программном, так и на аппаратном уровне. Этих средств сегодня вполне достаточно, чтобы эффективно бороться с угрозами «взлома» систем хакерами.

Однако угроза утечки информации существует. Это проблема вовсе не техническая, а источник угрозы внутренний в лице инсайдеров. По сути, атаки хакеров — это последствия действий сотрудников, передающих им ключевую информацию. Статистика здесь достаточно красноречива — в Германии до 90% случаев утечки важной для бизнеса информации связаны с действиями инсайдеров, в США — более 60%, а в среднем по миру (по данным Gartner) — более 80%.

Необходимо также отметить, что использование интегрированного ASP-решения с функциями контроля над передаваемыми сообщениями (Call Center) существенно снижает риск непреднамеренной утечки информации с разными сообщениями (телефон, почта, факс, e-mail и т. п.), что часто имеет место на практике.

О стоимости и эффективности ASP

Основные статьи расходов, связанных с реализацией IT-проекта на собственной площадке, следующие:

  • стоимость лицензий на прикладное ПО;
  • обслуживание ПО (поддержка продавца);
  • обучение персонала;
  • затраты на приобретение нового и модернизацию старого оборудования;
  • стоимость системного ПО;
  • техническая поддержка, эксплуатация и модернизация информационной системы;
  • администрирование БД;
  • сетевое администрирование и управление коммуникационными каналами;
  • обеспечение информационной безопасности (системы защиты информации, резервное копирование, восстановление ИС после сбоев и т. п.);
  • затраты на развитие ИС.

Расходы по перечисленным статьям сравниваются с ASP-вариантом на предлагаемых провайдером условиях. Затраты на ASP складываются из ежемесячной арендной платы за каждое рабочее место и единовременных расходов на обучение, которые существенно меньше, чем при внутреннем развертывании ИС (за счет типизированности решения). Причем практикуются скидки на арендную плату в зависимости от количества рабочих мест и продолжительности ASP-контракта (обычно расчет ведется на три-пять лет). Эффективность удачных ASP-проектов весьма высокая. Например, ASP-решение ERP-системы People Soft с функциональностью «Логистика-Финансы-Управление» по данным WT Services (восьмилетний опыт работы) обеспечивает расходы на 15-35% меньшие, чем при покупке системы для внутреннего использования. Причем отмечены случаи реализации столь непростых проектов в течение 90 дней. Datalliance отмечает, что реализация ASP-проекта по управлению цепью поставок на основе EDM привела к существенному упрощению бизнес-процессов и снижению затрат от 5 до 15%. Компании Rave Sports (США) при переходе на ASP удалось сократить IT-затраты в 2,5 раза. В целом, по данным USi, Aberdeen Group, AMD Research и др., окупаемость удачных ASP-проектов составляет менее 1,5 года при сокращении стоимости запасов на 25-50% и затрат на поставки до 25% и более. ASP-проекты в области SCM реализуются на 23% быстрее и обходятся на 60 % дешевле внутреннего развертывания ИС по управлению цепями поставок с той же функциональностью. При этом экономия на прямых затратах составляет 10-15% и на 45-65% сокращаются этапы цикла продаж.

Контракт с провайдером и уровень ASP-сервиса

Успешность реализации ASP-проекта в значительной степени зависит от выбора провайдера. При этом следует обращать внимание на следующее:

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

В целом говорят о необходимости у провайдера и поставщика ПО трех «Re» — Reputation, References, Relationships (репутации, рекомендаций и высокого уровня взаимоотношений с клиентами). Кроме того, при принятии решения о переходе на ASP-технологию необходимо четкое понимание целей и преимуществ вашей компании по сравнению с конкурентами. Следует установить, создает ли переход на ASP дополнительную ценность для клиентов, и если да, то в чем она заключается.

При заключении контракта желателен предварительный детальный анализ стоимости ASP-решения на основе грамотного, юридически выверенного технического задания (RFP- Request for Proposal) на проект. Контракт должен содержать соглашение об уровне сервиса (SLA) и компенсационную схему на случай его нарушения. В соглашении об уровне сервиса обычно оговаривается следующее:

  • срок действия соглашения;
  • территория и объекты обслуживания, если речь идет об обслуживании ПО и оборудования клиента, например в рамках Task Sourcing;
  • гарантированное время отклика на клиентские запросы;
  • формы отчетов о работе системы;
  • система измерителей (критериев) качества услуг;
  • требование нераспространения конфиденциальной информации.


ASP и SCM — практика и перспективы

Управление цепями поставок (SCM) — одно из современных направлений в логистике, возникшее в связи с необходимостью разрешения проблем избыточных запасов на складах готовой продукции и сбыта (дистрибуции). Ключевые операции в SCM, связанные с обработкой заказов на поставки товаров, комплектацией и документированием отправок, планированием транспортировки и мониторингом доставки товаров конечным потребителям, автоматизируются с помощью соответствующего ПО SCM-класса (i2, LogiPlan, Manugistics, InterLogistics и др.). SCM-функциональность в виде специального модуля сегодня также включается в состав управленческих ИС ведущих производителей, таких как SAP, Oracle, IFS и др. Перспективность использования данного ПО в ASP-варианте на Западе очевидна и проверена практикой (таблица 3). Доступ к ИС через WEB обеспечивает работу цепи поставок в режиме реального времени, что существенно повышает точность и надежность исполнения операций, качество проектирования логистических услуг, а также сокращает логистический цикл. Возможность непрерывного контроля бизнес-процессов в цепи и оперативного принятия управленческих решений на его основе способствует существенному уменьшению количества и значимости сбоев и ошибок в исполнении заказов. При этом затраты на ASP могут быть разделены между компаниями, обеспечивающими функционирование цепи на принципах аутсорсинга (рисунок 3).

рис3. схема взаимодействия поставщиков, потребителей и посредников в цепи поставок с виртуальным логистическим центром, организованным на WEB-сервере ASP-провайдера

В целом управление поставками через WEB, часто обозначаемое как e-SM (electronic Supply Management), способствует:

  • снижению закупочных цен вследствие расширения коммуникационных и информационных возможностей участников цепи поставок;
  • ускорению процесса заключения сделок благодаря интерактивности;
  • уменьшению количества ошибок в контрактах, рекламациях и «холодных» заказах благодаря возможности реализации диалога с клиентами и организации аукционов;
  • снижению стоимости товарных запасов вследствие повышения точности планирования поставок;
  • улучшению контроля поставок на основе запросов на исполнение операций через интернет;
  • снижению роли географического фактора при заключении сделок благодаря интернету и технологиям экспресс-доставки.

Заключение

Итак, постепенно, по мере совершенствования IT-технологий и рыночных отношений привычным станет и применение ASP, поскольку это отвечает требованиям современной, ориентированной на активное использование информационных систем в управлении экономики. Переход на управление с помощью ASP меняет компанию, ориентируя бизнес-процессы на сотрудничество с провайдерами услуг и потребителями, что в полной мере отвечает методологии SCM в современной логистике. Интерес бизнеса к логистике в РФ очевиден и особенно ощутим в крупных городах. Реализация современных логистических технологий требует применения соответствующего управленческого ПО. А поскольку потребность в таком ПО, по оценкам западных IT-аналитиков, коррелированна со спросом на IT-аутсорсинг, то предположение о положительной динамике спроса на ASP в этом секторе экономики России можно считать вполне обоснованным.

mso-ascii-theme-font:minor-latin;mso-fareast-font-family:Calibri;mso-fareast-theme-font:
minor-latin;mso-hansi-theme-font:minor-latin;mso-bidi-font-family:»Times New Roman»;
mso-bidi-theme-font:minor-bidi;mso-ansi-language:RU;mso-fareast-language:EN-US;
mso-bidi-language:AR-SA»>Евгений Зайцев, д.э.н. профессор.

ASP в России: суть и технологии, проблемы и решения

Сегодня в отечественной прессе все чаще можно встретить аббревиатуру ASP (application service providing).

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

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

На западе технологии ASP уже получили достаточную известность и стали звеном в новой модели бизнеса. В ней цепочкой связаны производители инструментальных средств и СУБД, а также независимые разработчики, создающие приложения на их базе. В прежние времена цепочку завершал конечный пользователь, теперь же появилось еще одно звено — ASP, компания, приспосабливающая приложения к нуждам пользователей, которые будут арендовать эти приложения, получая к ним доступ через Internet.

На Западе среди клиентов услуги аренды приложений наибольшим спросом пользуются ПО управления отношениями с заказчиками (CRM — customer relationship management), планирования корпоративных ресурсов (ERP — enterprise resource planning), управления цепочками поставок (SCM — supply chain management), управления транспортными потоками (TSM — transport stream management) и управления хранилищами данных.

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

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

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

К чему все это? Неужели сейчас прозвучит предложение полностью отказаться от использования всего этого? Конечно, нет! Хотя, отчасти, да.

Модель ASP

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

Развитие технологий Internet предоставляет возможность не приобретать ИТ-ресурсы в собственность, а арендовать их у провайдера прикладных услуг — ASP.

Рис. 1. Модель ASP

Модель ASP (рис. 1) работает следующим образом. Компания ASP организует у себя узел и концентрирует там ИТ-ресурсы, на основе которых и предлагает услуги. Клиент (арендатор) пользуется предлагаемыми услугами на условиях аренды, выплачивая за их пользование ежемесячную плату. Клиент имеет возможность управлять арендуемыми ресурсами через Internet или частные каналы. За свою арендную плату клиент, при наличии доступа к провайдеру услуг, может получить полностью готовую ИТ-инфраструктуру компании.

С точки зрения клиента у модели ASP имеется ряд преимуществ.

  • «Выравнивание» возможностей. Ранее, многие приложения и услуги были по финансовым соображениям недоступны клиенту. Тогда как, необходимость в них есть. Модель ASP позволяет предприятиям малого и среднего бизнеса использовать программное обеспечение, серверы, услуги технической поддержки и регулярные обновления, к которым имеют доступ более крупные компании, но по более низкой цене.
  • Снижение затрат, за счет отсутствия: поиска и внедрения дорогостоящих систем; стартового приобретения оборудования и базового программного обеспечения; содержания персонала, обслуживающего ИТ-ресурсы.
  • Услуги предоставляются квалифицированным персоналом ASP. Например, резервное копирование и оперативное восстановление данных, круглосуточная техническая поддержка, автоматический переход на новые версии ПО.
  • Финансовое планирование. Поскольку клиенты свободны от ИТ-имущества на балансе и только арендуют его у провайдера, то они в любой момент могут отказаться от дальнейшего получения услуг ASP или оперативно переконфигурировать их.

Особенно заметными для компаний становятся преимущества ASP при внедрении сложных бизнес-систем и при подключении большого числа офисов.

Объекты аренды

Рассмотрим теперь примеры того, какие ИТ-ресурсы и каким образом могут быть арендованы через ASP.

Web-хостинг. Простейшая форма аренды ИТ-ресурсов. Реально арендуется дисковое пространство на сервере, подключенном к Сети. Другими словами, это возможность получения пользователями Internet доступа к информации арендатора. Этот вид аренды получил очень широкое распространение вследствие существенной разницы между затратами на организацию собственного Web-сервера и стоимостью аренды его у провайдера (от 0 до 50 долл. в месяц).

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

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

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

Арендатор получает полный контроль над компьютером, имеет возможность конфигурировать систему в соответствии со своими нуждами, устанавливать любое программное обеспечение и т.д. При этом нет больших стартовых затрат, являющихся для многих пороговым ограничением при начале проектов. Условия аренды прежние — помесячная оплата. Клиент только арендует ИТ-ресурсы, его деньги работают на него, они не связаны собственностью и не уменьшаются вместе с амортизационными списаниями и старением оборудования. Нет расходов на выделенную линию, на телекоммуникационное оборудование, на содержание обслуживающего персонала.

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

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

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

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

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

Решение от ASP

Провайдер приложений устанавливает у себя компьютер, например, с операционной системой Windows 2000, поддерживает на нем корректную работу СУБД, скажем, с Microsoft SQL Server 7.0 и готового многофункционального Internet-магазина. На этом сервере сотрудники ASP-компании выполняют корректную настройку приложения и обеспечивают регулярное техническое сопровождение, резервное копирование и, что важно, оперативное обновление версий магазина. Переход на новые и совместимые версии продукта приводит к улучшениям в электронном бизнесе клиента.

Исходя из схемы ASP, клиенты получают доступ к приложению на сервере через Internet с использованием клиентской утилиты администрирования.

Учитывая, что реальная арендная плата за Internet-магазин не превышает 5% в месяц от стоимости его создания или покупки в собственность готового решения, то это становится выгодно для компании, входящей в Internet-бизнес. Если через три месяца проект закроют — убытки составят «всего» 15% от возможных при обычной схеме. Нет стартового финансового порога, а для того чтобы выйти на рынок, не нужны начальные инвестиции — сначала открывается Internet-бизнес, а все расходы можно растянуть во времени и платить уже из прибыли.

Клиент получает в свое распоряжение нужный ему Internet-магазин с привычным интерфейсом и может использовать его для получения информации и оперативного обновления данных. Что очень важно, клиент освобождается от необходимости покупать лицензии на СУБД, устанавливать программное обеспечение, настраивать, резервировать данные, а еще и оплачивать услуги программистов. В результате:

  • клиент за меньшую сумму получает необходимую ему услугу. Иными словами, стоимость аренды приложения для него намного ниже совокупной стоимости отдельного экземпляра программы совместно со стоимостью владения этой копией;
  • выигрывает поставщик программного обеспечения, так как услугой смогли воспользоваться клиенты, которые раньше не могли себе позволить покупку в собственность Internet-приложения, а, следовательно, число постоянно платящих клиентов увеличилось. Это значит, что отсутствует такая головная боль всех руководителей компаний-разработчиков ПО как колебания cash flow (денежных потоков) от версии к версии продукта;
  • выигрывает провайдер услуг, который несет определенные, но покрываемые взимаемой арендной платой дополнительные расходы при подключении всё новых и новых пользователей. Многие клиенты будут параллельно на одном сервере запускать и выполнять приложения, однажды настроенные администратором. Как следствие, стоимость аренды приложения не включает существенных статей расходов.

Так, «Гарант-Парк-Интернет» запрашивает за аренду Internet-магазина чуть менее 100 долл. в месяц, причем установка и настройка производится бесплатно в течение одного-трех дней. Предоставляются также дополнительные услуги по оформлению и презентации магазина.

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

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

Отечественная специфика

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

Согласно исследованиям компании ARC Advisory Group, рынок аренды ПО через Internet, когда программы выступают в роли услуг, а не продуктов, к концу 2004 года возрастет до 8 млрд. долл. Причина такого роста заключается в том, что созрели технологии и появилось много специализированных приложений. Современные инструменты разработки позволяют быстро создавать и внедрять приложения, а каналы связи обеспечивают достаточную скорость доступа и надежность.

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

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

Во-вторых, у нас в стране, как известно, очень распространено пиратское использование ПО. Зачастую для малого и среднего бизнеса стоимость владения стандартным набором деловых приложений близка к нулю: нелицензионную копию любой программы можно купить за бесценок.

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

И наконец, очень важна проблема информационной безопасности предприятия. Далеко не каждая коммерческая организация в России доверит свою бухгалтерию, поддержку своих офисных приложений, обслуживание финансовых процессов и другие закрытые системы пусть даже честным, но все же чужим людям. Это, кстати, не только российская специфика. На рынке ASP во всем мире все большее значение приобретает доверие к поставщику услуг.

Тем не менее, все эти проблемы постепенно будут решаться, и развитие рынка аренды приложений в России, хоть и медленно, но произойдет. Какие же программные системы могут работать в режиме аренды уже сегодня?

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

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

Большие игры для маленьких компаний

Расширение рынка ASP в мире способно cерьезно повлиять на развитие всей ИТ-индустрии. Изменятся отношения между разработчиками ПО, провайдерами разных типов, продавцами, клиентами и другими игроками этого рынка. Отрадно, что и нашу страну тоже захватил этот процесс. Эволюция Internet — естественный процесс, и хотим мы этого или нет, мы станем частью происходящих в ИТ-бизнесе изменений.

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

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

Об авторах

Максим ЗахаренкоАлександр Печников сотрудники компании «Гарант-Парк-Интернет». С ними можно связаться по адресам: max/avp@park.ru соответственно.

Решение для групповой работы

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

Такие заказчики могут арендовать Microsoft Exchange Server, точнее не само программное обеспечение, а услуги, которые оно предоставляет. Провайдер на своей территории (узле) устанавливает и подключает к Internet сервер с установленным на нем Exchange Server, производит необходимые настройки и заводит почтовые ящики пользователей. Предприятие организует (возможно, с помощью провайдера) подключение к Internet, например, по коммутируемой линии. На рабочих станциях сотрудников устанавливается почтовая программа-клиент (Outlook, Outlook Express и др.), либо браузер. Начиная с этого момента, любой сотрудник предприятия может пользоваться всеми функциями Exchange, как будто сервер электронной почты расположен непосредственно в офисе.

Предприятие пользуется услугами на условиях аренды, ежемесячно выплачивая определенную сумму провайдеру. Компания «Гарант-Парк-Интернет», предоставляющая подобную услугу, взимает порядка 5-6 долл. на рабочее место, не считая аренды оборудования и платного трафика.

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

Поделитесь материалом с коллегами и друзьями

Выполнения HTTP-запросов с помощью IHttpClientFactory в ASP.NET Core Make HTTP requests using IHttpClientFactory in ASP.NET Core

IHttpClientFactory можно зарегистрировать и использовать для настройки и создания экземпляров HttpClient в приложении. An IHttpClientFactory can be registered and used to configure and create HttpClient instances in an app. IHttpClientFactory предоставляет следующие преимущества: IHttpClientFactory offers the following benefits:

  • Центральное расположение для именования и настройки логических экземпляров HttpClient . Provides a central location for naming and configuring logical HttpClient instances. Например, можно зарегистрировать и настроить клиент github для доступа к GitHub. For example, a client named github could be registered and configured to access GitHub. Можно зарегистрировать клиент по умолчанию для общего доступа. A default client can be registered for general access.
  • Кодификация концепции исходящего ПО промежуточного слоя путем делегирования обработчиков в HttpClient . Codifies the concept of outgoing middleware via delegating handlers in HttpClient . Предоставление расширений для ПО промежуточного слоя на основе Polly для делегирования обработчиков в HttpClient . Provides extensions for Polly-based middleware to take advantage of delegating handlers in HttpClient .
  • Управление созданием пулов и временем существования базовых экземпляров HttpClientMessageHandler . Manages the pooling and lifetime of underlying HttpClientMessageHandler instances. Автоматическое управление позволяет избежать обычных проблем со службой доменных имен (DNS), которые возникают при управлении временем существования HttpClient вручную. Automatic management avoids common DNS (Domain Name System) problems that occur when manually managing HttpClient lifetimes.
  • Настройка параметров ведения журнала (через ILogger ) для всех запросов, отправленных через клиентов, созданных фабрикой. Adds a configurable logging experience (via ILogger ) for all requests sent through clients created by the factory.

Пример кода в этой версии раздела использует System.Text.Json для десериализации содержимого JSON, возвращаемого в ответах HTTP. The sample code in this topic version uses System.Text.Json to deserialize JSON content returned in HTTP responses. Для примеров, использующих Json.NET и ReadAsAsync , воспользуйтесь средством выбора версии, чтобы выбрать версию 2.x этого раздела. For samples that use Json.NET and ReadAsAsync , use the version selector to select a 2.x version of this topic.

Принципы использования Consumption patterns

Существует несколько способов использования IHttpClientFactory в приложении: There are several ways IHttpClientFactory can be used in an app:

Оптимальный подход зависит от требований приложения. The best approach depends upon the app’s requirements.

Основное использование Basic usage

IHttpClientFactory можно зарегистрировать, вызвав AddHttpClient : IHttpClientFactory can be registered by calling AddHttpClient :

IHttpClientFactory можно запросить с помощью внедрения зависимостей (DI). An IHttpClientFactory can be requested using dependency injection (DI). Следующий код использует IHttpClientFactory для создания экземпляра HttpClient : The following code uses IHttpClientFactory to create an HttpClient instance:

Подобное использование IHttpClientFactory — это хороший способ рефакторинга имеющегося приложения. Using IHttpClientFactory like in the preceding example is a good way to refactor an existing app. Он не оказывает влияния на использование HttpClient . It has no impact on how HttpClient is used. Там, где в существующем приложении создаются экземпляры HttpClient , используйте вызовы к CreateClient. In places where HttpClient instances are created in an existing app, replace those occurrences with calls to CreateClient.

Именованные клиенты Named clients

Именованные клиенты являются хорошим выбором в следующих случаях: Named clients are a good choice when:

  • Приложение требует много отдельных использований HttpClient . The app requires many distinct uses of HttpClient .
  • Многие HttpClient имеют другую конфигурацию. Many HttpClient s have different configuration.

Конфигурацию для именованного клиента HttpClient можно указать во время регистрации в Startup.ConfigureServices : Configuration for a named HttpClient can be specified during registration in Startup.ConfigureServices :


В приведенном выше коде клиент регистрируется с: In the preceding code the client is configured with:

  • базовым адресом https://api.github.com/ ; The base address https://api.github.com/ .
  • двумя заголовками, необходимыми для работы с API GitHub. Two headers required to work with the GitHub API.

CreateClient CreateClient

При каждом вызове CreateClient: Each time CreateClient is called:

  • создается новый экземпляр HttpClient ; A new instance of HttpClient is created.
  • вызывается действие настройки. The configuration action is called.

Чтобы создать именованный клиент, передайте его имя в CreateClient : To create a named client, pass its name into CreateClient :

В приведенном выше коде в запросе не требуется указывать имя узла. In the preceding code, the request doesn’t need to specify a hostname. Достаточно передать только путь, так как используется базовый адрес, заданный для клиента. The code can pass just the path, since the base address configured for the client is used.

Типизированные клиенты Typed clients

Типизированные клиенты: Typed clients:

  • предоставляют те же возможности, что и именованные клиенты, без необходимости использовать строки в качестве ключей. Provide the same capabilities as named clients without the need to use strings as keys.
  • Это помогает IntelliSense и компилятору при использовании клиентов. Provides IntelliSense and compiler help when consuming clients.
  • Они предоставляют единое расположение для настройки и взаимодействия с конкретным клиентом HttpClient . Provide a single location to configure and interact with a particular HttpClient . Например, один типизированный клиент можно использовать: For example, a single typed client might be used:
    • для одной серверной конечной точки; For a single backend endpoint.
    • для инкапсуляции всей логики, связанной с конечной точкой. To encapsulate all logic dealing with the endpoint.
  • Поддерживаются работа с внедрением зависимостей и возможность вставки в нужное место в приложении. Work with DI and can be injected where required in the app.

Типизированный клиент принимает параметр HttpClient в конструкторе: A typed client accepts a HttpClient parameter in its constructor:

В приведенном выше коде: In the preceding code:

  • Конфигурация перемещается в типизированный клиент. The configuration is moved into the typed client.
  • Объект HttpClient предоставляется в виде открытого свойства. The HttpClient object is exposed as a public property.

Можно создать связанные с API методы, которые предоставляют функциональные возможности HttpClient . API-specific methods can be created that expose HttpClient functionality. Например, метод GetAspNetDocsIssues инкапсулирует код для получения открытых вопросов. For example, the GetAspNetDocsIssues method encapsulates code to retrieve open issues.

Следующий код вызывает AddHttpClient в Startup.ConfigureServices для регистрации класса типизированного клиента: The following code calls AddHttpClient in Startup.ConfigureServices to register a typed client class:

Типизированный клиент регистрируется во внедрении зависимостей как временный. The typed client is registered as transient with DI. Типизированный клиент можно внедрить и использовать напрямую: The typed client can be injected and consumed directly:

Конфигурацию для типизированного клиента можно указать во время регистрации в Startup.ConfigureServices , а не в конструкторе типизированного клиента: The configuration for a typed client can be specified during registration in Startup.ConfigureServices , rather than in the typed client’s constructor:

HttpClient может быть инкапсулирован в типизированном клиенте. The HttpClient can be encapsulated within a typed client. Вместо предоставления его как свойства определите метод для внутреннего вызова экземпляра HttpClient : Rather than exposing it as a property, define a method which calls the HttpClient instance internally:

В приведенном выше коде HttpClient хранится в закрытом поле. In the preceding code, the HttpClient is stored in a private field. Доступ к HttpClient осуществляется с помощью общедоступного метода GetRepos . Access to the HttpClient is by the public GetRepos method.

Созданные клиенты Generated clients

IHttpClientFactory можно использовать в сочетании с библиотеками сторонних разработчиков, например Refit. IHttpClientFactory can be used in combination with third-party libraries such as Refit. Refit — это библиотека REST для .NET. Refit is a REST library for .NET. Она преобразует REST API в динамические интерфейсы. It converts REST APIs into live interfaces. Реализация интерфейса формируется динамически с помощью RestService с использованием HttpClient для совершения внешних вызовов HTTP. An implementation of the interface is generated dynamically by the RestService , using HttpClient to make the external HTTP calls.

Для представления внешнего API и его ответа определяются интерфейс и ответ: An interface and a reply are defined to represent the external API and its response:

Можно добавить типизированный клиент, используя Refit для создания реализации: A typed client can be added, using Refit to generate the implementation:

При необходимости можно использовать определенный интерфейс с реализацией, предоставленной внедрением зависимостей и Refit: The defined interface can be consumed where necessary, with the implementation provided by DI and Refit:

ПО промежуточного слоя для исходящих запросов Outgoing request middleware

В HttpClient существует концепция делегирования обработчиков, которые можно связать друг с другом для исходящих HTTP-запросов. HttpClient has the concept of delegating handlers that can be linked together for outgoing HTTP requests. IHttpClientFactory . IHttpClientFactory :

Упрощает определение обработчиков для применения к каждому именованному клиенту. Simplifies defining the handlers to apply for each named client.

Поддерживает регистрацию и объединение в цепочки нескольких обработчиков для создания конвейера ПО промежуточного слоя для исходящих запросов. Supports registration and chaining of multiple handlers to build an outgoing request middleware pipeline. Каждый из этих обработчиков может выполнять работу до и после исходящего запроса. Each of these handlers is able to perform work before and after the outgoing request. Этот шаблон: This pattern:

похож на входящий конвейер ПО промежуточного слоя в ASP.NET Core; Is similar to the inbound middleware pipeline in ASP.NET Core.

предоставляет механизм управления сквозной функциональностью HTTP-запросов, включая: Provides a mechanism to manage cross-cutting concerns around HTTP requests, such as:

  • кэширование caching
  • обработку ошибок error handling
  • сериализацию serialization
  • Ведение журналов logging

Чтобы создать делегированный обработчик, сделайте следующее: To create a delegating handler:

  • Создайте объект, производный от DelegatingHandler. Derive from DelegatingHandler.
  • Переопределите метод SendAsync. Override SendAsync. Выполните код до передачи запроса следующему обработчику в конвейере: Execute code before passing the request to the next handler in the pipeline:

Предыдущий код проверяет, находится ли заголовок X-API-KEY в запросе. The preceding code checks if the X-API-KEY header is in the request. Если X-API-KEY отсутствует, возвращается BadRequest. If X-API-KEY is missing, BadRequest is returned.

Можно добавить сразу несколько обработчиков в конфигурацию для HttpClient с использованием Microsoft.Extensions.DependencyInjection.HttpClientBuilderExtensions.AddHttpMessageHandler: More than one handler can be added to the configuration for a HttpClient with Microsoft.Extensions.DependencyInjection.HttpClientBuilderExtensions.AddHttpMessageHandler:

В приведенном выше коде ValidateHeaderHandler регистрируется с помощью внедрения зависимостей. In the preceding code, the ValidateHeaderHandler is registered with DI. IHttpClientFactory создает отдельную область внедрения зависимостей для каждого обработчика. The IHttpClientFactory creates a separate DI scope for each handler. Обработчики могут зависеть от служб из любой области. Handlers can depend upon services of any scope. Службы, которые зависят от обработчиков, удаляются при удалении обработчика. Services that handlers depend upon are disposed when the handler is disposed.

После регистрации можно вызвать AddHttpMessageHandler, передав тип обработчика. Once registered, AddHttpMessageHandler can be called, passing in the type for the handler.

Можно зарегистрировать несколько обработчиков в порядке, в котором они должны выполняться. Multiple handlers can be registered in the order that they should execute. Каждый обработчик содержит следующий обработчик, пока последний HttpClientHandler не выполнит запрос: Each handler wraps the next handler until the final HttpClientHandler executes the request:

Используйте один из следующих методов для предоставления общего доступа к состоянию отдельных запросов с помощью обработчиков сообщений: Use one of the following approaches to share per-request state with message handlers:

  • Передайте данные в обработчик с помощью HttpRequestMessage.Properties. Pass data into the handler using HttpRequestMessage.Properties.
  • Используйте IHttpContextAccessor для доступа к текущему запросу. Use IHttpContextAccessor to access the current request.
  • Создайте пользовательский объект хранилища AsyncLocal для передачи данных. Create a custom AsyncLocal storage object to pass the data.

Использование обработчиков на основе Polly Use Polly-based handlers

IHttpClientFactory интегрируется с библиотекой сторонних разработчиков Polly. IHttpClientFactory integrates with the third-party library Polly. Polly — это комплексная библиотека, обеспечивающая отказоустойчивость и обработку временных сбоев в .NET. Polly is a comprehensive resilience and transient fault-handling library for .NET. Она позволяет разработчикам выражать политики, например политику повтора, размыкателя цепи, времени ожидания, изоляции отсеков и отката, более эффективным и потокобезопасным образом. It allows developers to express policies such as Retry, Circuit Breaker, Timeout, Bulkhead Isolation, and Fallback in a fluent and thread-safe manner.

Для использования политик Polly с настроенными экземплярами HttpClient предоставляются методы расширения. Extension methods are provided to enable the use of Polly policies with configured HttpClient instances. Расширения Polly поддерживают добавление обработчиков на основе Polly клиентам. The Polly extensions support adding Polly-based handlers to clients. Polly нужен пакет NuGet Microsoft.Extensions.Http.Polly. Polly requires the Microsoft.Extensions.Http.Polly NuGet package.

Обработка временных сбоев Handle transient faults

Чаще всего ошибки происходят, когда внешние вызовы HTTP являются временными. Faults typically occur when external HTTP calls are transient. AddTransientHttpErrorPolicy позволяет определить политику для обработки временных ошибок. AddTransientHttpErrorPolicy allows a policy to be defined to handle transient errors. Политики, настроенные с помощью AddTransientHttpErrorPolicy , обрабатывают следующие ответы: Policies configured with AddTransientHttpErrorPolicy handle the following responses:

AddTransientHttpErrorPolicy предоставляет доступ к объекту PolicyBuilder , настроенному для обработки ошибок, представляющих возможный временный сбой: AddTransientHttpErrorPolicy provides access to a PolicyBuilder object configured to handle errors representing a possible transient fault:

В приведенном выше коде определена политика WaitAndRetryAsync . In the preceding code, a WaitAndRetryAsync policy is defined. Неудачные запросы повторяются до трех раз с задержкой 600 мс между попытками. Failed requests are retried up to three times with a delay of 600 ms between attempts.

Динамический выбор политик Dynamically select policies

Предоставляются методы расширения для добавления обработчиков на основе Polly, например AddPolicyHandler. Extension methods are provided to add Polly-based handlers, for example, AddPolicyHandler. Следующая перегрузка AddPolicyHandler проверяет запрос для определения применимой политики: The following AddPolicyHandler overload inspects the request to decide which policy to apply:

Если в приведенном выше коде исходящий запрос является запросом HTTP GET, применяется время ожидания 10 секунд. In the preceding code, if the outgoing request is an HTTP GET, a 10-second timeout is applied. Для остальных методов HTTP время ожидания — 30 секунд. For any other HTTP method, a 30-second timeout is used.

Добавление нескольких обработчиков Polly Add multiple Polly handlers

Общепринятой практикой является вложение политик Polly: It’s common to nest Polly policies:

В предшествующем примере: In the preceding example:

  • Добавляются два обработчика. Two handlers are added.
  • Первый обработчик использует AddTransientHttpErrorPolicy, чтобы добавить политику повтора. The first handler uses AddTransientHttpErrorPolicy to add a retry policy. Неудачные запросы выполняются повторно до трех раз. Failed requests are retried up to three times.
  • Второй вызов AddTransientHttpErrorPolicy добавляет политику размыкателя цепи. The second AddTransientHttpErrorPolicy call adds a circuit breaker policy. Дополнительные внешние запросы блокируются в течение 30 секунд в случае пяти неудачных попыток подряд. Further external requests are blocked for 30 seconds if 5 failed attempts occur sequentially. Политики размыкателя цепи отслеживают состояние. Circuit breaker policies are stateful. Все вызовы через этот клиент имеют одинаковое состояние цепи. All calls through this client share the same circuit state.

Добавление политик из реестра Polly Add policies from the Polly registry

Подход к управлению регулярно используемыми политиками заключается в их однократном определении и регистрации с помощью PolicyRegistry . An approach to managing regularly used policies is to define them once and register them with a PolicyRegistry .

В приведенном ниже коде выполняется следующее: In the following code:

  • Добавляются политики regular и long. The «regular» and «long» polices are added.
  • AddPolicyHandlerFromRegistry добавляет политики regular и long из реестра. AddPolicyHandlerFromRegistry adds the «regular» and «long» policies from the registry.

Дополнительные сведения о IHttpClientFactory и интеграции Polly см. на вики-сайте Polly. For more information on IHttpClientFactory and Polly integrations, see the Polly wiki.

Управление HttpClient и временем существования HttpClient and lifetime management

При каждом вызове CreateClient в IHttpClientFactory возвращается новый экземпляр HttpClient . A new HttpClient instance is returned each time CreateClient is called on the IHttpClientFactory . HttpMessageHandler создается для каждого именованного клиента. An HttpMessageHandler is created per named client. Фабрика обеспечивает управление временем существования экземпляров HttpMessageHandler . The factory manages the lifetimes of the HttpMessageHandler instances.

IHttpClientFactory объединяет в пул все экземпляры HttpMessageHandler , созданные фабрикой, чтобы уменьшить потребление ресурсов. IHttpClientFactory pools the HttpMessageHandler instances created by the factory to reduce resource consumption. Экземпляр HttpMessageHandler можно использовать повторно из пула при создании экземпляра HttpClient , если его время существования еще не истекло. An HttpMessageHandler instance may be reused from the pool when creating a new HttpClient instance if its lifetime hasn’t expired.

Создавать пулы обработчиков желательно, так как каждый обработчик обычно управляет собственными базовыми HTTP-подключениями. Pooling of handlers is desirable as each handler typically manages its own underlying HTTP connections. Создание лишних обработчиков может привести к задержке подключения. Creating more handlers than necessary can result in connection delays. Некоторые обработчики поддерживают подключения открытыми в течение неопределенного периода, что может помешать обработчику отреагировать на изменения службы доменных имен (DNS). Some handlers also keep connections open indefinitely, which can prevent the handler from reacting to DNS (Domain Name System) changes.

Время существования обработчика по умолчанию — две минуты. The default handler lifetime is two minutes. Значение по умолчанию можно переопределить для каждого именованного клиента: The default value can be overridden on a per named client basis:

Экземпляры HttpClient обычно можно рассматривать как объекты .NET, не требующие освобождения. HttpClient instances can generally be treated as .NET objects not requiring disposal. Высвобождение отменяет исходящие запросы и гарантирует, что указанный экземпляр HttpClient не может использоваться после вызова Dispose. Disposal cancels outgoing requests and guarantees the given HttpClient instance can’t be used after calling Dispose. IHttpClientFactory отслеживает и высвобождает ресурсы, используемые экземплярами HttpClient . IHttpClientFactory tracks and disposes resources used by HttpClient instances.

До появления IHttpClientFactory один экземпляр HttpClient часто сохраняли в активном состоянии в течение длительного времени. Keeping a single HttpClient instance alive for a long duration is a common pattern used before the inception of IHttpClientFactory . После перехода на IHttpClientFactory это уже не нужно. This pattern becomes unnecessary after migrating to IHttpClientFactory .

Ведение журнала Logging

Клиенты, созданные через IHttpClientFactory , записывают сообщения журнала для всех запросов. Clients created via IHttpClientFactory record log messages for all requests. Установите соответствующий уровень информации в конфигурации ведения журнала, чтобы просматривать сообщения журнала по умолчанию. Enable the appropriate information level in the logging configuration to see the default log messages. Дополнительное ведение журнала, например запись заголовков запросов, включено только на уровне трассировки. Additional logging, such as the logging of request headers, is only included at trace level.

Категория журнала для каждого клиента включает в себя имя клиента. The log category used for each client includes the name of the client. Клиент с именем MyNamedClient, например, записывает в журнал сообщения с категорией «System.Net.Http.HttpClient.MyNamedClient.LogicalHandler». A client named MyNamedClient, for example, logs messages with a category of «System.Net.Http.HttpClient.MyNamedClient.LogicalHandler». Сообщения с суффиксом LogicalHandler создаются за пределами конвейера обработчиков запросов. Messages suffixed with LogicalHandler occur outside the request handler pipeline. Во время запроса сообщения записываются в журнал до обработки запроса другими обработчиками в конвейере. On the request, messages are logged before any other handlers in the pipeline have processed it. Во время ответа сообщения записываются в журнал после получения ответа другими обработчиками в конвейере. On the response, messages are logged after any other pipeline handlers have received the response.

Кроме того, журнал ведется в конвейере обработчиков запросов. Logging also occurs inside the request handler pipeline. В примере MyNamedClient эти сообщения регистрируются с категорией журнала «System.Net.Http.HttpClient.MyNamedClient.ClientHandler». In the MyNamedClient example, those messages are logged with the log category «System.Net.Http.HttpClient.MyNamedClient.ClientHandler». Во время запроса это происходит после выполнения всех обработчиков и непосредственно перед отправкой запроса. For the request, this occurs after all other handlers have run and immediately before the request is sent. Во время ответа в журнале записывается состояние ответа перед его передачей обратно по конвейеру обработчиков. On the response, this logging includes the state of the response before it passes back through the handler pipeline.

Включив ведение журнала в конвейере и за его пределами, можно выполнять проверку изменений, внесенных другими обработчиками конвейера. Enabling logging outside and inside the pipeline enables inspection of the changes made by the other pipeline handlers. Сюда входят изменения заголовков запросов или кода состояния ответов. This may include changes to request headers or to the response status code.

Включение имени клиента в категорию журнала позволяет фильтровать журналы по именованным клиентам. Including the name of the client in the log category enables log filtering for specific named clients.

Настройка HttpMessageHandler Configure the HttpMessageHandler

Иногда необходимо контролировать конфигурацию внутреннего обработчика HttpMessageHandler , используемого клиентом. It may be necessary to control the configuration of the inner HttpMessageHandler used by a client.

При добавлении именованного или типизированного клиента возвращается IHttpClientBuilder . An IHttpClientBuilder is returned when adding named or typed clients. Для определения делегата можно использовать метод расширения ConfigurePrimaryHttpMessageHandler. The ConfigurePrimaryHttpMessageHandler extension method can be used to define a delegate. Делегат используется для создания и настройки основного обработчика HttpMessageHandler , используемого этим клиентом: The delegate is used to create and configure the primary HttpMessageHandler used by that client:

Использование IHttpClientFactory в консольном приложении Use IHttpClientFactory in a console app


В консольном приложении добавьте в проект следующие ссылки на пакеты: In a console app, add the following package references to the project:

В следующем примере: In the following example:

  • IHttpClientFactory регистрируется в контейнере службы универсального узла: IHttpClientFactory is registered in the Generic Host’s service container.
  • MyService создает экземпляр фабрики клиента из службы, который используется для создания HttpClient . MyService creates a client factory instance from the service, which is used to create an HttpClient . HttpClient используется для получения веб-страницы. HttpClient is used to retrieve a webpage.
  • Main создает область для выполнения метода GetPage службы и вывода первых 500 символов содержимого веб-страницы на консоль. Main creates a scope to execute the service’s GetPage method and write the first 500 characters of the webpage content to the console.

Дополнительные ресурсы Additional resources

IHttpClientFactory можно зарегистрировать и использовать для настройки и создания экземпляров HttpClient в приложении. An IHttpClientFactory can be registered and used to configure and create HttpClient instances in an app. Так вы получите следующие преимущества: It offers the following benefits:

  • Центральное расположение для именования и настройки логических экземпляров HttpClient . Provides a central location for naming and configuring logical HttpClient instances. Например, можно зарегистрировать и настроить клиент github для доступа к GitHub. For example, a github client can be registered and configured to access GitHub. Можно зарегистрировать клиент по умолчанию для других целей. A default client can be registered for other purposes.
  • Кодификация концепции исходящего ПО промежуточного слоя путем делегирования обработчиков в HttpClient и предоставление расширений для ПО промежуточного слоя на основе Polly для использования этой возможности. Codifies the concept of outgoing middleware via delegating handlers in HttpClient and provides extensions for Polly-based middleware to take advantage of that.
  • Управление созданием пулов и временем существования базовых экземпляров HttpClientMessageHandler с целью избежать обычных проблем с DNS, которые возникают при управлении временем существования HttpClient вручную. Manages the pooling and lifetime of underlying HttpClientMessageHandler instances to avoid common DNS problems that occur when manually managing HttpClient lifetimes.
  • Настройка параметров ведения журнала (через ILogger ) для всех запросов, отправленных через клиентов, созданных фабрикой. Adds a configurable logging experience (via ILogger ) for all requests sent through clients created by the factory.

Принципы использования Consumption patterns

Существует несколько способов использования IHttpClientFactory в приложении: There are several ways IHttpClientFactory can be used in an app:

Все способы равноценны. None of them are strictly superior to another. Оптимальный подход зависит от ограничений приложения. The best approach depends upon the app’s constraints.

Основное использование Basic usage

IHttpClientFactory можно зарегистрировать путем вызова метода расширения AddHttpClient в IServiceCollection внутри метода Startup.ConfigureServices . The IHttpClientFactory can be registered by calling the AddHttpClient extension method on the IServiceCollection , inside the Startup.ConfigureServices method.

После регистрации код может принимать IHttpClientFactory в любом месте, куда можно внедрить службу с помощью внедрения зависимостей (DI). Once registered, code can accept an IHttpClientFactory anywhere services can be injected with dependency injection (DI). IHttpClientFactory можно использовать для создания экземпляра HttpClient : The IHttpClientFactory can be used to create a HttpClient instance:

Подобное использование IHttpClientFactory — это отличный способ рефакторинга имеющегося приложения. Using IHttpClientFactory in this fashion is a good way to refactor an existing app. Он не оказывает влияния на использование HttpClient . It has no impact on the way HttpClient is used. Там, где в данный момент создаются экземпляры HttpClient , используйте вызов к CreateClient. In places where HttpClient instances are currently created, replace those occurrences with a call to CreateClient.

Именованные клиенты Named clients

Если для приложения предполагаются разные способы использования HttpClient , каждый со своей конфигурацией, можно применять именованные клиенты. If an app requires many distinct uses of HttpClient , each with a different configuration, an option is to use named clients. Конфигурацию для именованного клиента HttpClient можно указать во время регистрации в Startup.ConfigureServices . Configuration for a named HttpClient can be specified during registration in Startup.ConfigureServices .

В приведенном выше коде вызывается клиент AddHttpClient , предоставляющий имя github. In the preceding code, AddHttpClient is called, providing the name github. У клиента есть некоторые настройки по умолчанию — а именно: базовый адрес и два заголовка, необходимые для работы с API GitHub. This client has some default configuration applied—namely the base address and two headers required to work with the GitHub API.

При каждом вызове CreateClient создается новый экземпляр HttpClient и вызывается действие конфигурации. Each time CreateClient is called, a new instance of HttpClient is created and the configuration action is called.

Для использования именованного клиента можно передать строковый параметр в CreateClient . To consume a named client, a string parameter can be passed to CreateClient . Укажите имя создаваемого клиента: Specify the name of the client to be created:

В приведенном выше коде в запросе не требуется указывать имя узла. In the preceding code, the request doesn’t need to specify a hostname. Достаточно передать только путь, так как используется базовый адрес, заданный для клиента. It can pass just the path, since the base address configured for the client is used.

Типизированные клиенты Typed clients

Типизированные клиенты: Typed clients:

  • предоставляют те же возможности, что и именованные клиенты, без необходимости использовать строки в качестве ключей. Provide the same capabilities as named clients without the need to use strings as keys.
  • Это помогает IntelliSense и компилятору при использовании клиентов. Provides IntelliSense and compiler help when consuming clients.
  • Они предоставляют единое расположение для настройки и взаимодействия с конкретным клиентом HttpClient . Provide a single location to configure and interact with a particular HttpClient . Например, для конечной точки серверной части можно использовать один типизированный клиент, который будет содержать всю логику работы с этой конечной точкой. For example, a single typed client might be used for a single backend endpoint and encapsulate all logic dealing with that endpoint.
  • Поддерживаются работа с внедрением зависимостей и возможность вставки в нужное место в приложении. Work with DI and can be injected where required in your app.

Типизированный клиент принимает параметр HttpClient в конструкторе: A typed client accepts a HttpClient parameter in its constructor:

В приведенном выше коде конфигурация перемещается в типизированный клиент. In the preceding code, the configuration is moved into the typed client. Объект HttpClient предоставляется в виде открытого свойства. The HttpClient object is exposed as a public property. Можно определить связанные с API методы, которые предоставляют функциональные возможности HttpClient . It’s possible to define API-specific methods that expose HttpClient functionality. Метод GetAspNetDocsIssues инкапсулирует код, необходимый для запроса и анализа последнего открытого выпуска из репозитория GitHub. The GetAspNetDocsIssues method encapsulates the code needed to query for and parse out the latest open issues from a GitHub repository.

Для регистрации типизированного клиента можно использовать универсальный метод расширения AddHttpClient в Startup.ConfigureServices , указав класс типизированного клиента: To register a typed client, the generic AddHttpClient extension method can be used within Startup.ConfigureServices , specifying the typed client class:

Типизированный клиент регистрируется во внедрении зависимостей как временный. The typed client is registered as transient with DI. Типизированный клиент можно внедрить и использовать напрямую: The typed client can be injected and consumed directly:

При желании конфигурацию для типизированного клиента можно указать во время регистрации в Startup.ConfigureServices , а не в конструкторе типизированного клиента: If preferred, the configuration for a typed client can be specified during registration in Startup.ConfigureServices , rather than in the typed client’s constructor:

Можно полностью инкапсулировать HttpClient внутри типизированного клиента. It’s possible to entirely encapsulate the HttpClient within a typed client. Вместо предоставления его как свойства можно использовать открытые методы для внутреннего вызова экземпляра HttpClient . Rather than exposing it as a property, public methods can be provided which call the HttpClient instance internally.

В приведенном выше коде HttpClient хранится как закрытое поле. In the preceding code, the HttpClient is stored as a private field. Любой доступ для совершения внешних вызовов осуществляется через метод GetRepos . All access to make external calls goes through the GetRepos method.

Созданные клиенты Generated clients

IHttpClientFactory можно использовать в сочетании с другими библиотеками сторонних разработчиков, например Refit. IHttpClientFactory can be used in combination with other third-party libraries such as Refit. Refit — это библиотека REST для .NET. Refit is a REST library for .NET. Она преобразует REST API в динамические интерфейсы. It converts REST APIs into live interfaces. Реализация интерфейса формируется динамически с помощью RestService с использованием HttpClient для совершения внешних вызовов HTTP. An implementation of the interface is generated dynamically by the RestService , using HttpClient to make the external HTTP calls.

Для представления внешнего API и его ответа определяются интерфейс и ответ: An interface and a reply are defined to represent the external API and its response:

Можно добавить типизированный клиент, используя Refit для создания реализации: A typed client can be added, using Refit to generate the implementation:

При необходимости можно использовать определенный интерфейс с реализацией, предоставленной внедрением зависимостей и Refit: The defined interface can be consumed where necessary, with the implementation provided by DI and Refit:

ПО промежуточного слоя для исходящих запросов Outgoing request middleware

В HttpClient уже существует концепция делегирования обработчиков, которые можно связать друг с другом для исходящих HTTP-запросов. HttpClient already has the concept of delegating handlers that can be linked together for outgoing HTTP requests. Класс IHttpClientFactory упрощает определение обработчиков для применения к каждому именованному клиенту. The IHttpClientFactory makes it easy to define the handlers to apply for each named client. Он поддерживает регистрацию и объединение в цепочки нескольких обработчиков для создания конвейера ПО промежуточного слоя для исходящих запросов. It supports registration and chaining of multiple handlers to build an outgoing request middleware pipeline. Каждый из этих обработчиков может выполнять работу до и после исходящего запроса. Each of these handlers is able to perform work before and after the outgoing request. Этот шаблон похож на входящий конвейер ПО промежуточного слоя в ASP.NET Core. This pattern is similar to the inbound middleware pipeline in ASP.NET Core. Шаблон предоставляет механизм управления сквозной функциональностью HTTP-запросов, включая кэширование, обработку ошибок, сериализацию и ведение журнала. The pattern provides a mechanism to manage cross-cutting concerns around HTTP requests, including caching, error handling, serialization, and logging.

Чтобы создать обработчик, необходимо определить класс, производный от DelegatingHandler. To create a handler, define a class deriving from DelegatingHandler. Переопределите метод SendAsync для выполнения кода до передачи запросов следующему обработчику в конвейере: Override the SendAsync method to execute code before passing the request to the next handler in the pipeline:

В предыдущем коде определяется базовый обработчик. The preceding code defines a basic handler. Он проверяет, включен ли в запрос заголовок X-API-KEY . It checks to see if an X-API-KEY header has been included on the request. Если заголовок отсутствует, он может избежать вызовов HTTP и вернуть подходящий ответ. If the header is missing, it can avoid the HTTP call and return a suitable response.

Во время регистрации можно добавить один или несколько обработчиков в конфигурацию для HttpClient . During registration, one or more handlers can be added to the configuration for a HttpClient . Эта задача выполняется через методы расширения в IHttpClientBuilder. This task is accomplished via extension methods on the IHttpClientBuilder.

В приведенном выше коде ValidateHeaderHandler регистрируется с помощью внедрения зависимостей. In the preceding code, the ValidateHeaderHandler is registered with DI. IHttpClientFactory создает отдельную область внедрения зависимостей для каждого обработчика. The IHttpClientFactory creates a separate DI scope for each handler. Обработчики могут зависеть от служб из любой области. Handlers are free to depend upon services of any scope. Службы, которые зависят от обработчиков, удаляются при удалении обработчика. Services that handlers depend upon are disposed when the handler is disposed.

После регистрации можно вызвать AddHttpMessageHandler, передав тип обработчика. Once registered, AddHttpMessageHandler can be called, passing in the type for the handler.

Можно зарегистрировать несколько обработчиков в порядке, в котором они должны выполняться. Multiple handlers can be registered in the order that they should execute. Каждый обработчик содержит следующий обработчик, пока последний HttpClientHandler не выполнит запрос: Each handler wraps the next handler until the final HttpClientHandler executes the request:

Используйте один из следующих методов для предоставления общего доступа к состоянию отдельных запросов с помощью обработчиков сообщений: Use one of the following approaches to share per-request state with message handlers:

  • Передайте данные в обработчик с помощью HttpRequestMessage.Properties . Pass data into the handler using HttpRequestMessage.Properties .
  • Используйте IHttpContextAccessor для доступа к текущему запросу. Use IHttpContextAccessor to access the current request.
  • Создайте пользовательский объект хранилища AsyncLocal для передачи данных. Create a custom AsyncLocal storage object to pass the data.

Использование обработчиков на основе Polly Use Polly-based handlers

IHttpClientFactory интегрируется с популярной библиотекой сторонних разработчиков под названием Polly. IHttpClientFactory integrates with a popular third-party library called Polly. Polly — это комплексная библиотека, обеспечивающая отказоустойчивость и обработку временных сбоев в .NET. Polly is a comprehensive resilience and transient fault-handling library for .NET. Она позволяет разработчикам выражать политики, например политику повтора, размыкателя цепи, времени ожидания, изоляции отсеков и отката, более эффективным и потокобезопасным образом. It allows developers to express policies such as Retry, Circuit Breaker, Timeout, Bulkhead Isolation, and Fallback in a fluent and thread-safe manner.

Для использования политик Polly с настроенными экземплярами HttpClient предоставляются методы расширения. Extension methods are provided to enable the use of Polly policies with configured HttpClient instances. Расширения Polly: The Polly extensions:

  • Поддерживает добавление обработчиков на основе Polly клиентам. Support adding Polly-based handlers to clients.
  • Можно использовать после установки пакета NuGet Microsoft.Extensions.Http.Polly. Can be used after installing the Microsoft.Extensions.Http.Polly NuGet package. Пакет не включен в общую платформу ASP.NET Core. The package isn’t included in the ASP.NET Core shared framework.

Обработка временных сбоев Handle transient faults

Чаще всего ошибки происходят, когда внешние вызовы HTTP являются временными. Most common faults occur when external HTTP calls are transient. Используется удобный метод расширения AddTransientHttpErrorPolicy , который позволяет определить политику для обработки временных ошибок. A convenient extension method called AddTransientHttpErrorPolicy is included which allows a policy to be defined to handle transient errors. Политики, заданные с помощью этого метода расширения, обрабатывают HttpRequestException , ответы HTTP 5xx и ответы HTTP 408. Policies configured with this extension method handle HttpRequestException , HTTP 5xx responses, and HTTP 408 responses.

Расширение AddTransientHttpErrorPolicy может быть использовано в Startup.ConfigureServices . The AddTransientHttpErrorPolicy extension can be used within Startup.ConfigureServices . Данное расширение предоставляет доступ к объекту PolicyBuilder , настроенному для обработки ошибок, представляющих возможный временный сбой: The extension provides access to a PolicyBuilder object configured to handle errors representing a possible transient fault:

В приведенном выше коде определена политика WaitAndRetryAsync . In the preceding code, a WaitAndRetryAsync policy is defined. Неудачные запросы повторяются до трех раз с задержкой 600 мс между попытками. Failed requests are retried up to three times with a delay of 600 ms between attempts.

Динамический выбор политик Dynamically select policies

Существуют дополнительные методы расширения, которые можно использовать для добавления обработчиков на основе Polly. Additional extension methods exist which can be used to add Polly-based handlers. Одним из таких расширений является AddPolicyHandler с несколькими перегрузками. One such extension is AddPolicyHandler , which has multiple overloads. Одна перегрузка разрешает проверку запроса для определения необходимой политики: One overload allows the request to be inspected when defining which policy to apply:

Если в приведенном выше коде исходящий запрос является запросом HTTP GET, применяется время ожидания 10 секунд. In the preceding code, if the outgoing request is an HTTP GET, a 10-second timeout is applied. Для остальных методов HTTP время ожидания — 30 секунд. For any other HTTP method, a 30-second timeout is used.

Добавление нескольких обработчиков Polly Add multiple Polly handlers

Общепринятой практикой является вложение политик Polly для предоставления расширенной функциональности: It’s common to nest Polly policies to provide enhanced functionality:

В приведенном выше примере добавляются два обработчика. In the preceding example, two handlers are added. Первый использует расширение AddTransientHttpErrorPolicy , чтобы добавить политику повтора. The first uses the AddTransientHttpErrorPolicy extension to add a retry policy. Неудачные запросы выполняются повторно до трех раз. Failed requests are retried up to three times. Второй вызов к AddTransientHttpErrorPolicy добавляет политику размыкателя цепи. The second call to AddTransientHttpErrorPolicy adds a circuit breaker policy. Дополнительные внешние запросы блокируются в течение 30 секунд в случае пяти неудачных попыток подряд. Further external requests are blocked for 30 seconds if five failed attempts occur sequentially. Политики размыкателя цепи отслеживают состояние. Circuit breaker policies are stateful. Все вызовы через этот клиент имеют одинаковое состояние цепи. All calls through this client share the same circuit state.

Добавление политик из реестра Polly Add policies from the Polly registry

Подход к управлению регулярно используемыми политиками заключается в их однократном определении и регистрации с помощью PolicyRegistry . An approach to managing regularly used policies is to define them once and register them with a PolicyRegistry . Предоставляется метод расширения, разрешающий добавление обработчика с помощью политики из реестра: An extension method is provided which allows a handler to be added using a policy from the registry:

В приведенном выше коде, когда PolicyRegistry добавляется в ServiceCollection , регистрируются две политики. In the preceding code, two policies are registered when the PolicyRegistry is added to the ServiceCollection . Чтобы использовать политику из реестра, применяется метод AddPolicyHandlerFromRegistry , который передает имя необходимой политики. To use a policy from the registry, the AddPolicyHandlerFromRegistry method is used, passing the name of the policy to apply.

Дополнительные сведения об интеграции IHttpClientFactory и Polly см. на вики-сайте Polly. Further information about IHttpClientFactory and Polly integrations can be found on the Polly wiki.

Управление HttpClient и временем существования HttpClient and lifetime management

При каждом вызове CreateClient в IHttpClientFactory возвращается новый экземпляр HttpClient . A new HttpClient instance is returned each time CreateClient is called on the IHttpClientFactory . Для каждого названного клиента существует HttpMessageHandler. There’s an HttpMessageHandler per named client. Фабрика обеспечивает управление временем существования экземпляров HttpMessageHandler . The factory manages the lifetimes of the HttpMessageHandler instances.

IHttpClientFactory объединяет в пул все экземпляры HttpMessageHandler , созданные фабрикой, чтобы уменьшить потребление ресурсов. IHttpClientFactory pools the HttpMessageHandler instances created by the factory to reduce resource consumption. Экземпляр HttpMessageHandler можно использовать повторно из пула при создании экземпляра HttpClient , если его время существования еще не истекло. An HttpMessageHandler instance may be reused from the pool when creating a new HttpClient instance if its lifetime hasn’t expired.

Создавать пулы обработчиков желательно, так как каждый обработчик обычно управляет собственными базовыми HTTP-подключениями. Pooling of handlers is desirable as each handler typically manages its own underlying HTTP connections. Создание лишних обработчиков может привести к задержке подключения. Creating more handlers than necessary can result in connection delays. Некоторые обработчики поддерживают подключения открытыми в течение неопределенного периода, что может помешать обработчику отреагировать на изменения DNS. Some handlers also keep connections open indefinitely, which can prevent the handler from reacting to DNS changes.

Время существования обработчика по умолчанию — две минуты. The default handler lifetime is two minutes. Значение по умолчанию можно переопределить для каждого именованного клиента. The default value can be overridden on a per named client basis. Чтобы переопределить это значение, вызовите SetHandlerLifetime в IHttpClientBuilder , который возвращается при создании клиента: To override it, call SetHandlerLifetime on the IHttpClientBuilder that is returned when creating the client:

Высвобождать клиент не требуется. Disposal of the client isn’t required. Высвобождение отменяет исходящие запросы и гарантирует, что указанный экземпляр HttpClient не может использоваться после вызова Dispose. Disposal cancels outgoing requests and guarantees the given HttpClient instance can’t be used after calling Dispose. IHttpClientFactory отслеживает и высвобождает ресурсы, используемые экземплярами HttpClient . IHttpClientFactory tracks and disposes resources used by HttpClient instances. Экземпляры HttpClient обычно можно рассматривать как объекты .NET, не требующие высвобождения. The HttpClient instances can generally be treated as .NET objects not requiring disposal.

До появления IHttpClientFactory один экземпляр HttpClient часто сохраняли в активном состоянии в течение длительного времени. Keeping a single HttpClient instance alive for a long duration is a common pattern used before the inception of IHttpClientFactory . После перехода на IHttpClientFactory это уже не нужно. This pattern becomes unnecessary after migrating to IHttpClientFactory .

Ведение журнала Logging

Клиенты, созданные через IHttpClientFactory , записывают сообщения журнала для всех запросов. Clients created via IHttpClientFactory record log messages for all requests. Установите соответствующий уровень информации в конфигурации ведения журнала, чтобы просматривать сообщения журнала по умолчанию. Enable the appropriate information level in your logging configuration to see the default log messages. Дополнительное ведение журнала, например запись заголовков запросов, включено только на уровне трассировки. Additional logging, such as the logging of request headers, is only included at trace level.

Категория журнала для каждого клиента включает в себя имя клиента. The log category used for each client includes the name of the client. Клиент с именем MyNamedClient, например, записывает в журнал сообщения с категорией System.Net.Http.HttpClient.MyNamedClient.LogicalHandler . A client named MyNamedClient, for example, logs messages with a category of System.Net.Http.HttpClient.MyNamedClient.LogicalHandler . Сообщения с суффиксом LogicalHandler создаются за пределами конвейера обработчиков запросов. Messages suffixed with LogicalHandler occur outside the request handler pipeline. Во время запроса сообщения записываются в журнал до обработки запроса другими обработчиками в конвейере. On the request, messages are logged before any other handlers in the pipeline have processed it. Во время ответа сообщения записываются в журнал после получения ответа другими обработчиками в конвейере. On the response, messages are logged after any other pipeline handlers have received the response.

Кроме того, журнал ведется в конвейере обработчиков запросов. Logging also occurs inside the request handler pipeline. В примере MyNamedClient эти сообщения вносятся в журнал по категории журнала System.Net.Http.HttpClient.MyNamedClient.ClientHandler . In the MyNamedClient example, those messages are logged against the log category System.Net.Http.HttpClient.MyNamedClient.ClientHandler . Во время запроса это происходит после выполнения всех обработчиков и непосредственно перед отправкой запроса по сети. For the request, this occurs after all other handlers have run and immediately before the request is sent out on the network. Во время ответа в журнале записывается состояние ответа перед его передачей обратно по конвейеру обработчиков. On the response, this logging includes the state of the response before it passes back through the handler pipeline.

Включив ведение журнала в конвейере и за его пределами, можно выполнять проверку изменений, внесенных другими обработчиками конвейера. Enabling logging outside and inside the pipeline enables inspection of the changes made by the other pipeline handlers. Сюда входят, например, изменения заголовков запросов или кода состояния ответов. This may include changes to request headers, for example, or to the response status code.

Включение имени клиента в категорию журнала позволяет фильтровать журналы по именованным клиентам при необходимости. Including the name of the client in the log category enables log filtering for specific named clients where necessary.

Настройка HttpMessageHandler Configure the HttpMessageHandler

Иногда необходимо контролировать конфигурацию внутреннего обработчика HttpMessageHandler , используемого клиентом. It may be necessary to control the configuration of the inner HttpMessageHandler used by a client.

При добавлении именованного или типизированного клиента возвращается IHttpClientBuilder . An IHttpClientBuilder is returned when adding named or typed clients. Для определения делегата можно использовать метод расширения ConfigurePrimaryHttpMessageHandler. The ConfigurePrimaryHttpMessageHandler extension method can be used to define a delegate. Делегат используется для создания и настройки основного обработчика HttpMessageHandler , используемого этим клиентом: The delegate is used to create and configure the primary HttpMessageHandler used by that client:

Использование IHttpClientFactory в консольном приложении Use IHttpClientFactory in a console app

В консольном приложении добавьте в проект следующие ссылки на пакеты: In a console app, add the following package references to the project:

В следующем примере: In the following example:

  • IHttpClientFactory регистрируется в контейнере службы универсального узла: IHttpClientFactory is registered in the Generic Host’s service container.
  • MyService создает экземпляр фабрики клиента из службы, который используется для создания HttpClient . MyService creates a client factory instance from the service, which is used to create an HttpClient . HttpClient используется для получения веб-страницы. HttpClient is used to retrieve a webpage.
  • Main создает область для выполнения метода GetPage службы и вывода первых 500 символов содержимого веб-страницы на консоль. Main creates a scope to execute the service’s GetPage method and write the first 500 characters of the webpage content to the console.

Дополнительные ресурсы Additional resources

IHttpClientFactory можно зарегистрировать и использовать для настройки и создания экземпляров HttpClient в приложении. An IHttpClientFactory can be registered and used to configure and create HttpClient instances in an app. Так вы получите следующие преимущества: It offers the following benefits:

  • Центральное расположение для именования и настройки логических экземпляров HttpClient . Provides a central location for naming and configuring logical HttpClient instances. Например, можно зарегистрировать и настроить клиент github для доступа к GitHub. For example, a github client can be registered and configured to access GitHub. Можно зарегистрировать клиент по умолчанию для других целей. A default client can be registered for other purposes.
  • Кодификация концепции исходящего ПО промежуточного слоя путем делегирования обработчиков в HttpClient и предоставление расширений для ПО промежуточного слоя на основе Polly для использования этой возможности. Codifies the concept of outgoing middleware via delegating handlers in HttpClient and provides extensions for Polly-based middleware to take advantage of that.
  • Управление созданием пулов и временем существования базовых экземпляров HttpClientMessageHandler с целью избежать обычных проблем с DNS, которые возникают при управлении временем существования HttpClient вручную. Manages the pooling and lifetime of underlying HttpClientMessageHandler instances to avoid common DNS problems that occur when manually managing HttpClient lifetimes.
  • Настройка параметров ведения журнала (через ILogger ) для всех запросов, отправленных через клиентов, созданных фабрикой. Adds a configurable logging experience (via ILogger ) for all requests sent through clients created by the factory.


Предварительные требования Prerequisites

Для проектов, предназначенных для .NET Framework, необходимо установить пакет NuGet Microsoft.Extensions.Http. Projects targeting .NET Framework require installation of the Microsoft.Extensions.Http NuGet package. Пакет Microsoft.Extensions.Http уже включен в проекты, предназначенные для .NET Core и ссылающиеся на метапакет Microsoft.AspNetCore.App. Projects that target .NET Core and reference the Microsoft.AspNetCore.App metapackage already include the Microsoft.Extensions.Http package.

Принципы использования Consumption patterns

Существует несколько способов использования IHttpClientFactory в приложении: There are several ways IHttpClientFactory can be used in an app:

Все способы равноценны. None of them are strictly superior to another. Оптимальный подход зависит от ограничений приложения. The best approach depends upon the app’s constraints.

Основное использование Basic usage

IHttpClientFactory можно зарегистрировать путем вызова метода расширения AddHttpClient в IServiceCollection внутри метода Startup.ConfigureServices . The IHttpClientFactory can be registered by calling the AddHttpClient extension method on the IServiceCollection , inside the Startup.ConfigureServices method.

После регистрации код может принимать IHttpClientFactory в любом месте, куда можно внедрить службу с помощью внедрения зависимостей (DI). Once registered, code can accept an IHttpClientFactory anywhere services can be injected with dependency injection (DI). IHttpClientFactory можно использовать для создания экземпляра HttpClient : The IHttpClientFactory can be used to create a HttpClient instance:

Подобное использование IHttpClientFactory — это отличный способ рефакторинга имеющегося приложения. Using IHttpClientFactory in this fashion is a good way to refactor an existing app. Он не оказывает влияния на использование HttpClient . It has no impact on the way HttpClient is used. Там, где в данный момент создаются экземпляры HttpClient , используйте вызов к CreateClient. In places where HttpClient instances are currently created, replace those occurrences with a call to CreateClient.

Именованные клиенты Named clients

Если для приложения предполагаются разные способы использования HttpClient , каждый со своей конфигурацией, можно применять именованные клиенты. If an app requires many distinct uses of HttpClient , each with a different configuration, an option is to use named clients. Конфигурацию для именованного клиента HttpClient можно указать во время регистрации в Startup.ConfigureServices . Configuration for a named HttpClient can be specified during registration in Startup.ConfigureServices .

В приведенном выше коде вызывается клиент AddHttpClient , предоставляющий имя github. In the preceding code, AddHttpClient is called, providing the name github. У клиента есть некоторые настройки по умолчанию — а именно: базовый адрес и два заголовка, необходимые для работы с API GitHub. This client has some default configuration applied—namely the base address and two headers required to work with the GitHub API.

При каждом вызове CreateClient создается новый экземпляр HttpClient и вызывается действие конфигурации. Each time CreateClient is called, a new instance of HttpClient is created and the configuration action is called.

Для использования именованного клиента можно передать строковый параметр в CreateClient . To consume a named client, a string parameter can be passed to CreateClient . Укажите имя создаваемого клиента: Specify the name of the client to be created:

В приведенном выше коде в запросе не требуется указывать имя узла. In the preceding code, the request doesn’t need to specify a hostname. Достаточно передать только путь, так как используется базовый адрес, заданный для клиента. It can pass just the path, since the base address configured for the client is used.

Типизированные клиенты Typed clients

Типизированные клиенты: Typed clients:

  • предоставляют те же возможности, что и именованные клиенты, без необходимости использовать строки в качестве ключей. Provide the same capabilities as named clients without the need to use strings as keys.
  • Это помогает IntelliSense и компилятору при использовании клиентов. Provides IntelliSense and compiler help when consuming clients.
  • Они предоставляют единое расположение для настройки и взаимодействия с конкретным клиентом HttpClient . Provide a single location to configure and interact with a particular HttpClient . Например, для конечной точки серверной части можно использовать один типизированный клиент, который будет содержать всю логику работы с этой конечной точкой. For example, a single typed client might be used for a single backend endpoint and encapsulate all logic dealing with that endpoint.
  • Поддерживаются работа с внедрением зависимостей и возможность вставки в нужное место в приложении. Work with DI and can be injected where required in your app.

Типизированный клиент принимает параметр HttpClient в конструкторе: A typed client accepts a HttpClient parameter in its constructor:

В приведенном выше коде конфигурация перемещается в типизированный клиент. In the preceding code, the configuration is moved into the typed client. Объект HttpClient предоставляется в виде открытого свойства. The HttpClient object is exposed as a public property. Можно определить связанные с API методы, которые предоставляют функциональные возможности HttpClient . It’s possible to define API-specific methods that expose HttpClient functionality. Метод GetAspNetDocsIssues инкапсулирует код, необходимый для запроса и анализа последнего открытого выпуска из репозитория GitHub. The GetAspNetDocsIssues method encapsulates the code needed to query for and parse out the latest open issues from a GitHub repository.

Для регистрации типизированного клиента можно использовать универсальный метод расширения AddHttpClient в Startup.ConfigureServices , указав класс типизированного клиента: To register a typed client, the generic AddHttpClient extension method can be used within Startup.ConfigureServices , specifying the typed client class:

Типизированный клиент регистрируется во внедрении зависимостей как временный. The typed client is registered as transient with DI. Типизированный клиент можно внедрить и использовать напрямую: The typed client can be injected and consumed directly:

При желании конфигурацию для типизированного клиента можно указать во время регистрации в Startup.ConfigureServices , а не в конструкторе типизированного клиента: If preferred, the configuration for a typed client can be specified during registration in Startup.ConfigureServices , rather than in the typed client’s constructor:

Можно полностью инкапсулировать HttpClient внутри типизированного клиента. It’s possible to entirely encapsulate the HttpClient within a typed client. Вместо предоставления его как свойства можно использовать открытые методы для внутреннего вызова экземпляра HttpClient . Rather than exposing it as a property, public methods can be provided which call the HttpClient instance internally.

В приведенном выше коде HttpClient хранится как закрытое поле. In the preceding code, the HttpClient is stored as a private field. Любой доступ для совершения внешних вызовов осуществляется через метод GetRepos . All access to make external calls goes through the GetRepos method.

Созданные клиенты Generated clients

IHttpClientFactory можно использовать в сочетании с другими библиотеками сторонних разработчиков, например Refit. IHttpClientFactory can be used in combination with other third-party libraries such as Refit. Refit — это библиотека REST для .NET. Refit is a REST library for .NET. Она преобразует REST API в динамические интерфейсы. It converts REST APIs into live interfaces. Реализация интерфейса формируется динамически с помощью RestService с использованием HttpClient для совершения внешних вызовов HTTP. An implementation of the interface is generated dynamically by the RestService , using HttpClient to make the external HTTP calls.

Для представления внешнего API и его ответа определяются интерфейс и ответ: An interface and a reply are defined to represent the external API and its response:

Можно добавить типизированный клиент, используя Refit для создания реализации: A typed client can be added, using Refit to generate the implementation:

При необходимости можно использовать определенный интерфейс с реализацией, предоставленной внедрением зависимостей и Refit: The defined interface can be consumed where necessary, with the implementation provided by DI and Refit:

ПО промежуточного слоя для исходящих запросов Outgoing request middleware

В HttpClient уже существует концепция делегирования обработчиков, которые можно связать друг с другом для исходящих HTTP-запросов. HttpClient already has the concept of delegating handlers that can be linked together for outgoing HTTP requests. Класс IHttpClientFactory упрощает определение обработчиков для применения к каждому именованному клиенту. The IHttpClientFactory makes it easy to define the handlers to apply for each named client. Он поддерживает регистрацию и объединение в цепочки нескольких обработчиков для создания конвейера ПО промежуточного слоя для исходящих запросов. It supports registration and chaining of multiple handlers to build an outgoing request middleware pipeline. Каждый из этих обработчиков может выполнять работу до и после исходящего запроса. Each of these handlers is able to perform work before and after the outgoing request. Этот шаблон похож на входящий конвейер ПО промежуточного слоя в ASP.NET Core. This pattern is similar to the inbound middleware pipeline in ASP.NET Core. Шаблон предоставляет механизм управления сквозной функциональностью HTTP-запросов, включая кэширование, обработку ошибок, сериализацию и ведение журнала. The pattern provides a mechanism to manage cross-cutting concerns around HTTP requests, including caching, error handling, serialization, and logging.

Чтобы создать обработчик, необходимо определить класс, производный от DelegatingHandler. To create a handler, define a class deriving from DelegatingHandler. Переопределите метод SendAsync для выполнения кода до передачи запросов следующему обработчику в конвейере: Override the SendAsync method to execute code before passing the request to the next handler in the pipeline:

В предыдущем коде определяется базовый обработчик. The preceding code defines a basic handler. Он проверяет, включен ли в запрос заголовок X-API-KEY . It checks to see if an X-API-KEY header has been included on the request. Если заголовок отсутствует, он может избежать вызовов HTTP и вернуть подходящий ответ. If the header is missing, it can avoid the HTTP call and return a suitable response.

Во время регистрации можно добавить один или несколько обработчиков в конфигурацию для HttpClient . During registration, one or more handlers can be added to the configuration for a HttpClient . Эта задача выполняется через методы расширения в IHttpClientBuilder. This task is accomplished via extension methods on the IHttpClientBuilder.

В приведенном выше коде ValidateHeaderHandler регистрируется с помощью внедрения зависимостей. In the preceding code, the ValidateHeaderHandler is registered with DI. Обработчик должен регистрироваться во внедрении зависимостей как временная служба, а не ограниченная. The handler must be registered in DI as a transient service, never scoped. Если обработчик зарегистрирован в качестве службы с областью действия и все службы, от которых зависит этот обработчик, освобождаются: If the handler is registered as a scoped service and any services that the handler depends upon are disposable:

  • Службы обработчика могли быть удалены, прежде чем обработчик вышел из области действия. The handler’s services could be disposed before the handler goes out of scope.
  • Освобожденные службы обработчика приводят к его сбою. The disposed handler services causes the handler to fail.

После регистрации можно вызвать AddHttpMessageHandler, передав тип обработчика. Once registered, AddHttpMessageHandler can be called, passing in the handler type.

Можно зарегистрировать несколько обработчиков в порядке, в котором они должны выполняться. Multiple handlers can be registered in the order that they should execute. Каждый обработчик содержит следующий обработчик, пока последний HttpClientHandler не выполнит запрос: Each handler wraps the next handler until the final HttpClientHandler executes the request:

Используйте один из следующих методов для предоставления общего доступа к состоянию отдельных запросов с помощью обработчиков сообщений: Use one of the following approaches to share per-request state with message handlers:

  • Передайте данные в обработчик с помощью HttpRequestMessage.Properties . Pass data into the handler using HttpRequestMessage.Properties .
  • Используйте IHttpContextAccessor для доступа к текущему запросу. Use IHttpContextAccessor to access the current request.
  • Создайте пользовательский объект хранилища AsyncLocal для передачи данных. Create a custom AsyncLocal storage object to pass the data.

Использование обработчиков на основе Polly Use Polly-based handlers

IHttpClientFactory интегрируется с популярной библиотекой сторонних разработчиков под названием Polly. IHttpClientFactory integrates with a popular third-party library called Polly. Polly — это комплексная библиотека, обеспечивающая отказоустойчивость и обработку временных сбоев в .NET. Polly is a comprehensive resilience and transient fault-handling library for .NET. Она позволяет разработчикам выражать политики, например политику повтора, размыкателя цепи, времени ожидания, изоляции отсеков и отката, более эффективным и потокобезопасным образом. It allows developers to express policies such as Retry, Circuit Breaker, Timeout, Bulkhead Isolation, and Fallback in a fluent and thread-safe manner.

Для использования политик Polly с настроенными экземплярами HttpClient предоставляются методы расширения. Extension methods are provided to enable the use of Polly policies with configured HttpClient instances. Расширения Polly: The Polly extensions:

  • Поддерживает добавление обработчиков на основе Polly клиентам. Support adding Polly-based handlers to clients.
  • Можно использовать после установки пакета NuGet Microsoft.Extensions.Http.Polly. Can be used after installing the Microsoft.Extensions.Http.Polly NuGet package. Пакет не включен в общую платформу ASP.NET Core. The package isn’t included in the ASP.NET Core shared framework.

Обработка временных сбоев Handle transient faults

Чаще всего ошибки происходят, когда внешние вызовы HTTP являются временными. Most common faults occur when external HTTP calls are transient. Используется удобный метод расширения AddTransientHttpErrorPolicy , который позволяет определить политику для обработки временных ошибок. A convenient extension method called AddTransientHttpErrorPolicy is included which allows a policy to be defined to handle transient errors. Политики, заданные с помощью этого метода расширения, обрабатывают HttpRequestException , ответы HTTP 5xx и ответы HTTP 408. Policies configured with this extension method handle HttpRequestException , HTTP 5xx responses, and HTTP 408 responses.

Расширение AddTransientHttpErrorPolicy может быть использовано в Startup.ConfigureServices . The AddTransientHttpErrorPolicy extension can be used within Startup.ConfigureServices . Данное расширение предоставляет доступ к объекту PolicyBuilder , настроенному для обработки ошибок, представляющих возможный временный сбой: The extension provides access to a PolicyBuilder object configured to handle errors representing a possible transient fault:

В приведенном выше коде определена политика WaitAndRetryAsync . In the preceding code, a WaitAndRetryAsync policy is defined. Неудачные запросы повторяются до трех раз с задержкой 600 мс между попытками. Failed requests are retried up to three times with a delay of 600 ms between attempts.

Динамический выбор политик Dynamically select policies

Существуют дополнительные методы расширения, которые можно использовать для добавления обработчиков на основе Polly. Additional extension methods exist which can be used to add Polly-based handlers. Одним из таких расширений является AddPolicyHandler с несколькими перегрузками. One such extension is AddPolicyHandler , which has multiple overloads. Одна перегрузка разрешает проверку запроса для определения необходимой политики: One overload allows the request to be inspected when defining which policy to apply:

Если в приведенном выше коде исходящий запрос является запросом HTTP GET, применяется время ожидания 10 секунд. In the preceding code, if the outgoing request is an HTTP GET, a 10-second timeout is applied. Для остальных методов HTTP время ожидания — 30 секунд. For any other HTTP method, a 30-second timeout is used.

Добавление нескольких обработчиков Polly Add multiple Polly handlers

Общепринятой практикой является вложение политик Polly для предоставления расширенной функциональности: It’s common to nest Polly policies to provide enhanced functionality:

В приведенном выше примере добавляются два обработчика. In the preceding example, two handlers are added. Первый использует расширение AddTransientHttpErrorPolicy , чтобы добавить политику повтора. The first uses the AddTransientHttpErrorPolicy extension to add a retry policy. Неудачные запросы выполняются повторно до трех раз. Failed requests are retried up to three times. Второй вызов к AddTransientHttpErrorPolicy добавляет политику размыкателя цепи. The second call to AddTransientHttpErrorPolicy adds a circuit breaker policy. Дополнительные внешние запросы блокируются в течение 30 секунд в случае пяти неудачных попыток подряд. Further external requests are blocked for 30 seconds if five failed attempts occur sequentially. Политики размыкателя цепи отслеживают состояние. Circuit breaker policies are stateful. Все вызовы через этот клиент имеют одинаковое состояние цепи. All calls through this client share the same circuit state.

Добавление политик из реестра Polly Add policies from the Polly registry

Подход к управлению регулярно используемыми политиками заключается в их однократном определении и регистрации с помощью PolicyRegistry . An approach to managing regularly used policies is to define them once and register them with a PolicyRegistry . Предоставляется метод расширения, разрешающий добавление обработчика с помощью политики из реестра: An extension method is provided which allows a handler to be added using a policy from the registry:

В приведенном выше коде, когда PolicyRegistry добавляется в ServiceCollection , регистрируются две политики. In the preceding code, two policies are registered when the PolicyRegistry is added to the ServiceCollection . Чтобы использовать политику из реестра, применяется метод AddPolicyHandlerFromRegistry , который передает имя необходимой политики. To use a policy from the registry, the AddPolicyHandlerFromRegistry method is used, passing the name of the policy to apply.

Дополнительные сведения об интеграции IHttpClientFactory и Polly см. на вики-сайте Polly. Further information about IHttpClientFactory and Polly integrations can be found on the Polly wiki.

Управление HttpClient и временем существования HttpClient and lifetime management

При каждом вызове CreateClient в IHttpClientFactory возвращается новый экземпляр HttpClient . A new HttpClient instance is returned each time CreateClient is called on the IHttpClientFactory . Для каждого названного клиента существует HttpMessageHandler. There’s an HttpMessageHandler per named client. Фабрика обеспечивает управление временем существования экземпляров HttpMessageHandler . The factory manages the lifetimes of the HttpMessageHandler instances.

IHttpClientFactory объединяет в пул все экземпляры HttpMessageHandler , созданные фабрикой, чтобы уменьшить потребление ресурсов. IHttpClientFactory pools the HttpMessageHandler instances created by the factory to reduce resource consumption. Экземпляр HttpMessageHandler можно использовать повторно из пула при создании экземпляра HttpClient , если его время существования еще не истекло. An HttpMessageHandler instance may be reused from the pool when creating a new HttpClient instance if its lifetime hasn’t expired.

Создавать пулы обработчиков желательно, так как каждый обработчик обычно управляет собственными базовыми HTTP-подключениями. Pooling of handlers is desirable as each handler typically manages its own underlying HTTP connections. Создание лишних обработчиков может привести к задержке подключения. Creating more handlers than necessary can result in connection delays. Некоторые обработчики поддерживают подключения открытыми в течение неопределенного периода, что может помешать обработчику отреагировать на изменения DNS. Some handlers also keep connections open indefinitely, which can prevent the handler from reacting to DNS changes.

Время существования обработчика по умолчанию — две минуты. The default handler lifetime is two minutes. Значение по умолчанию можно переопределить для каждого именованного клиента. The default value can be overridden on a per named client basis. Чтобы переопределить это значение, вызовите SetHandlerLifetime в IHttpClientBuilder , который возвращается при создании клиента: To override it, call SetHandlerLifetime on the IHttpClientBuilder that is returned when creating the client:

Высвобождать клиент не требуется. Disposal of the client isn’t required. Высвобождение отменяет исходящие запросы и гарантирует, что указанный экземпляр HttpClient не может использоваться после вызова Dispose. Disposal cancels outgoing requests and guarantees the given HttpClient instance can’t be used after calling Dispose. IHttpClientFactory отслеживает и высвобождает ресурсы, используемые экземплярами HttpClient . IHttpClientFactory tracks and disposes resources used by HttpClient instances. Экземпляры HttpClient обычно можно рассматривать как объекты .NET, не требующие высвобождения. The HttpClient instances can generally be treated as .NET objects not requiring disposal.

До появления IHttpClientFactory один экземпляр HttpClient часто сохраняли в активном состоянии в течение длительного времени. Keeping a single HttpClient instance alive for a long duration is a common pattern used before the inception of IHttpClientFactory . После перехода на IHttpClientFactory это уже не нужно. This pattern becomes unnecessary after migrating to IHttpClientFactory .

Ведение журнала Logging

Клиенты, созданные через IHttpClientFactory , записывают сообщения журнала для всех запросов. Clients created via IHttpClientFactory record log messages for all requests. Установите соответствующий уровень информации в конфигурации ведения журнала, чтобы просматривать сообщения журнала по умолчанию. Enable the appropriate information level in your logging configuration to see the default log messages. Дополнительное ведение журнала, например запись заголовков запросов, включено только на уровне трассировки. Additional logging, such as the logging of request headers, is only included at trace level.

Категория журнала для каждого клиента включает в себя имя клиента. The log category used for each client includes the name of the client. Клиент с именем MyNamedClient, например, записывает в журнал сообщения с категорией System.Net.Http.HttpClient.MyNamedClient.LogicalHandler . A client named MyNamedClient, for example, logs messages with a category of System.Net.Http.HttpClient.MyNamedClient.LogicalHandler . Сообщения с суффиксом LogicalHandler создаются за пределами конвейера обработчиков запросов. Messages suffixed with LogicalHandler occur outside the request handler pipeline. Во время запроса сообщения записываются в журнал до обработки запроса другими обработчиками в конвейере. On the request, messages are logged before any other handlers in the pipeline have processed it. Во время ответа сообщения записываются в журнал после получения ответа другими обработчиками в конвейере. On the response, messages are logged after any other pipeline handlers have received the response.

Кроме того, журнал ведется в конвейере обработчиков запросов. Logging also occurs inside the request handler pipeline. В примере MyNamedClient эти сообщения вносятся в журнал по категории журнала System.Net.Http.HttpClient.MyNamedClient.ClientHandler . In the MyNamedClient example, those messages are logged against the log category System.Net.Http.HttpClient.MyNamedClient.ClientHandler . Во время запроса это происходит после выполнения всех обработчиков и непосредственно перед отправкой запроса по сети. For the request, this occurs after all other handlers have run and immediately before the request is sent out on the network. Во время ответа в журнале записывается состояние ответа перед его передачей обратно по конвейеру обработчиков. On the response, this logging includes the state of the response before it passes back through the handler pipeline.

Включив ведение журнала в конвейере и за его пределами, можно выполнять проверку изменений, внесенных другими обработчиками конвейера. Enabling logging outside and inside the pipeline enables inspection of the changes made by the other pipeline handlers. Сюда входят, например, изменения заголовков запросов или кода состояния ответов. This may include changes to request headers, for example, or to the response status code.

Включение имени клиента в категорию журнала позволяет фильтровать журналы по именованным клиентам при необходимости. Including the name of the client in the log category enables log filtering for specific named clients where necessary.

Настройка HttpMessageHandler Configure the HttpMessageHandler

Иногда необходимо контролировать конфигурацию внутреннего обработчика HttpMessageHandler , используемого клиентом. It may be necessary to control the configuration of the inner HttpMessageHandler used by a client.

При добавлении именованного или типизированного клиента возвращается IHttpClientBuilder . An IHttpClientBuilder is returned when adding named or typed clients. Для определения делегата можно использовать метод расширения ConfigurePrimaryHttpMessageHandler. The ConfigurePrimaryHttpMessageHandler extension method can be used to define a delegate. Делегат используется для создания и настройки основного обработчика HttpMessageHandler , используемого этим клиентом: The delegate is used to create and configure the primary HttpMessageHandler used by that client:

Использование IHttpClientFactory в консольном приложении Use IHttpClientFactory in a console app

В консольном приложении добавьте в проект следующие ссылки на пакеты: In a console app, add the following package references to the project:

В следующем примере: In the following example:

  • IHttpClientFactory регистрируется в контейнере службы универсального узла: IHttpClientFactory is registered in the Generic Host’s service container.
  • MyService создает экземпляр фабрики клиента из службы, который используется для создания HttpClient . MyService creates a client factory instance from the service, which is used to create an HttpClient . HttpClient используется для получения веб-страницы. HttpClient is used to retrieve a webpage.
  • Main создает область для выполнения метода GetPage службы и вывода первых 500 символов содержимого веб-страницы на консоль. Main creates a scope to execute the service’s GetPage method and write the first 500 characters of the webpage content to the console.

Одностраничные приложения: создание современных адаптивных веб-приложений с помощью ASP.NET

Продукты и технологии:

Single-Page Applications (SPA), ASP.NET Web API, Knockout.js, Ember.js, AJAX и HTML5

В статье рассматриваются:

  • создание уровня сервисов и веб-клиента AJAX для приложения-примера;
  • шаблоны MVC и MVVM;
  • связывание с данными;
  • создание веб-клиента с применением Knockout.js;
  • создание веб-клиента с применением Ember.js.


Одностраничные приложения (Single-Page Applications, SPA) — это веб-приложения, которые загружают одну HTML-страницу и динамически обновляют ее при взаимодействии с пользователем.

SPA используют AJAX и HTML5 для создания гибких и адаптивных веб-приложений без постоянных перезагрузок страницы. Однако это означает, что большая часть работы возлагается на клиентскую сторону, а именно на JavaScript-код. Разработчику для традиционной ASP.NET может быть трудно совершить такой кульбит. К счастью, существует множество JavaScript-инфраструктур с открытым исходным кодом, которые облегчают создание SPA.

В этой статье я пошагово пройду процесс создания простого SPA-приложения. Попутно вы ознакомитесь с некоторыми фундаментальными концепциями создания SPA, в том числе с шаблонами Model-View-Controller (MVC) и Model-View-ViewModel (MVVM), связыванием с данными и маршрутизацией (routing).

О приложении-примере

Я создал приложение-пример для операций с простой базой данных по фильмам (рис. 1). В крайнем слева столбце страницы отображается список жанров. Выбор жанра приводит к появлению списка соответствующих фильмов. Кнопка Edit рядом с записью позволяет изменять эту запись. После редактирования можно щелкнуть кнопку Save для передачи обновления на сервер или кнопку Cancel для отмены изменений.

Рис. 1. SPA-приложение для базы данных по фильмам

Я создал две версии этого приложения: одна из них использует библиотеку Knockout.js, а другая — библиотеку Ember.js. Эти две библиотеки основаны на разных подходах, поэтому будет весьма поучительно сравнить их. В обоих случаях клиентское приложение не требовало более 150 строк JavaScript-кода. На серверной стороне я задействовал ASP.NET Web API, чтобы обслуживать JSON для клиента. Исходный код обеих версий вы найдете на github.com/MikeWasson/MoviesSPA.

(Примечание Я создавал приложение, используя RC-версию Visual Studio 2013. В RTM-версии некоторые вещи могли измениться, но они не должны повлиять на код.)

Обзор

В традиционном веб-приложении при каждом вызове сервера тот осуществляет рендеринг новой HTML-страницы. Это вызывает обновление страницы в браузере. Если вы когда-нибудь писали приложение Web Forms или PHP, этот жизненный цикл страниц должен быть знаком вам.

В SPA после загрузки первой страницы все взаимодействие с сервером происходит через AJAX-вызовы. Эти AJAX-вызовы возвращают данные (не разметку) — обычно в формате JSON. Приложение использует JSON-данные для динамического обновления страницы без ее перезагрузки. Рис. 2 иллюстрирует разницу между этими двумя подходами.

Рис. 2. Сравнение традиционного жизненного цикла страницы с жизненным циклом в SPA

Traditional Page Lifecycle Традиционный жизненный цикл страницы
Client Клиент
Page Reload Перезагрузка страницы
Server Сервер
Initial Request Начальный запрос
HTML HTML
Form POST Передача формы командой POST
SPA Lifecycle Жизненный цикл в SPA
AJAX AJAX
JSON JSON

Одно из преимуществ SPA очевидно: приложения более гибкие и адаптивные, свободные от рваного эффекта перезагрузки страницы и ее рендеринга заново. Другое преимущество может оказаться менее очевидным и касается того, как вы проектируете архитектуру веб-приложения. Отправка данных приложения как JSON обеспечивает разделение между презентационной частью (HTML-разметкой) и прикладной логикой (AJAX-запросы плюс JSON-ответы).

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

В чистом SPA все UI-взаимодействие происходит на клиентской стороне через JavaScript и CSS. После начальной загрузки страницы сервер действует исключительно как уровень сервисов. Клиенту нужно просто знать, какие HTTP-запросы он должен посылать. Ему не важно, как сервер реализует свою часть.

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

Создание проекта в Visual Studio

В Visual Studio 2013 есть один тип проекта ASP.NET Web Application. Мастер этого проекта позволяет выбрать ASP.NET-компоненты, которые будут включены в проект. Я начал с шаблона Empty, а затем добавил в проект ASP.NET Web API, установив флажок Web API в разделе Add folders and core references for, как показано на рис. 3.

Рис. 3. Создание нового ASP.NET-проекта в Visual Studio 2013

В новом проекте есть все библиотеки, необходимые для Web API, а также кое-какой конфигурационный код Web API. Я не вводил никаких зависимостей от Web Forms или ASP.NET MVC.

Обратите внимание на рис. 3, что Visual Studio 2013 включает шаблон Single Page Application. Этот шаблон устанавливает скелет SPA-приложения, основанный на Knockout.js. Он поддерживает вход с применением базы данных с информацией о членстве в группах или с помощью внешнего провайдера аутентификации. Я не стал использовать этот шаблон в своем приложении, потому что хотел показать более простой пример с нуля. Шаблон SPA — отличный ресурс, особенно если вам нужно добавить аутентификацию в приложение.

Создание уровня сервисов

Я использовал ASP.NET Web API, чтобы создать простой REST API для приложения. Не буду здесь вдаваться в детали Web API — подробности вы можете прочитать по ссылке asp.net/web-api.

Сначала я создал класс Movie, представляющий фильм. Этот класс делает две вещи:

  • сообщает Entity Framework (EF), как создавать таблицы базы данных для хранения информации о фильмах;
  • сообщает Web API, как форматировать полезные данные JSON.

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

Затем я воспользовался технологией scaffolding в Visual Studio для создания контроллера Web API, который задействует EF в качестве уровня данных. Чтобы применить эту технологию, щелкните правой кнопкой мыши папку Controllers в Solution Explorer и выберите Add | New Scaffolded Item. В мастере Add Scaffold укажите Web API 2 Controller with actions, using Entity Framework, как показано на рис. 4.

Рис. 4. Добавление контроллера Web API

На рис. 5 приведен мастер Add Controller. Я присвоил контроллеру имя MoviesController. Имя имеет значение, так как URI для REST API основываются на имени контроллера. Я также установил флажок Use async controller actions, чтобы задействовать преимущества новой функциональности async в EF 6. Я выбрал класс Movie в качестве модели и указал New data context, чтобы создать новый контекст данных EF.

Рис. 5. Мастер Add Controller

Мастер добавляет два файла:

  • MoviesController.cs — определяет контроллер Web API, который реализует REST API для приложения;
  • MovieSPAContext.cs — это в основном склеивающий слой EF, который предоставляет методы для запроса нижележащей базы данных.

В табл. 1 показан REST API по умолчанию, создаваемый технологией scaffolding.

Табл. 1. REST API по умолчанию, созданный технологией scaffolding из Web API

HTTP-команда URI Описание
GET /api/movies Получить список всех фильмов
GET /api/movies/ Получить фильм с идентификатором, равным
PUT /api/movies/ Обновить фильм с идентификатором, равным
POST /api/movies Добавить новый фильм в базу данных
DELETE /api/movies/ Удалить фильм из базы данных

Значения в фигурных скобках являются заменителями для подстановки. Например, чтобы получить фильм с идентификатором, равным 5, URI должен выглядеть так: /api/movies/5.

Я расширил этот API, добавив метод, который находит все фильмы указанного жанра:

Клиент указывает жанр в строке запроса URI. Например, чтобы получить все фильмы жанра Drama, клиент посылает GET-запрос на /api/movies?genre=drama. Web API автоматически связывает параметр запроса с параметром genre в методе GetMoviesByGenre.

Создание веб-клиента

До сих пор я просто создавал REST API. Если вы отправите GET-запрос на /api/movies?genre=drama, исходный HTTP-ответ будет выглядеть так:

Теперь мне нужно написать клиентское приложение, которое делает с этим что-то осмысленное. Базовый рабочий процесс такой:

  • UI инициирует AJAX-запрос;
  • обновляем HTML для отображения полезных данных ответа;
  • обрабатываем AJAX-ошибки.

Вы могли закодировать все это вручную. Например, вот некоторый jQuery-код, который создает список названий фильмов:

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

Решение заключается в том, чтобы использовать JavaScript-инфраструктуру. К счастью, их выбор довольно велик, и эти инфраструктуры имеют открытый исходный код. К некоторым из более популярных инфраструктур относятся Backbone, Angular, Ember, Knockout, Dojo и JavaScriptMVC. Большинство использует вариации шаблонов MVC или MVVM, поэтому будет полезно вкратце рассмотреть эти шаблоны.

Шаблоны MVC и MVVM

Корни шаблона MVC уходят в 80-е годы прошлого века и связаны с ранними графическими UI. Цель MVC — разбиение кода на три уровня со своими обязанностями (рис. 6). Вот что они делают:

  • модель представляет данные и бизнес-логику предметной области;
  • представление отображает модель;
  • контроллер принимает пользовательский ввод и обновляет модель.

Рис. 6. Шаблон MVC

View View
Controller Controller
Model Model
User Input Пользовательский ввод
Updates Обновления
Modifies Модифицирует

Более современная вариация MVC — шаблон MVVM (рис. 7). В шаблоне MVVM:

  • модель по-прежнему представляет данные предметной области;
  • модель представления — это абстрактное отражение представления;
  • представление отображает модель представления и посылает пользовательский ввод модели представления.

Рис. 7. Шаблон MVVM

View Model View Model

В JavaScript-инфраструктуре MVVM представлением является разметка, а моделью представления — код.

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

Создание веб-клиента с применением Knockout.js

Для первой версии своего приложения я использовал библиотеку Knockout.js. Knockout следует шаблону MVVM, соединяя представление и модель представления через связывание с данными.

Чтобы создать привязки данных, вы добавляете к HTML-элементам специальный атрибут data-binding. Например, следующая разметка связывает элемент span со свойством genre в модели представления. Всякий раз, когда изменяется значение genre, Knockout автоматически обновляет HTML:

Привязки также могут работать в другом направлении, скажем, если пользователь вводит текст в поле, Knockout обновляет соответствующее свойство в модели представления.

Удобно, что связывание с данными осуществляется декларативно. Вам не требуется подключать модель представления к элементам HTML-страницы. Просто добавьте атрибут data-binding, и Knockout сделает остальное.

Я начал с создания HTML-страницы с базовой разметкой без связывания с данными, как показано на рис. 8.

Рис. 8. Начальная HTML-разметка

(Примечание Я использовал библиотеку Bootstrap для оформления внешнего вида приложения, поэтому в настоящем приложении уйма дополнительных элементов

Создание модели представления

Наблюдаемые объекты (observables) занимают центральное место в системе связывания с данными в Knockout. Наблюдаемым является объект, который хранит какое-то значение и может уведомлять подписчиков об изменении этого значения. Следующий код преобразует JSON-представление фильма в эквивалентный объект с наблюдаемыми полями:

На рис. 9 показана начальная реализация модели представления. Эта версия поддерживает только получение списка фильмов. Средства редактирования я добавлю позже. Модель представления содержит наблюдаемые свойства для списка фильмов, строку ошибки и текущий жанр.

Рис. 9. Модель представления

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

Функция getByGenre выдает AJAX-запрос серверу на получение списка фильмов, а затем заполняет результатами массив self.movies.

При использовании REST API одна из самых хитрых частей — обработка асинхронной природы HTTP. jQuery-функция ajax возвращает объект, реализующий Promises API. Вы можете задействовать метод then объекта Promise, чтобы установить обратный вызов, инициируемый, когда AJAX-вызов завершается успешно, и еще один обратный вызов, запускаемый при неудачном AJAX-вызове:

Привязки данных

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

Атрибут data-bind содержит одно или более объявлений привязок, где каждая привязка имеет форму «привязка: выражение». В этом примере привязка foreach сообщает Knockout перебирать в цикле содержимое массива genres в модели представления. Для каждого элемента в массиве Knockout создает новый элемент
. Привязка text в присваивает text в span значение элемента массива, каковой в данном случае является названием жанра.

На данный момент щелчок названия жанра ни к чему не приводит, поэтому я добавляю привязку click для обработки событий щелчка:

Это связывает событие щелчка с функцией getByGenre в модели представления. Здесь нужно было использовать $parent, так как эта привязка осуществляется в контексте foreach. По умолчанию привязки в foreach ссылаются на текущий элемент в цикле.

Чтобы отобразить список фильмов, я добавил привязки в таблицу, как показано на рис. 10.

Рис. 10. Добавление привязок в таблицу для отображения списка фильмов

На рис. 10 привязка foreach перебирает в цикле массив объектов movie. Внутри foreach привязки text ссылаются на свойства текущего объекта.

Привязка visible в элементе

контролирует, визуализируется ли таблица. Таблица будет скрыта, если массив movies пуст.

Наконец, вот привязки для сообщения об ошибке и сообщения «No records found» (заметьте, что вы можете помещать в привязку сложные выражения):

Редактирование записей

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

  • переключение между режимами просмотра (только текст) и редактирования (элементы управления вводом);
  • передача обновлений на сервер;
  • поддержка отмены изменений и восстановление исходных данных.


Чтобы отслеживать режим просмотра/редактирования, я добавил булев флаг в объект movie как наблюдаемое свойство:

Мне нужно было, чтобы таблица фильмов отображала текст, когда свойство editing равно false, но переключалась на элементы управления вводом, когда оно — true. Для этого я использовал Knockout-привязки if и ifnot, как показано на рис. 11. Синтаксис « » позволяет включать привязки if и ifnot без их размещения внутри элемента HTML-контейнера.

Рис. 11. Поддержка редактирования записей о фильмах

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

Я связал обработчики щелчка кнопок с функциями save, cancel и edit в модели представления.

Функция edit проста. Достаточно установить флаг editing в true:

Функции save и cancel немного посложнее. Для поддержки отмены мне нужен был какой-то способ кеширования исходного значения при редактировании. К счастью, Knockout упрощает расширение поведения наблюдаемых объектов. В коде на рис. 12 добавляется функция store в класс observable. Вызов функции store из observable придает этому классу две новые функции: revert и commit.

Рис. 12. Расширение ko.observable функциями revert и commit

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

Рис. 13 демонстрирует функции save и cancel в модели представления.

Рис. 13. Добавление функций save и cancel

Создание веб-клиента с применением Ember

Для сравнения я написал другую версию своего приложения, используя библиотеку Ember.js.

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

Первая строка кода создает Ember-приложение. Вызов Router.map создает три маршрута. Каждый маршрут соответствует URI или шаблону URI:

Для каждого маршрута вы создаете HTML-шаблон, используя библиотеку шаблонов Handlebars.

В Ember имеется шаблон верхнего уровня для всего приложения. Этот шаблон подвергается рендерингу для каждого маршрута. На рис. 14 показан шаблон application для моего приложения. Как видите, этот шаблон в основном является HTML-кодом, размещаемым в теге script с type=»text/x-handlebars». Шаблон содержит специальную разметку Handlebars в двойных фигурных скобках: << >>. Эта разметка служит той же цели, что и атрибут data-bind в Knockout. Например, <<#linkTo>> создает ссылку на маршрут.

Рис. 14. Шаблон Handlebars уровня приложения

Теперь допустим, что пользователь переходит к /#/about. Это активирует маршрут about. Ember сначала осуществляет рендеринг шаблона application верхнего уровня, затем шаблона about в <> шаблона application. Вот шаблон about:

На рис. 15 показано, как выполняется рендеринг шаблона about в шаблоне application.

Рис. 15. Рендеринг шаблона about

Поскольку у каждого маршрута свой URI, история браузера сохраняется. Пользователь может осуществлять навигацию кнопкой Back, а также обновлять страницу, не теряя контекст или закладку, и перезагружать ту же страницу.

Контроллеры и модели в Ember

В Ember каждый маршрут имеет модель и контроллер. Модель содержит данные предметной области. Контроллер действует как прокси для модели и хранит все данные состояния приложения для представления. (Это не совпадает с классическим определением MVC. В некоторых отношениях контроллер больше похож на модель представления.)

Вот как я определил модель movie:

Контроллер наследует от Ember.ObjectController (рис. 16).

Рис. 16. Контроллер Movie наследует от Ember.ObjectController

Здесь происходит кое-что интересное. Во-первых, я не указывал модель в классе контроллера. По умолчанию маршрут автоматически устанавливает модель в контроллере. Во-вторых, функции save и cancel используют средства транзакций, встроенные в класс DS.Model. Для отмены изменений просто вызовите функцию rollback модели.

Ember использует массу соглашений по именованию для подключения различных компонентов. Маршрут genres взаимодействует с GenresController, который выполняет рендеринг шаблона genres. По сути, Ember будет автоматически создавать объект GenresController, если вы его не определили. Однако вы можете переопределять все, что предлагается по умолчанию.

В своем приложении я сконфигурировал маршрут genres/movies на использование другого контроллера, реализовав точку подключения (hook) renderTemplate. Тем самым несколько маршрутов может использовать один и тот же контроллер (рис. 17).

Рис. 17. Несколько маршрутов могут иметь общий контроллер

Одна из приятных особенностей Ember в том, что многое можно делать с помощью минимума кода. Мое приложение-пример состоит примерно из 110 строк кода на JavaScript. Эта версия короче, чем версия на основе Knockout, и вдобавок я безо всяких усилий получил поддержку истории браузера. С другой стороны, Ember также является весьма «своенравной» инфраструктурой. Если вы не пишете код в стиле Ember, то скорее всего попадете в неприятности. Так что при выборе инфраструктуры следует принимать во внимание набор функциональности, стиль кодирования и то, насколько общая архитектура инфраструктуры подходит под ваши требования.

Где узнать больше

В этой статье я показал, как JavaScript-инфраструктуры упрощают создание SPA. Попутно я рассказал о некоторых общих средствах этих библиотек, в том числе о связывании с данными, маршрутизации и шаблонах MVC и MVVM. Узнать больше о создании SPA с помощью ASP.NET можно по ссылке asp.net/single-page-application.

Майк Уоссон (Mike Wasson) — программист и технический писатель в Microsoft. Многие годы занимался документированием мультимедийной части Win32 API. В настоящее время пишет о ASP.NET с основным акцентом на Web API. С ним можно связаться по адресу mwasson@microsoft.com.

Выражаю благодарность за рецензирование статьи эксперту Microsoft Хиньяну Чу (Xinyang Qiu).

Почему ASP.NET не используют в крупных компаниях?

В настоящий момент С# (asp.net) имеет целый ряд преимуществ над тем, что нам дает Java (в плане удобства и синтаксиса языка). Это правда!

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

Именно по этой причине Microsoft сейчас активно начинает спариваться с Linux и везде кричит, что они его любят.

Asp возможности клиента

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

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

С уважением,
команда разработчиков eManual.ru

Азы ADO и ASP

FileArea.co.il Азы ADO и ASP
Азы ADO и ASP Майкл Оути
Листинг 1. Применение объекта ADO Соединение
Листинг 2. Использование объекта ADO Набор записей
Листинг 3. Применение объекта ADO Набор записей для вставки строк
Листинг 4. Обработка ошибок ASP и ADO Основы интерактивного WEB-дизайна

Программный продукт ASP, название которого в переводе означает Активные страницы сервера (Active Server Pages), обеспечивает написание сценариев серверной части для информационных WEB-серверов компании Microsoft, IIS (Internet Information Server). Впервые корпорация Microsoft ввела ASP в версии IIS 3.0, и продолжила дальнейшую разработку этого продукта в IIS 4.0. ASP представляет собой гибкое динамичное средство создания WEB-страниц и позволяет применять любой язык написания сценариев, удовлетворяющий стандарту ActiveX. Как правило, ASP использует комбинацию из HTML и встроенного VBScript. IIS включает в себя сервер автоматизации OLE, который исполняет VBScript и посылает результаты реализации сценария в формате HTML клиенту, который может иметь только браузер. Так как сценарии ASP выполняются на сервере, то ASP способен работать с любым WEB-браузером, поскольку браузер получает лишь поток страниц HTML. Понимание того, каким образом объекты ADO работают с ASP, и в особенности того, как лучше применять объекты ADO для поиска и модификации данных, может превратить создание динамических WEB-страниц в легкое и приятное занятие.

Как работает ASP

Рисунок 1. Обзор взаимодействия ASP и HTML
1- WEB-сервер
2- Клиент WEB
3- Активный сценарий
4- пример .ASP

На рисунке 1 изображено, как ASP комбинирует сценарий ActiveX и команды HTML для того, чтобы получить динамическую страницу HTML. Как следует из рисунка, сценарии ASP отличаются от сценариев, базирующихся на браузерах. В традиционных сценариях, основывающихся на браузерах, WEB-сервер посылает страницу HTML, содержащую сценарий ActiveX в браузер клиента, который и отвечает за выполнение сценария. Подход, при котором основной акцент делается на клиентской части приложения, возлагает на нее дополнительный груз обязанностей, что может привести к возникновению проблем, если клиентский браузер не будет в состоянии выполнить сценарий. Напротив, страницы ASP исполняются на WEB-сервере IIS. В ходе исполнения страницы сервер напрямую посылает клиенту команды HTML и все клиентские сценарии, содержащиеся на странице ASP. Но как только сервер доходит до команды серверного сценария ASP, то он исполняет этот сценарий и передает клиенту в форме HTML только полученные в качестве результата выходные данные. Клиент, действия которого сводятся к использованию браузера, не видит разницы между потоком страниц HTML, порождаемым сценарием ASP, и потоком HTML, посылаемым статичными WEB-страницами. Таким образом, написание сценариев для серверной стороны с помощью ASP создает WEB-страницы, которые выступают в качестве исполнителей сценариев. Тот факт, что ASP генерирует только поток страниц HTML, обеспечивает независимость от типа браузера клиента. В силу того, что сервер IIS интерпретирует страницы ASP «на лету», ASP служит идеальным средством для встраивания результатов обработки интерактивных запросов к базе данных в WEB-страницы. Эти возможности обеспечиваются доступом к базе данных SQL Server через ADO непосредственно со страниц ASP.

Будь то доступ из Internet или из местной сети Intranet, клиенты применяют протоколы HTTP и TCP/IP для связи с WEB- сервером IIS. Когда WEB-клиент запрашивает страницу ASP, WEB-сервер IIS сценарии, находящиеся на этой странице. Для того чтобы получить доступ к базе данных SQL Server, сценарий ASP открывает соединение с SQL Server с помощью одного из объектов Соединение, Команда или Набор записей. Затем использует этот объект для передачи в сервер запроса на доступ к данным. SQL Server может размещаться на том же компьютере, что и WEB-сервер IIS. Однако в силу того, что часто SQL Server используется одновременно сразу несколькими различными приложениями, удобнее разместить его на отдельном компьютере, и обеспечить связь с ним через локальную сеть. После того как ядро SQL Server закончит обработку запроса, оно возвращает результаты объекту ADO из сценария ASP. Затем IIS продолжает исполнять сценарий ASP и отсылает поток страниц HTML обратно клиенту. Поэтому обязательно должно существовать сетевое соединение между WEB-сервером IIS и сервером баз данных SQL Server. Кроме того, на WEB-сервере необходимо установить поставщик OLE DB и библиотеки DLL на период прогона ADO.

Использование объектов ADO на страницах ASP

При использовании ADO приложение первым делом пытается применить объекты Соединение, Команда или Набор записей для установления соединения с SQL Server. Объект Соединение следует употреблять для того, чтобы открыть соединение ADO явным образом. Объекты Команда и Набор записей позволяют сделать то же самое динамически. После установления соединения приложение ASP может выполнять команды ADO такого же типа, что и стандартное приложение, написанное на Visual Basic (VB). Эти команды включают исполнение хранимых процедур, открытие и просмотр набора записей, вставку, обновление и удаление данных.

Для подключения страницы ASP к серверу баз данных SQL Server ADO может применять поставщик OLE DB как для ODBC, так и для SQL Server. Поставщик OLE DB для ODBC позволяет использовать структуру объекта ADO с большинством существующих драйверов ODBC. Но поставщик OLE DB для SQL Server дает возможность подключиться только к SQL Server. Однако с объектами ADO Соединение, Команда и Набор записей возможно применять любой из упомянутых поставщиков. Листинг 1 (написанный на языке VBScript) показывает, как применить поставщик OLE DB для ODBC в целях установления соединения с SQL Server.

Первое действие, проводимое в листинге 1, это объявление трех переменных, которые будут содержать имя компьютера, на котором размещен SQL Server, и информации для аутентификации SQL Server. Затем сценарий декларирует переменную cn, которую он в последствии будет использовать для объекта ADO Соединение. После объявления в сценарии рабочих переменных метод Формировать (Form) объекта ASP Запрос (Request) присваивает значения всем этим переменным.

Следующим шагом метод Создать объект (CreateObject) объекта ASP Сервер (Server) создает новый объект ADO Соединение (Connection), который затем присваивается введенной ранее переменной cn. Метод Создать объект (CreateObject) способен порождать экземпляры объектов СОМ. Данный пример иллюстрирует создание экземпляра объекта Соединение ADODB (ADODB.Connection), но его можно аналогичным образом применять и для других структур объектов СОМ, например, для SQL-DMO или Active Directory. (Более подробную информацию об объектах ASP можно найти во врезке «Модель объектов ASP»).

После этого сценарий присваивает значение строки соединения OLE DB свойству Строка соединения (ConnectionString) объекта Соединение, хранящегося в переменной cn. Это позволяет установить соединение без указания имени источника данных, DSN (Data Source Name). В силу того, что спецификация поставщика OLE DB проводилась без ключевого слова PROVIDER, по умолчанию берется поставщик OLE DB для ODBC. Ключевое слово DRIVER идентифицирует тот драйвер, который предполагается применять в дальнейшем. За ключевым словом SERVER указывается имя компьютера, содержащего SQL Server, с которым намереваются установить соединение. За ключевыми словами UID и PWD содержится информация, необходимая для входа в систему. Ключевое слово DATABASE определяет, что в роли базы данных, используемой по умолчанию, будет выступать база данных pubs. После того как будет присвоено значение строки соединения свойству Строка соединения (ConnectionString) объекта Соединение (Connection), его метод Открыть (Open) установит соединение с SQL Server, удовлетворяющее всем значением параметров, заданных в сценарии.

Поиск данных с помощью объекта ADO Набор записей ()

ADO можно применять для поиска данных с помощью объектов Набор записей (Recordset) или Команда (Command). Оба эти объекта способны работать с активным объектом Соединение (Connection), или же создавать новое отдельное соединение. Каждый раз, когда объект Соединение (Connection) или Набор записей (Recordset) устанавливает соединение, начинается новая коммуникационная сессия с SQL Server. Поэтому в том случае, если приложению необходимо выполнить несколько операций, целесообразнее применить объект Соединение (Connection) для открытия связи с SQL Server. Этот объект будет использоваться объектами Команда (Command) или Набор записей (Recordset).

Листинг 2 демонстрирует применение объекта ADO Набор записей (Recordset) на странице ASP. Первая часть сценария во многом напоминает простой пример установления соединения, приведенный в листинге 1. В сценарии сначала декларируются рабочие переменные, а затем им присваиваются значения. После этого по сценарию создается объект Соединение (Connection), и вслед за ним объект ADO Набор записей (Recordset). На следующем шаге сценария строка соединения присваивается объекту ADO Соединение (Connection), и затем для установления связи с SQL Server вызывается метод Открыть (Open). В соответствии со сценарием свойству Активное соединение (ActiveConnection) объекта Набор записей (Recordset), хранящегося в переменной rs, передается значение объекта активного соединения, cn, и выполняется метод Открыть (Open) объекта Набор записей (Recordset). Первый параметр метода Открыть (Open) содержит простой оператор SQL, который выбирает все столбцы и строки из таблицы stores базы данных Pubs.

После того как сценарий возвращает результаты обработки запроса, страница ASP создает таблицу HTML, содержащую шесть столбцов. После этого по сценарию столбцы получают заголовки. Сценарий использует стандарт HTML для построения всех заголовков столбцов. Внутри тела таблицы HTML в соответствии с меткой А листинга 2 программный код VBScript организует цикл Do Until. Этот цикл обрабатывает содержимое объекта Набор записей (Recordset), находящегося в переменной rs. Когда сценарий доходит до конца объекта Набор записей (Recordset), свойство rs.EOF получает значение Истина, и цикл завершается.

Встроенный в страницу ASP сценарий присваивает значения всем столбцам исходя из имени столбца объекта ADO Набор записей (Recordset). В рассматриваемом примере имя столбца, происходящее из таблицы Stores базы данных Pubs идентифицирует каждый пункт коллекции Поля (Fields). Расположенная вслед за этим часть кода VBScript реализует метод MoveNext для перехода к следующей строке в объекте Набор записей (Recordset). Затем оператор Цикл (Loop) возвращает управление в начало цикла Do Until. Когда этот цикл прочитает последнюю строку набора записей, цикл заканчивается и объекты Набор записей (Recordset) и Соединение (Connection), хранившиеся соответственно в переменных rs и cn, закрываются. Результаты работы этой страницы ASP можно видеть на экране 1.

Экран 1. Просмотр простого объекта ADO Набор записей
Изменение данных средствами ADO

ASP и ADO можно применять не только для динамической выдачи WEB-страниц, но и в целях создания WEB-страниц для ввода данных. Такая возможность позволяет создавать основанные на WEB приложения с использованием баз данных, обладающие таким же набором функций работы с базами данных, что и стандартные приложения, разработанные в соответствии с архитектурой клиент-сервер. Объекты ADO Набор записей (Recordset), которые становятся доступными на страницах ASP, предоставляют тот же перечень услуг, что и приложения, написанные на Visual Basic. Как показывает следующий пример, их можно применять для ввода данных. Кроме того, их можно использовать для изменения или удаления данных. Все остальные возможности ADO, такие как способность запускать подготовленные заранее операторы SQL или хранимые процедуры, также имеют место.

В целях внесения изменений в данные возможности, предоставляемые ASP и ADO, можно комбинировать различными способами. К примеру, можно было бы создать страницы ASP, которые будут поддерживать изменяемые объекты ADO Набор записей (Recordset). Они, в свою очередь, смогут применять методы Добавить новый (AddNew), Обновить (Update) и Удалить (Delete) для модификации данных в базах SQL Server. Помимо этого, возможно применять ADO для выполнения как динамических,, так и подготовленных заранее с помощью языка SQL операций модификации данных. Код приведенный на листинге 3, иллюстрирует, каким образом можно было бы добавлять строки в объект Набор записей (Recordset), который создается с использованием курсора Keyset.

Листинг 3 представляет дополнительные технические приемы построения WEB-приложений с помощью ASP. Первая строка является оператором VBScript Option Explicit, который указывает, что все переменные в коде VBScript перед их применением будут явным образом продекларированы. Как и в стандартном Visual Basic, в VBScript предусмотрено автоматическое использование новых переменных, без их предварительного объявления. На первый взгляд это свойство может показаться очень удобным, но в реальности оно служит довольно эффективным способом ввести в разрабатываемое приложение ASP множество трудно находимых коварных ошибок.

Следующим шагом оператором #include вводится файл adovbs.inc. Оператор #include представляет очень удобный путь копирования обычно употребляемых констант на страницы ASP. В данном случае файл adovbs.inc включает все константы, которые обычно содержит структура объекта ADO. Подключение этого файла дает возможность записывать константы в виде adChar и adKeyset, а не в виде значений, представляемых этими константами. Применение констант делает код удобно читаемым и легким в сопровождении. Хотя включение файла является хорошим приемом для средств разработки вообще, но в случае, когда для создания ASP- приложений используется такой инструмент, как Visual InterDev (VID), можно просто добавить в среду разработки VID ссылку на объектную библиотеку ADO. Подобное добавление устраняет необходимость включения файла в ASP- приложения. Чтобы добавить ссылку на ADO в проект VID следует выбрать в меню Проект (Project) и Ссылки проекта (Project References), а затем выбрать в списке доступных ссылок библиотеку Microsoft ActiveX Data Library 2.0.

В соответствии со сценарием VBScript, приведенным на листинге 3, сначала уничтожается, а затем воссоздается заново таблица в базе данных pubs, после чего в эту таблицу вставляются 50 строк и полученное содержимое показывается на WEB-странице. Но прежде чем выполнить все это, в том месте сценария, которое отмечено в листинге 3 буквой А, инициируется обработчик ошибок VBScript. В этом примере оператор On Error применен для того, чтобы обойти любые ошибки, которые могут произойти, к примеру, при попытке удалить несуществующую таблицу из указанной базы данных. В следующем разделе будет более подробно рассмотрено использование обработчика ошибок.

На следующем шаге сценарий ставит в соответствие переменной cn объект ADO Соединение (Connection). Затем метод Исполнить (Execute) объекта Соединение (Connection) выполняет два динамических оператора SQL. Первый уничтожает таблицу Department, а второй создает таблицу Department заново. После создания таблицы Department сценарий устанавливает в свойстве Активное соединение (ActiveConnection) объекта Набор записей (Recordset), указанного в переменной rs, ссылку на этот объект Соединение (Connection). Затем метод Открыть (Open) объекта Набор записей (Recordset) создает обновляемый набор записей. Константа adOpenKeyset определяет, что этот объект будет относиться к обновляемому типу Keyset, а константа adLockOptimistic предписывает использование оптимистического типа блокировки записей.

Цикл For Next вставляет 50 строк в таблицу Department. В этом цикле метод Добавить новый элемент (AddNew) создает буфер для хранения новой строки, после чего цикл присваивает значения объектам ADO Поле (Field). Каждый объект коллекции Поле (Field) идентифицируется по названию столбца. Значение счетчика цикла присваивается столбцу Dep_Id, содержащему идентификатор отдела, а в столбец Dep_Name с названием отдела помещается литерал Department и представленный в виде символьной строки номер отдела, равный значению счетчика цикла. Цикл вставляет новую строку в базовую таблицу в ходе исполнения метода Обновить (Update) объекта Набор записей (Recordset).

После того как сценарий вставит 50 строк в таблицу Department, метод Перейти к первой () перемещает курсор в начало объекта Набор записей (Recordset). Затем содержимое объекта Набор записей (Recordset) представляется в виде таблицы HTML, применяя ту же технику, что и в описанном ранее примере с запросом. На экране 2 показана WEB- страница, которая создается при запуске данной страницы ASP.

Экран 2. Просмотр записей, введенных на страницу ASP
Обработка ошибок ASP и ADO

Очень важно перехватывать ошибки, возникающие во время работы приложения: если вдруг в результате некорректного функционирования WEB-приложения системой будет сгенерировано сообщение об ошибке, то работа WEB- приложения будет немедленно прекращена. Для того чтобы предусмотреть на странице ASP специальную часть сценария VBScript, отвечающую за обработку возникающих ошибок, применяется оператор On Error. К сожалению, оператор On Error не обладает всей полнотой возможностей обработчика ошибок VB, который позволяет перейти в отдельную секцию кода для обработки информации об ошибке. Оператор On Error, входящий в VBScript, предоставляет только следующую альтернативу: либо перейти к следующей операции (Resume Next), либо вообще отключить обработку ошибок. Этот оператор не дает возможности перейти к другим секциям кода. Оператор On Error использует структуру объекта ADO для того, чтобы поместить ошибки, возникающие во время выполнения WEB-приложения на базе страниц ASP, в коллекцию объекта ADO Ошибка (Error). Коллекцию ошибок ADO можно обрабатывать с целью сбора дополнительной информации о том, какие ошибки встречаются при эксплуатации вашего приложения. Фрагмент кода, приведенный на листинге 4, показывает, как использовать обработчик ошибок VBScript и каким образом извлекать информацию из объекта ADO Ошибка (Error).

Обработку ошибок в листинге 4 обеспечивает оператор On Error. Затем для создания локального объекта ADO Соединение (Connection) по сценарию используется объект Соединение (Connection), который хранился в объекте ASP Сессия (Session). После этого в сценарии используется метод Выполнить (Execute) объекта ADO Команда (Command) применительно к заведомо неправильному имени таблицы. Поскольку обработка ошибок разрешена, программа переходит к следующему оператору.

Проверка свойства Счетчик (Count) коллекции объектов Ошибка (Error) позволяет найти ошибки ADO. Если значение счетчика больше нуля, значит, объект ADO столкнулся с какой- либо ошибкой во время исполнения. Извлечь информацию об ошибках ADO можно путем итеративного просмотра коллекции объектов Ошибка (Error). Пример на листинге 4 использует цикл For Each для обработки элементов коллекции ошибок объекта ADO Соединение (Connection). Свойства Номер(), Источник () и Описание () становятся доступными в форме текстов HTML. Экран 3 представляет страницу с результатами обработки ошибок. (Обратите внимание на то, что рассмотренный пример является не более чем демонстрацией подхода. В реальном приложении необходимо обрабатывать условия возникновения ошибок в коде приложения. При этом следует избегать вывода ошибок на браузер конечного пользователя).

Экран 3. Обработка ошибок ASP с помощью ADO

В том случае, когда на WEB-страницу должны выводиться только статичные данные, целесообразно применять Мастер WEB-приложений (), входящий в состав SQL Server. Он поможет легко и быстро преобразовать информацию базы данных SQL Server к виду WEB-страницы формата HTML. Если же необходимо создать по-настоящему интерактивное приложение, способное динамически представлять и обновлять данные, лучше всего применять комбинацию ASP и ADO, что позволит подключить вашу базу данных SQL Server к сети WEB. Использование ADO и ASP дает возможность создавать WEB-приложения, обладающие теми же функциями, что и их предшественники, выполненные в соответствии с традиционной архитектурой клиент-сервер.

В основу этой статьи лег адаптированный материал из книги Майкла Оути и Поля Конте «Руководство по разработке для SQL Server 7.0».

Майк Оути (mikeo@teca.com) работает старшим техническим редактором в журналах SQL Server Magazine и Windows NT и является президентом компании ТЕСА. Эта компания занимается разработкой программного обеспечения и консалтингом; находится в Портленде, штат Орегон.

Модель объектов ASP

Информационный сервер Интернет, IIS (Internet Information Server), разработанный корпорацией Microsoft, вводит Активные серверные страницы, ASP (Active Server Pages), в качестве автоматического сервера OLE, обладающего иерархической структурой объекта. На рисунке А представлена модель объекта ASP. Первичным объектом в программной модели ASP является объект Контекст сценария (ScriptingContext), который обеспечивает взаимодействие с браузером клиента. Поскольку объект Контекст сценария (ScriptingContext) всегда доступен приложениям ASP, то нет необходимости в явном виде делать на него ссылку. Объект Контекст сценария (ScriptingContext) содержит шесть основных объектов ASP: пять встроенных объектов и объект Контекст объекта (ObjectContext). К пяти встроенным объектам относятся: объект Приложение (Application), объект Запрос (Request), объект Сервер (Server), объект Сессия (Session) и объект Отклик (Response).

Все активные WEB-сессии применяют объект Приложение (Application) для того, чтобы все пользователи могли одновременно обращаться к информации приложения ASP. Объект Приложение (Application) включает две коллекции: Содержание (Context) и Статические объекты (StaticObjects). Каждый объект Содержание (Context) соответствует какому- либо пункту, для включения которого в WEB-приложение были использованы команды ActiveX. Коллекция Статические объекты (StaticObjects) содержит все объекты, для включения которых в WEB-приложение применялись ярлыки HTML . Кроме того, объект Приложение (Application) может также содержать определяемые пользователем объекты, которые были созданы этим WEB-приложением и предназначены для коллективного применения.

Объект Запрос (Request) получает запросы от клиентов сети WEB. Объект Запрос (Request) может вместить всю информацию содержащуюся в форме, плюс сведения о текущем пользователе. Этот объект включает несколько коллекций, каждая из которых представляет различные информационные наборы, которые могут возвращаться клиентам WEB в ответ на их запросы. Каждый объект Сертификат клиента (ClientCertificate) в одноименной коллекции представляет поле сертификата, которое возвращает клиент сети WEB и которое в дальнейшем служит его идентификатором. Коллекция (Cookies) состоит из элементов, каждый из которых содержит немного информации о пользователе WEB. Коллекция Формы (Forms) включает набор объектов, каждый из которых представляет какую-нибудь форму HTML. Коллекция Строка запроса (QueryString) содержит набор добавляемых аргументов URL, а коллекция Переменные сервера (ServerVariables) представляет собой набор переменных, описывающих серверное окружение.

Объект Сервер (Server) применяется для создания объектов OLE, которые было бы желательно иметь в WEB-приложении. Например, метод Создать объект (CreateObject) объекта Сервер (Server) генерирует объекты Соединение (Connection) и Набор записей (Recordset), обеспечивающих доступ к базам данных SQL Server.

Объект Сессия (Session) поддерживает информацию, относящуюся к текущей сессии в сети WEB. Объект Сессия (Session) во многом похож на объект Приложение (Application), но имеет отличие от него. В то время как объект Приложение (Application) принадлежит всем пользователям сети WEB, объект Сессия (Session) относится только к текущей сессии. Коллекция объектов Содержание (Context) объекта Сессия (Session) включает все пункты, которые добавлялись в WEB-сессию с помощью команд сценария. Объект Контекст объекта (ObjectContext) обеспечивает доступ к контексту текущего объекта. Как правило, он порождает экземпляры объектов MTS или контролирует транзакции базы данных.

Объект Отклик (Response) записывает информацию в виде потока страниц HTML и отсылает ее в браузер клиента. Объект Отклик (Response) также поддерживает коллекцию, состоящую из объектов, содержащих сведения, которые могут быть записаны в систему клиента. Они в последствии могут быть прочитаны объектом Запрос (Request).

Рисунок А. Модель объектов ASP
1 — Контекст сценария
2 — Приложение
3 — Содержание
4 — Статические объекты
5 — Определяемые пользователем объекты
6 — Контекст объекта
7 — Запрос
8 — Формы
9 — Строка запроса
11 — Сервер
12 — Сессия
13 — Отклик

Возможности ASP.NET

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

  • Web-формы облегчают создание Web-страниц на основе форм. Среда разработки в режиме полного соответствия WYSIWYG (What You See Is What You Get — что видишь на экране, то и получишь при печати) позволяет просто перетаскивать соответствующие элементы управления на Web-страницу Специальные элементы управления сервера предоставляют программистам модель событий, похожую на модель событий, которая используется при программировании Windows-приложений. В данной главе подробно обсуждаются Web-формы.
  • Web-службы позволяют через программный интерфейс приложения (API) представить на Web-узле функции, которыми могут воспользоваться другие удаленные приложения. Для обмена данными используются стандартные Web-протоколы и форматы, например, протокол передачи гипертекстовых файлов HTTP (Hypertext Transfer Protocol) и язык XML (extensible Markup Language), что позволяет избежать проблем, связанных с прохождением пакетов данных через системы сетевой защиты (брандмауэры). Web-службы обсуждаются в следующей главе

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

Илон Маск рекомендует:  Защита приложений от крупных шрифтов
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL