Asp службы транзакций asp


Содержание

Включение службы ASP.NET State Service

Для корректной работы сгенерированного приложения необходимо, чтобы была запущена служба ASP.NET State Service (Служба состояний ASP.NET). Если при запуске сгенерированного веб-приложения выводится сообщение об ошибке, связанное с данной службой, необходимо:

1.Зайти на панель управления, переключиться при необходимости в режим отображения мелких значков, далее выбрать пункт Администрирование , далее – Службы . Откроется окно:

2.В списке дважды кликнуть по ASP.NET State Service (или Служба состояний ASP.NET ).

3.Если в поле Тип запуска стоит значение Вручную , нужно изменить его на Автоматически и нажать кнопку Запустить .

4.Нажать Применить , ОК .

5.Закрыть все окна, относящиеся к Панели управления.

Как использовать транзакции sql через веб-службы asp.net С#

0 Vib [2015-08-12 15:16:00]

Я использую три разных метода веб-сервисов для вставки данных в три разные таблицы. Сначала я вызываю метод1 для вставки данных в таблицу1. Метод1 возвращает первичный ключ таблицы1. Затем я передаю первичный ключ таблицы методу2 и method3. Оба метода вставляют данные в таблицу2 и таблицу 3 соответственно. Предположим, что если при вставке данных в таблицу 3 возникает исключение, я хочу выполнить откат данных, вставленных в таблицы1 и таблицу2. Я называю методы веб-службы один за другим. Я использую веб-службы asmx. Я много искал, чтобы найти решение, но все, что мне удалось найти, — это пример отката в вызове с одним вызовом. Можно ли выполнять транзакции sql через веб-службы С#. Пожалуйста, помогите мне исправить эту проблему. заранее спасибо

Управление транзакциями

Вопрос больше по архитектуре, чем по конкретной реализации.

Есть какие-то проверенные практики по управлению транзакциями в рамках определённого контекста выполнения (например, в пределах одного API-запроса)?

К тому, что ниже — я в курсе, что транзакции могут быть не только поверх конкретной базы под ORM, что они могут покрывать сразу несколько БД, могут включать в себя обращения к другим сервисам или очередям. Тут пока интересует самый простой случай, дабы совсем не запутаться.

Например, для стандартного сценария прохождения запроса на API:
1. Контроллер.
2. Сервис БЛ Сервис БЛ Сервис БЛ.
3. Репозиторий-1, Репозиторий-2.
4. ORM.

Ключевой пункт [2], где сервисы могут переиспользовать друг-друга в неожиданном порядке (т.е. они с точки зрения архитектуры все на одном уровне) и каждому из них может требоваться или не требоваться транзакция при общении с [3]->[4].

Из этого сходу напрашивается очевидное решение — регистрировать репозиторий/контекст-ORM со временем жизни ‘Scoped’, где-то до [2] заранее всегда открывать транзакцию при прохождении запроса вперёд и закрывать/откатывать при возврате результата. Например, в Invoke мидлвара, непосредственно перед вызовом метода контроллера.

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

Другая мысль — сервис БЛ сам открывает и закрывает транзакции, если ему это необходимо. Однако, в этом случае, если этот сервис вызывает какой-то другой сервис и ему тоже нужна транзакция, то нужно чтобы оба они работали в рамках одной транзакции, и появляется необходимость делать костыль с подсчётом количества открытий/закрытий транзакций и игнорированием лишних открытий и непоследних закрытий. Т.к. если транзакция жива в рамках всего запроса (или цепочки методов сервисов), то повторное её открытие приведёт к ошибке, так же как и преждевременное закрытие.

18.04.2020, 22:10

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

Управление транзакциями в С++
Нужно реализовать управление транзакциями в с++. А именно работу с 2мя структурами в файле.Вопросы.

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

Проблемы с распределёнными транзакциями
Если выполняю SELECT * FROM OPENROWSET(‘SQLOLEDB’,’BDC»sa»sa_passwd’, ‘SELECT * FROM.

Разобраться с транзакциями MySQL+dbExpress
Нужно разобраться как использовать транзакции, теорию почитал, теперь хотелось бы на практике.

20.04.2020, 10:01 2

Решение

Именно такое решение.

А вот это уже фигня) Используйте класс TransactionScope . Он допускает вложенные транзакции. Если сервису хочется открыть транзакцию, то он может это сделать со спокойной совестью. Ему не нужно знать о том, что транзакцию уже открыли. Провайдер ADO.NET тоже знает о TransactionScope (как и все ORM) и о возможности вложения транзакций.

Всё придумано до вас.

20.04.2020, 12:59 [ТС] 3

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

Сейчас сделано на простом костыле — LinqToDB.Data.DataConnection регистрируется со временем жизни Scope (т.е. в рамках одного API-запроса), при создании этого объекта он автоматически открывает подключение к БД и удерживает его (это не я, он сам так себя ведёт).

Ну и в реализации DataConnection просто переопределил методы Begin/Commit/Rollback и считаю там количество открытий/закрытий, как описал выше.

Правда, это порождает некоторые неоднозначные ситуации и проблемы:
1. Транзакция открывается на уровне объекта ORM, сервис БЛ к этому объекту доступа не имеет, приходится в репозиториях (наследованием от базового репозитория) выставлять наружу свои методы Begin/Commit/Rollback . Кривовато выглядит.
2. Первый сервис открыл транзакцию, вложенный сервис тоже (по факту ничего не произошло), потом вложенный сервис откатил транзакцию (по факту ничего не произошло), а первый сервис её закоммитил. В итоге изменения вложенного сервиса тоже закоммитились. С другой стороны, это весьма странная ситуация с точки зрения БЛ, т.е. по идее, если вложенный сервис не смог отработать, он должен кинуть исключение и верхний сервис тоже откатит транзакцию.

Добавлено через 34 минуты
Как-то оно странно работает:
1. Сервис-1 создаёт TransactionScope (внутри using). Добавляет запись в таблицу. Вызывает метод Сервис-2.
2. Сервис-2 создаёт TransactionScope (внутри using). Добавляет запись в таблицу. Делает Complete .
3. Сервис-1 получает управление обратно. Далее (для теста) генерирует исключение. Т.е. он не доходит до вызова Complete .
4. Результат: обе записи добавлены в таблицу.

Добавлено через 9 минут
Не подскажете, как правильно использовать TransactionScope в рамках описанной в первом посте задачи и в сочетании с LinqToDb ?

Пока что, без TransactionScope , получилось проапгрейдить реализованный выше велосипед до отдельного сервиса с временем жизни Scoped , который имеет методы Begin/Commit/Rollback и знает про все коннекты уровня сессии. Это позволило убрать работу с транзакциями на уровне репозиториев. Теперь, если сервису БЛ нужна транзакция, он обращается к сервису транзакций, а тот уже разруливает вложенность обращений. Дополнительное удобство — т.к. нет необходимости оборачивать запуск транзакции в блок using , методы БЛ выглядят аккуратнее (без лишних отступов).

Не запускается служба «Координатор распределенных транзакций»

На работе столкнулся с казалось бы пустяковой проблемой – необходимо запустить службу msdts (Координатор распределенных транзакций), т.к. без нее не запускается оснастка для регистрации COM+ компонент. Запустить службу в Windows – дело одного клика в оснастке «Службы» или ввод команды: net start msdtc.

Увы, оказалось не все так просто. Служба упорно не хотела подниматься, а выдавала ошибку: «Не удалось запустить службу «Координатор распределенных транзакций». Специфическая ошибка службы 3221229584».

Для решения проблемы отправился в Google. Как и ожидалось, поисковик выдал кучу ссылок, но далеко не первая вывела меня на правильное решение. Перепробовав несколько вариантов, нашел линк на справку Microsoft, которая предлагала решить проблему выполнением команды:

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

API транзакций и ASP.NET

Надеюсь, что кто-то из вас был там. Мне нужно сделать некоторые вещи базы данных, которые включают несколько таблиц. Я использую SubSonic 3 SimpleRepository для обновления/доступа к записям. Теперь между вызовами для обновления таблиц я вызываю методы System.Web.Security.Roles , чтобы сделать некоторый поиск. Я использую единственный объект репозитория для выполнения всех обновлений DAO, но когда мой код попадает в User.IsInRole(«blahblah») , он выдает исключение MSDTC is not available on the server .

Я понимаю, что это происходит, потому что SimpleRepository использует другое соединение, а объекты Membership API используют другое соединение.

Есть ли способ обойти это или мне нужно обернуть объекты Membership API в свои собственные классы?

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

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

HttpContext.Current.User.IsInRole() вызывает RolePrincipal.IsInRole() для пользователя, прошедшего проверку подлинности через FormsAuthentication. Внутренне RolePrincipal.IsInRole() вызывает SqlRoleProvider.GetRolesForUser() , который создает и уничтожает объект SqlConnection внутри метода.

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

  • Внедрите собственный поставщик ролей, чтобы вы могли самостоятельно управлять подключениями к базе данных.
  • Внедрите свой собственный объект IPrincipal , чтобы вы могли самостоятельно управлять подключением к базе данных.
  • Предварительно выберите роли перед началом транзакции SubSonic и проверьте список для соответствующей роли по мере необходимости.
  • Возможно, вам даже не нужно сохранять роли, поскольку RolePrincipal.IsInRole() кэширует роли при его вызове и только выходит в базу данных, если кеш пуст или недействителен. Вызов IsInRole() до начала транзакции будет предварительно заполнять кеш объекта RolePrincipal , что означает, что последующие вызовы в середине транзакции SubSonic будут вытаскивать роли из кеша вместо подключения к базе данных для их получения.

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

Промежуточная среда веб служб ASP.NET

7.1. Введение в веб службы


Веб службой или веб-сервисом ( web service, WS ) называется программная компонента, предоставляющая сервис удаленного вызова на основе группы стандартов WSI ( Web Services Interoperability ), основными из которых являются протокол обмена сообщениями SOAP , язык описания интерфейса WSDL , HTTP как основной транспортный протокол, а также XML и схемы XML . Для описания спецификаций формата сообщений в веб службах в настоящее время обычно используется схема XML и кодирование тела пакета SOAP Document.

Служба ASP . NET организует на основе данных стандартов сервис удаленного вызова методов объектов. ASP . NET создает и публикует WSDL описание веб службы на основе интерфейса класса . NET , обрабатывает приходящие от клиентов сообщения SOAP , вызывает методы объекта с извлеченными из сообщений SOAP параметрами, а затем передает клиенту сообщение с результатом выполнения метода (рис. 7.1). Таким образом, полное название промежуточной среды – веб службы ASP . NET .

Хотя с точки зрения прикладного разработчика использование веб службы представляется вариантом удаленного вызова через интернет , в основе веб служб лежит расширяемая технология обмена сообщениями SOAP , независимая от транспортного уровня. В частности, существуют стандарты, описывающие маршрутизацию сообщений SOAP , что придает веб службам признаки среды обмена сообщениями. Благодаря гибкой технологии возможно расширение промежуточной среды веб служб как по мере принятия новых стандартов, так и при необходимости в нестандартной обработке пакетов SOAP . Это возможно за счет фильтров SOAP , которые образуют трубопровод ( pipeline ), обрабатывающий пакеты SOAP . На платформе . NET Framework 2.0 за преобразование пришедшего по HTTP сообщения SOAP в вызов метода веб службы отвечает служба ASP . NET , а за организацию расширяемого набора фильтров SOAP – расширение, называемое WSE ( Web Service Enhancements ). В качестве приложения носителя для ASP . NET , получающего сообщение по транспортному протоколу, обычно используется служба Microsoft Internet Information Services, IIS (рис. 7.2).

При использовании WSE 3.0 возможно создание веб служб поверх протокола TCP без применения IIS . В «Обеспечение безопасности распределенных систем в .NET Framework» так же приведен пример использования ASP . NET без использования IIS .

Клиентом веб службы ASP . NET может быть компонента, созданная на . NET Framework, или любая другая компонента, использующая требуемый сервисом набор стандартов веб служб. При использовании . NET Framework на основе WSDL описания сервиса специальные утилиты создают класс посредника веб службы, который используется клиентом сервиса. Таким же образом создаются на . NET Framework и клиенты веб сервисов, отличных от веб служб ASP . NET . Кроме того, в наиболее известной альтернативной реализации CLI – проекте Mono – в настоящий момент присутствует поддержка страниц и веб служб ASP . NET (версии 1.1 и частично 2.0) для серверов Apache и XSP.

Веб службы нашли широкое применение как средство построения распределенных гетерогенных приложений. В настоящее время разрабатываются все новые стандарты, связанные с веб службами, но не все еще имеют свою реализацию в виде, пригодном для промышленного применения. В частности, это касается стандартов WS Transaction и WS-BusinessActivity, которые дают возможность использовать распределенные транзакции , включающее в себя несколько веб служб. В настоящий момент эти стандарты только утверждаются, и будут реализованы, в частности, в . NET Framework 3.0. В настоящее же время веб службы ASP . NET могут являться только корневым объектом транзакции, но не могут участвовать в транзакциях, начатых их клиентом.

Широкое практическое применение веб служб привело и к тому, что некоторые связанные с ними стандарты уже устарели или не нашли столь широкого применения, как ожидалось. Прежде всего это касается стандарта UDDI ( Universal Description, Discovery, and Integration ), который является частью WS I и предназначается для поиска удаленных веб служб на основе создания соответствующих каталогов сервисов. Для построения сервера с каталогом веб служб можно использовать Microsoft Windows 2003 или систему на основе J2EE . Несколько крупных и известных компаний поддерживали публичные каталоги веб сервисов, однако эта инициатива была закрыта в конце 2005 года. Хотя идея поиска веб служб считалась одной из основополагающих, в настоящий момент нет публичных каталогов веб служб, а для развертывания даже в пределах крупных предприятий достаточно сложная спецификация UDDI представляется избыточной. Можно заключить, что на практике идея каталогов веб служб не нашла ожидаемого применения.

Библиотека Интернет Индустрии I2R.ru

Малобюджетные сайты.

Продвижение веб-сайта.

Контент и авторское право.

Компоненты ASP. Службы COM+ в ASP-компонентах и ASP-приложениях

Создавать и успешно использовать ASP-компоненты можно и без прямого обращения к каким-либо службам COM+. Однако именно эти службы могут внести ту «изюминку», которая превратит просто удовлетворительно работающее ASP-приложение в хорошо масштабируемое и соответствующее предъявляемым ему требованиям, независимо от того, каковы эти требования.

Службы COM+, к которым, прежде всего, стоит обратиться в разработке ASP-компонентов, — это управление транзакциями (transaction management), активация по требованию (just-in-time activation, JIT) и резервирование (pooling). Кроме того, можно использовать новые интерфейсы, которые были созданы для поддержания большей части возможностей этих служб. Однако перед рассмотрением всех этих новшеств обратимся к применению компонентов в приложениях.

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

Именно система, построенная на основе компонентов, выделяет индивидуальные процессы в многократно используемые порции кода и данных, а затем использует один или несколько этих компонентов для сознания полноценных приложений. Среди нескольких типов приложений различают клиент-серверную (client/server), распределенную (distributed) и многоярусную (n-tier) системы. В клиент-серверной системе (client-server system) процессы распределяются между клиентом и сервером, причем клиент отвечает за все взаимодействия с пользователем, отображение данных и подтверждение полномочий клиента, а сервер обрабатывает большую часть обращений к базам данных, проверяет полномочия сервера и контролирует бизнес-правила. В распределенной системе (distributed system) компоненты приложений могут располагаться на разных машинах и географически находиться в разных местах. Кроме того, для обработки множественных запросов может быть создано несколько экземпляров одного и того же компонента, таким образом, появляется возможность предоставлять одну и ту же услугу сразу множеству клиентов. И наконец, многослойная система (n-tier system) объединяет в себе элементы как клиент-серверной, так и распределенной систем. Здесь, как и в клиент-серверной системе, присутствует иерархия компонентов, однако сами по себе компоненты могут дублироваться для распределения загрузки процессов, а также распределяться на большом количестве машин и мест, как это происходит в распределенной системе. Стандартная n-ярусная система может состоять из клиента, выполняющего все взаимодействия с пользователем, проверку полномочий клиента и отображение данных; бизнес-уровня, контролирующего бизнес-правила, общие вопросы управления транзакциями и проверку полномочий, и уровня данных, обрабатывающего все прямые обращения к данным.

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

Другим преимуществом компонентов является тот факт, что гораздо больше родовых функций (generic functions) может быть разделено на отдельные компоненты и, таким образом, использовано во всей системе. Кроме того, применение компонентов упрощает модель и конструкцию n-ярусной системы. В качестве примера можно привести систему, в которой интерфейсный компонент проверяет достоверность адресной информации. Проверка достоверности достаточно характерна: она просто подтверждает тот факт, что все необходимые поля, такие как «Город» или «Почтовый индекс», заполнены. Тогда бизнес-уровень сможет обрабатывать для приложения адресную информацию, исходя из типа бизнеса. На основе адресной информации бизнес-уровень может вести поиск, например, зон отгрузки для компонента с помощью соответствующего приложения или зон доставки для виртуальной системы заказов. Компонент может обратиться к уровню данных для сохранения адресной информации, извлечения дополнительной информации или даже для запуска других виртуальных бизнес-компонентов, выполняющих какую-либо еще обработку информации. Уровень данных сам по себе может быть разделен по отдельным машинам, отдельным базам данных или даже различным типам хранилищ данных, вместе с некоторой информацией, идущей на долговременное или кратковременное хранение (если информация может потребоваться лишь в некоторой специфической задаче, а затем должна быть удалена).

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

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

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

Илон Маск рекомендует:  Работа с мышкой в dos

Интерфейсы COM+

Большинство важнейших интерфейсов COM, таких как, например, IUnknown и IDispatch, с появлением среды COM+ не претерпело каких-либо изменений и по сию пору решает все те же знакомые нам задачи. Главное отличие между COM и COM+ состоит в том, что та функциональность, которая в Windows NT и Windows 98 выполнялась средствами MTS, нынче полностью интегрирована в архитектуру COM+. Такого рода интеграция не только принесла с собой новые возможности, предоставляемые службами COM+, но и позволила существенно улучшить характеристики компонентов.

Разумеется, разработчики COM+ не забыли о необходимости поддержки новых служб COM+, а также нескольких новых интерфейсов уже имеющимися средствами, реализованными в MTS. В следующих нескольких разделах нами будут рассмотрены несколько ключевых интерфейсов, без знания которых, как нам кажется, разработка ASP-компонентов была бы бессмысленна.

Интерфейс IObjectContext

В главе 4 мы обсуждали концепцию контекстов (contexts) как совокупностей объектов, отвечающих одинаковыми требованиями. Среди таких требований может быть, например, возможность резервирования (pooling) для компонентов или их совместное участие в транзакциях.

В Windows 2000 контекст компонентов представляет собой набор свойств времени выполнения (runtime properties), непосредственная работа с которым может вестись с помощью объекта ObjectContext, управляющего контекстной информацией для компонента. Для доступа к свойствам объекта ObjectContext используется интерфейс IObjectContext, доступный, в свою очередь, с помощью библиотеки типов служб COM+.

Ответ на вопрос о том, каким именно образом осуществляется доступ к объекту ObjectContext, зависит от того, каким языком программирования вы пользуетесь. Например, если взять Visual Basic, то здесь сначала производится импорт ссылки на библиотеку типов служб COM+ в рабочий проект, и только потом можно создать ссылку на объект ObjectContext и вызвать для создания экземпляра метод GetObjectContext:

Dim objContext As ObjectContext
Set objContext = GetObjectContext

В Visual С++ под Windows NT для доступа к объекту ObjectContext также можно применить метод GetObjectContext:

CComPtr m_spObjectContext;
hr = GetObjectContext(&m_spObjectContext);

В то же время, в Visual C++ под Windows 2000 для передачи интерфейсу идентификатора GUID уже используется метод CoGetObjectContext:

hr = CoGetObjectContext(IID_IObjectContextInfo,
(void **)&m_spObjectContext);

Независимо от того, применяется ли метод GetObjectContext или метод CoGetObjectContext, результаты будут одними и теми же, поскольку вызов метода CoGetObjectContext в COM+ является оболочкой для вызова метода GetObjectContext. В Visual С++ придется также добавить в путь библиотеки компонента ссылку на заголовочный файл comsvcs.h служб COM+ и ссылку на файл связанного объекта comsvcs.lib.

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

табл. 1. Методы интерфейса IObjectContext

Метод Описание
CreateInstance Создает экземпляр объекта
DisableCommit Показывает, что компонент не готов к выполнению транзакции
EnableCommit Показывает, что компонент все еще обрабатывается, но транзакция может быть выполнена
IsCallerInRole Показывает, соответствует ли вызывающий определенной роли (с учетом ролевой безопасности)
IsInTransaction Показывает, участвует ли компонент в транзакции
IsSecurityEnabled Показывает, включена ли защита
SetAbort Показывает, что компонент завершил работу и транзакция прервана
SetComplete Показывает, что компонент завершил работу и транзакция готова к принятию

Интерфейс обладает следующими свойствами:

  • ContextInfo — возвращает ссылку на объект контекстной информации, связанный с компонентом;
  • Count — показывает число именованных свойств объекта;
  • Item — содержит имена свойств;
  • Security — возвращает ссылку на объект Security, связанный с объектом ObjectContext.

Интерфейс информации контекста IObjectContextInfo более подробно будет рассмотрен в следующем разделе. Для обращения к встроенным ASP-объектам применяется коллекция Item. Получить доступ к ней можно непосредственно из Visual Basic:

Dim oc As ObjectContext
Dim app As Application
Set oc = GetObjectConext
Set app = oc.Item(«Application»)

Получить доступ к ASP-объектам можно и через объект ObjectContext:

Set app = oc(«Application»)

Из других программных языков для обращения к объектам ASP придется применить другие технологии. В C++, например, для получения доступа к определенному ASP-объекту нужно послать запрос экземпляру интерфейса IGetContextProperties:

CComPtr pProps; //свойства контекста

//получение ObjectContext
hr = CoGetObjectContext(IID_IObjectContext,
(void **)&m_spObjectContext);
if (FAILED(hr)) return hr;

//получение свойств контекста
hr = m_spObjectContext ->
QueryInterface( IID_IGetContextProperties,
(void**)&pProps );
if (FAILED(hr)) return hr;

получение свойства Response
bstrProp = «Response»;
hr = pProps->GetProperty( bstrProp, &vt ) ;
if (FAILED(hr)) return hr;

p > hr = piDispatch->QueryInterface( IID_IResponse,
(void**)&m_piResponse );

В документации к интерфейсу IGetContextProperties сообщается, что он действует только в среде Windows NT, но и в Windows 2000 с его помощью также можно обращаться к встроенным ASP-объектам.

Интерфейс IObjectContextInfo

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

табл. 2. Методы интерфейса IObjectContextInfo

Метод Описание
GetActivityId Возвращает идентификатор текущей активности
GetContextId Возвращает идентификатор текущего контекста
GetTransaction Возвращает указатель на интерфейс ITransaction
GetTransactionId Возвращает идентификатор текущей транзакции
IsInTransaction Показывает, участвует ли компонент в транзакции

Если в компонентах COM+ осуществляется синхронизация (описываемая позже), метод GetActivityId возвращает идентификатор текущей активности, в противном случае будет возвращено значение Null.


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

Интерфейс IContextState

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

На практике есть два условных бита, устанавливаемых при работе с методами SetComplete и SetAbort. Первый из их — бит завершения (done bit), его установка указывает COM+, что обработка компонента завершена. Второй — бит согласованности (consistency bit). Установка этого бита определяет, может ли быть транзакция принята или она должна быть прервана.

Оба метода, SetComplete и SetAbort, интерфейса IObjectContext одновременно устанавливают оба бита, причем оба устанавливают бит завершения в значение True, указывая, что обработка компонента завершена. В то же время, с помощью интерфейса IContextState можно идентифицировать факт окончания работы компонента отдельно от статуса транзакции.

В табл. 3 приведены четыре метода интерфейса IContextState.

табл. 3. Методы интерфейса IContextState

Метод Описание
GetDeactivateOnReturn Получает состояние бита завершения
GetMyTransactionVote Получает состояние бита согласованности
SetDeactivateOnReturn Сигнализирует о завершении работы компонента
SetMyTransactionVote Идентифицирует возможность принятия либо прерывания транзакции

Бит завершения можно получать и устанавливать с помощью методов SetDeactivateOnReturn и GetDeactivateOnReturn. Компонент деактивируется по завершении методов только при значении бита завершения, установленном в True.

Чтобы убедиться во всех этих возможностях, создайте компонент Visual Basic, реализующий для перехвата событий JIT интерфейс IObjectControl. (Интерфейс IObjectControl подробно описывается в следующем разделе.) У этого метода будет два компонента, каждый из которых вызывает метод SetDeactivateOnReturn интерфейса IContextState. Первая функция будет вызывать метод, передавая логическое значение False, вторая — True.

Создайте проект Visual Basic и назовите его asp0501, а класс генерируемого компонента — done. Присоедините к проекту библиотеки типов служб COM+ и Microsoft Active Server Pages. Коль скоро библиотеки типов добавлены как ресурсы, реализуйте, как показано в листинге 5.1, JIT-методы Activate, Deactivate и CanBePooled интерфейса IObjectControl.

Листинг 1. Реализация JIT-функций интерфейса IObjectControl

Dim objResponse As Response

Private Sub ObjectControl_Activate()
Set objResponse = GetObjectContext().Item(«Response»)
objResponse.Write «

Активирован

Private Sub ObjectControl_Deactivate()
objResponse.Write «

Деактивирован

Private Function ObjectControl_CanBePooled() As Boolean
ObjectControl_CanBePooled = False
End Function

В методе Activate созданная ссылка на встроенный ASP-объект Response используется для отображения сообщения о том, что метод активирован. В методе Deactivate на web-страницу выводится сообщение о том, что компонент деактивирован.

Далее, добавьте две функции компонента, вызываемые ASP-страницей. Первая, под именем function1, обращается к интерфейсу IContextState и вызывает его метод SetDeactivateOnReturn, передавая значение False. Вторая функция, function2, также вызывает метод SetDeactivateOnReturn, но на сей раз передается значение True. В листинге 5.2 приведен программный код обеих функций, который и нужно добавить к нашему компоненту.

Листинг 2. Подпрограммы, вызывающие метод SetDeactivateOnReturn

Dim iCntxt As IContextState
Set iCntxt = GetObjectContext

iCntxt.SetDeactivateOnReturn False
End Sub

Dim iCntxt As IContextState
Set iCntxt = GetObjectContext

iCntxt.SetDeactivateOnReturn True
End Sub

После того как проект компонента скомпилирован и добавлен к приложению COM+, протестируйте новый компонент с помощью ASP-сценария примерно такого содержания (как в странице asp0501.asp):

Первой вызывается функция function2, деактивирующая компонент при возвращении значения функцией. Благодаря этому при обращении к функции компонента будет отображаться сообщение «Активирован», а при возвращении функцией значения будет отображаться сообщение «Деактивирован» еще до сообщения «Вызов function 1».

Следует заметить, что при вызове первой функции, не деактивирующей компонент, сообщение «Деактивирован» при возвращении функцией значения не появится.

Наконец, при повторном вызове функции function2, должны быть отображены оба сообщения, «Активирован» и «Деактивирован», при этом генерируется web-страница со следующими сообщениями:

Вызов function 2

Вызов function 1

Вызов function 2

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

Интерфейс IObjectControl

В этом разделе показано, как можно управлять временем жизни (lifetime) компонента с помощью интерфейса IContextState. В примере также используется активация по требованию (just-in-time activation, JIT) — для управления созданием экземпляра компонента и записи на web-страницу с помощью методов Activate и Deactivate интерфейса IObjectControl сообщений об активации и деактивации компонента.

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

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

Как разработчик компонента, вы можете перехватывать моменты активации и деактивации компонента путем реализации методов Activate и Deactivate интерфейса IObjectControl. В этом случае вы не зависите от ресурсов (типа ссылки на объект Response в листинге 5.1) в период простоя компонента и ожидания вызова его методов.

При реализации интерфейса IObjectControl вы должны реализовать и методы Activate и Deactivate — а кроме того, еще и метод CanBePooled. Этот последний метод определяет, находится ли компонент в состоянии, когда он может быть резервирован (pooled). Позднее в этой главе при описании служб COM+ мы рассмотрим резервирование (pooling) компонентов более подробно.

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

Интерфейсы IObjectControl и IObjectContext были реализованы в Windows NT и управляются посредством MTS. Фактически же, ASP-компоненты, созданные для Windows NT, за исключением использующих специфические службы NT, можно без проблем перенести на Windows 2000 и COM+, что и обсуждается в следующем разделе.

ПРИМЕЧАНИЕ
В Windows NT приходилось избегать применения обработчиков событий Initialize и Terminate, поскольку они не позволяли обратиться к экземпляру объекта ObjectContext. Это ограничение в Windows 2000 снято. И все же, по-прежнему важно рассмотреть реализацию интерфейса IObjectControl и перехват (trapping) событий Activate и Deactivate для обеспечения доступа к глобальным ресурсам и их высвобождения.

Перенос пакетов MTS в приложения COM+

В Windows NT (or Windows 9x) компонентами можно было управлять как частью пакетов (packages) MTS. Будучи частью пакета MTS, компонент мог воспользоваться некоторыми возможностями MTS, например, выполнением транзакций и активацией по требованию. Те же и многие другие возможности доступны также и в COM+, и обратиться к ним из существующих компонентов можно, перенеся в новую среду пакеты MTS, компоненты или то и другое.

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

Можно относительно просто перенести пакеты MTS в COM+, создав с помощью консоли служб компонентов (Component Services Console) новое приложение COM+ и установив переключатель Install Pre-built Application(s) (Установить готовое приложение). Когда мастер установки приложения COM (COM Application Install Wizard) запросит имя существующего приложения, найдите или выберите созданный ранее PAK-файл.

При импорте существующего пакета MTS в новое приложение COM+ диспетчер служб компонентов (Component Services Manager) импортирует также роли (roles) и пытается сопоставить существующую функциональность MTS новой функциональности служб COM+ — включая настройки транзакций и активации по требованию.

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

В следующем разделе обсуждаются некоторые настройки приложений COM+, влияющие на ASP-приложения.

СОВЕТ
За дополнительной информацией о работе с консолью служб компонентов (Component Services Console) обратитесь к справочной системе Windows 2000.

Активация приложений COM+

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

ПРИМЕЧАНИЕ
В этом разделе рассмотрены не все возможные службы COM+, а лишь самые необходимые для разработки ASP-компонентов, например, безопасность, транзакции и объединение объектов. Активация по требованию подробно рассмотрена в разделе «Интерфейс IObjectControl».

Управлять безопасностью ASP-приложения на уровне страницы или ресурса можно с помощью средств безопасности NTFS или средств безопасности IIS. С помощью средств ролевой безопасности приложений COM+ можно добавить и еще один уровень безопасности.

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

Приложение COM+ можно создать по двум различным схемам активации: активации внутри клиентского процесса и активации в изолированном процессе.


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

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

Службы COM+

Компонент, с помощью диспетчера служб COM+ (COM+ Services Manager) установленный как часть приложения COM+, называется сконфигурированным компонентом (configured component). Такой компонент может воспользоваться преимуществами служб COM+, например, поддержкой транзакций и активацией по требованию. Компонент, не установленный как часть приложения COM+ и зарегистрированный с помощью инструментов разработки (например, VB) или утилиты regsvr32.exe, называется несконфигурированным компонентом (unconfigured component). Этот тип компонента использовать в ASP-приложениях можно, но реализовать интерфейс IObjectControl, воспользоваться преимуществами активации по требованию или применить объект ObjectContext для поддержки транзакций нельзя. Можно, однако, как и прежде, обратиться с помощью объекта ObjectContext к встроенным объектам ASP.

Одним из основных доводов в пользу добавления компонента в приложение COM+ является желание применить компонент в транзакциях. Это момент обсуждается в следующем разделе.

Поддержка транзакций

Одна из проблем при работе с компонентами, построенными на основе технологий COM/DCOM, состоит в том, что связь компонентов, особенно удаленная связь, весьма непроста. Выяснение того, успешно ли завершена обработка компонента, что делать дальше и как восстановить задачу, если один из компонентов не смог ее выполнить, а остальные — смогли, может превратить распределенную систему в плохо реализуемую и трудно управляемую.

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

Кроме того, MTS предоставляет менеджеров (managers) и диспетчеров (dispensers) ресурсов, которые управляют данными хранилищ, например, данными баз данных. По сути, любая система баз данных, поддерживающая транзакции OLE, скажем, SQL Server, может участвовать в транзакциях, управляемых MTS. Это означает, что если компонент, участвующий в транзакции, выполняется с ошибкой, то можно отозвать (вернуть к прежнему состоянию) не только его действия и действия других компонентов, но и любое действие, произведенное базой данных.

Все возможности MTS по работе с транзакциями реализованы в службах COM+ и доступны для сконфигурированных компонентов. Отличие состоит в том, что в COM+ (и Windows 2000) присутствует интерфейс IContextState, позволяющий отделить активацию компонента от управления транзакциями. Этот интерфейс способен сигнализировать, собирается ли компонент принять или прервать транзакцию, при этом компонент остается активированным, как было ранее показано в листинге 5.1.

Что такое транзакции?

Если вы имели опыт работы с коммерческими базами данных, например, с Oracle, Sybase и Microsoft SQL Server, то, возможно, знаете, что представляют собой транзакции. Транзакция (transaction) — это одна или несколько задач, некоторым образом логически сгруппированных, причем все задачи, объединенные в данную группу, либо все вместе успешно завершаются, либо все вместе не выполняются, если хотя бы одна из задач внутри транзакции не выполнена. Если транзакция не состоялась, никаких изменений данных, связанных с данной транзакцией, не делается. Если же выполнение транзакции происходит успешно, все изменения данных принимаются. В качестве примера транзакции с несколькими задачами можно привести перевод денег со сберегательного на расчетный счет. Хотя это и похоже на одну транзакцию, в действительности, происходят сразу две транзакции. Первая транзакция состоит в снятии ваших денег со сберегательного счета (то есть они дебетуются на счет), вторая транзакция заключается в переведении этих денег на расчетный счет (то есть они кредитуются на расчетный счет) . Если операция снятия денег со сберегательного счета прошла успешно, а операция по переводу денег на расчетный счет не была выполнена, вы, весьма вероятно, захотите, чтобы целиком вся транзакция была отозвана и начата заново. Транзакции очень существенны для систем, обновляющих несколько структур данных, например, баз данных. Такие обновления, даже основанные на одной операции, должны быть успешно завершены сразу для всех структур данных, именно для того, чтобы обеспечить успешное завершение одной этой операции.

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

Участие компонентов в транзакциях

Компонент может воспользоваться возможностями транзакций COM+, если он удовлетворяет следующим условиям. Во-первых, компонент должен быть внутрипроцессным сервером (то есть DLL). Во-вторых, он не должен быть свободно-поточным. Далее, если компонент создан в Visual С++, он должен реализовать фабрику классов (class factory) и использовать стандартную маршализацию. Кроме того, для компонента нужно будет создать библиотеку типов.

Если компонент удовлетворяет минимальным требованиям, чтобы получить поддержку транзакций, он должен быть зарегистрирован в COM+. В процессе регистрации тип транзакции, в которой участвует компонент, устанавливается в качестве свойства компонента. Например, на рис. 3 показано окно свойств компонента, для которого требуется транзакция, время ожидания завершения которой определено в 10 секунд.

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

Для работы с транзакциями компонент должен ссылаться на экземпляр объекта ObjectContext (или интерфейса IObjectContext) или экземпляр интерфейса IContextState. Пометить компонент как готовый к принятию транзакции можно с помощью метода SetComplete объекта ObjectContext или метода SetMyTransactionVote интерфейса IContextState:

Пометить транзакцию для отзыва можно с помощью тех же интерфейсов:

Транзакции COM+ в действии показаны в примерах главы 9, посвященной созданию ASP-компонентов промежуточного слоя с помощью ADO. В этих примерах транзакции выполняются для обновления баз данных — и это их традиционное применение. Транзакции с базами данных можно выполнять непосредственно (не прибегая к транзакциям COM+) с помощью объекта ADO Connection. Тем не менее, примеры этой главы продемонстрируют, что гораздо удобней наладить взаимодействие компонентов и баз данных посредством транзакций COM+.

Транзакции COM+ можно также использовать для управления взаимодействием с другими ресурсами, например, с сообщениями в очереди сообщений. В главе 13, посвященной работе с компонентами MSMQ, транзакции управляют непрерывным удалением сообщений из очереди по мере получения к ним доступа.

Помимо поддержки транзакций и активации по требованию, службы COM+ могут также обеспечивать резервирование (pooling) компонентов.

Резервирование компонентов

Ранее уже отмечалось, что у интерфейса IObjectControl есть три метода: Activate, Deactivate и CanBePooled. У вас уже была возможность поработать с методами Activate и Deactivate, но для резервирования компонентов важен именно метод CanBePooled.

В случае резервирования объектов при пуске приложения COM+ создается минимальный резерв, или пул (pool), компонентов, и все запросы компонента обслуживаются из этого пула посредством менеджера пула (pool manager). Если менеджер получает запрос большего, чем имеется в пуле, числа экземпляров компонента, он создает другой экземпляр компонента, добавляя его в пул — до достижения максимального размера пула. Если же максимальный размер пула достигнут, запрос ставится в очередь до тех пор, пока компонент не станет доступным.

Компоненты, объединяемые в пул, должны соответствовать определенному набору условий. Во-первых, компонент не должен быть отдельно-поточным. Далее, компонент должен поддерживать агрегирование (aggregation), однако при этом свободно-поточный составитель (Free-Threaded Marshaler, FTM) использоваться не может.

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

Если компонент обращается к ресурсам, он должен реализовать три метода интерфейса IObjectControl — Activate, Deactivate и CanBePooled. Обратиться к ресурсу можно с помощью метода Activate (когда компонент создается на клиентской ASP-странице). Этот ресурс может быть высвобожден при высвобождении компонента клиентом (с помощью метода Deactivate). Кроме того, компонент обязан проверить, находятся ли его ресурсы в состоянии, когда их можно резервировать при деактивации компонента. Если резервирование возможно, метод компонента CanBePooled должен возвратить значение True, в противном случае, компонент должен возвратить значение False, чтобы предотвратить возврат компонента в пул.

Наконец, состояние компонента не должно зависеть от сеанса.

Создать резервируемый компонент можно с помощью Visual C++ (или любого другого языка, поддерживающего свободно-поточную или произвольно-поточную модели). Для демонстрации резервирования объектов создайте с помощью мастера ATL COM AppWizard новый проект Visual С++ и назовите его asp0502. Оставьте установленные по умолчанию параметры для MTS, MFC, заместителя (proxy) и исполнителя (stub).

После генерации файлов проекта добавьте новый компонент с помощью мастера ATL Object Wizard. (Подробно работа с этим мастером рассмотрена в главе 14.) Выберите тип Simple Object (Простой объект). Назовите компонент pooledComponent, на вкладке Attributes (Атрибуты) выберите произвольно-поточную модель и поддержку агрегирования (но не поддержку FTM).

Для поддержки интерфейса IObjectControl добавьте в определения класса в файле pooledComponent.h следующую строку:

Добавьте в данные COM ссылку на карту COM (COM map):

При работе с компонентом вам придется обращаться к интерфейсу IObjectContext и встроенному объекту ASP Response, поэтому добавьте в заголовочные файлы библиотеки типов службы COM+ и ASP следующее:

Следует также добавить прототипы метода интерфейса IObjectControl и ссылку на два закрытых (private) члена данных типа интерфейсов IObjectContext и IResponse (встроенного объекта ASP Response). Полный программный код заголовочного файла для резервируемого компонента показан в листинге 5.3.

Листинг 3. Заголовочный файл резервируемого компонента

// pooledComponent.h : объявление CpooledComponent

#ifndef __POOLEDCOMPONENT_H_
#define __POOLEDCOMPONENT_H_

#include «resource.h» // основные символы
#include
#include

/////////////////////////////////////////////////////////////////
// CpooledComponent
class ATL_NO_VTABLE CpooledComponent :
public CComObjectRootEx ,
public CComCoClass ,
public IObjectControl,
public IDispatchImpl
<
public:
CpooledComponent()
<
>

BEGIN_COM_MAP(CpooledComponent)
COM_INTERFACE_ENTRY(IpooledComponent)
COM_INTERFACE_ENTRY(IObjectControl)
COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()

// IpooledComponent
public:
STDMETHOD(Activate)();
STDMETHOD_(BOOL, CanBePooled)();
STDMETHOD_(void, Deactivate)();

private: CComPtr m_spObjectContext;
CComPtr m_piResponse;
>;

Далее, с помощью вкладки Link (Связь) диалогового окна Project Settings (Настройки проекта) добавьте в список связанных библиотек проекта библиотеку служб COM+ (comsvcs.lib).

Вам придется реализовать три метода интерфейса IObjectControl. В CPP-файле компонента добавьте код, показанный в листинге 5.4. В этом коде экземпляры IObjectContext и IResponse создаются в методе Activate и высвобождаются в методе Deactivate. Кроме того, метод CanBePooled возвращает значение True и помечает, что компонент можно резервировать (помещать в пул).

Листинг 4. Реализация компонентом методов интерфейса IObjectControl

HRESULT CpooledComponent::Activate()
<
HRESULT hr;
CComBSTR bstrProp;
CComVariant vt;
CComPtr pProps; //Свойства контекста

// получение ObjectContext
hr = CoGetObjectContext(IID_IObjectContext,
(void **)&m_spObjectContext);

if (FAILED(hr)) return hr;

// получение ContextProperties
hr = m_spObjectContext
->QueryInterface( IID_IGetContextProperties,
(void**)&pProps );
if (FAILED(hr)) return hr;

// получение свойства Response
bstrProp = «Response»;
hr = pProps->GetProperty( bstrProp, &vt ) ;
if (FAILED(hr)) return hr;

p > hr = piDispatch->QueryInterface( IID_IResponse,
(void**)&m_piResponse );
return hr;
>

void CpooledComponent::Deactivate()
<
m_piResponse.Release();
m_spObjectContext.Release();
>

BOOL CpooledComponent::CanBePooled()
<
return TRUE;
>

Откомпилируйте теперь компонент, чтобы убедиться, что необходимый программный код и библиотеки добавлены.


С помощью вкладки ClassView (Просмотр классов) добавьте новому компоненту не принимающий никаких параметров метод testPooledComponent. Этот метод прост: он выдает с помощью объекта Response сообщение для web-страницы. Добавьте компоненту программный код метода, показанный в листинге 5.5.

Листинг 5. Единственный метод резервированного компонента

STDMETHODIMP CpooledComponent::testPooledComponent()
<
// печать сообщения
CComVariant vt(«Привет от резервированного компонента»); m_piResponse->Write(vt);

Чтобы воспользоваться резервированием компонентов, компонент нужно добавить в приложение COM+. Создайте новое приложение — с помощью консоли управления службами компонентов (Component Services Management Console) — или воспользуйтесь существующим приложением COM+ и добавьте компонент в приложение.

Добавив компонент в приложение COM+, откройте с помощью контекстного меню диалоговое окно Properties (Свойства) и перейдите на вкладку Activation (Активация). Установите флажок объединения компонентов, задайте минимальный размер пула 10, максимальный — 20.

При первом запуске приложение COM+ создает пул из 10 уже созданных компонентов. При обращении с ASP-страниц к этим компонентам они извлекаются из этого пула до тех пор, пока все не будут активированы. После этого все новые вызовы компонентов будут добавлять экземпляры этих компонентов в пул, пока не будет достигнут максимальный размер пула в 20 экземпляров.

Протестируйте компонент с помощью следующей тестовой ASP-страницы (asp0502.asp):

На этой странице создаются 20 экземпляров компонента и вызывается метод каждого из компонентов. Результатом обращения к этой ASP-странице будет список сообщений со строкой «Привет от резервированного компонента». Первые 10 экземпляров были созданы при запуске приложения COM+, а последние 10 — при обращении к ASP-странице.

Измените теперь число экземпляров на 21 и обратитесь к ASP-странице. Похоже, она виснет. Это происходит потому, что менеджер пула выдал все компоненты из доступного пула, вследствие чего достигнут максимальный размер пула. Запрос 21-го компонента ставится в очередь до тех пор, пока какой-нибудь компонент не освободится. Но поскольку до завершения страницы все компоненты остаются недоступными, а запрос компонента происходит на той же самой странице, экземпляр 21-го компонента не может быть создан, и страница зависает. Фактически страница будут продолжать висеть до истечения времени ожидания запроса компонента. После этого страница выведет следующее сообщение об ошибке («активация COM+ не удалась, поскольку она не может быть завершена в течение заданного времени»):

COM+ activation failed because the activation could not be
completed in the specified amount of time.

Как было показано, резервирование объектов может служить весьма мощным ускорителем производительности, но оно же может и ограничить масштабируемость (scalability) или истощить ресурсы (поскольку резервируемые компоненты удерживаются в памяти). Пользуйтесь этой службой COM+ с осторожностью.

Asp службы транзакций asp

Многие компании-разработчики ПО (включая IBM, Microsoft, Sun и Oracle) предвидят такое будущее развитие технологий, при котором потребителям не надо будет приобретать и инсталлировать программное обеспечение на персональном компьютере — все необходимое будет находиться и скачиваться из Интернета. Это сможет революционизировать индустрию, устранив проблемы с установкой программ, необходимость апгрейда и т.п.

Aplication Service Provider — Провайдер Прикладных Услуг или, как принято говорить, более определенно и развернуто, «Провайдер услуг доступа к приложениям», — это компания, предоставляющая в аренду и обслуживающая необходимый потребителю набор приложений (а это установка, поддержка и сопровождение приложений) на удаленной технологической площадке.
Application Service Providing — это технология, позволяющая создавать решения на основе удаленного доступа к серверу, на котором установлено специальное программное обеспечение.

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

  • либо через Интернет,
  • либо по локальной сети,
  • либо по защищенной выделенной сети.

Сама по себе идея удаленного доступа к приложениям, исполняемым в вычислительных центрах коллективного пользования, услуги которых «раздаются» клиентам, не нова. Новое на этом витке – Интернет и рыночные принципы работы. В сфере электронной розничной торговли технология ASP воплотилась, в частности, в услугу аренды Интернет-магазинов. Именно аренда приложений лежит в основе новой стратегии Билла Гейтса — .NET, которая предполагает развитие различных Web-услуг, начиная от предложения приложений и заканчивая электронной коммерцией. По модели ASP работает движок DART компании DoubleClick, уже ставший стандартом в области средств управления рекламными кампаниями на расстоянии.

Все об ASP
aspassociation.com
ASP консорциум
allaboutasp.org
www.platzdarm.ru — общий аналитический обзор ASP-рынка.
www.aspbusiness.ru — сайт про ASP
www.e-commerce.ru- об ASP на сайте e-commerce.ru

Задачи, на которые нацелены услуги ASP :

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

Управление приложениями и весь документооборот осуществляется через web — интерфейс или по e-mail.

Преимущества использования ASP-услуг

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

Возможности оплаты ASP-услуг

  • по числу транзакций,
  • по количеству запусков программы,
  • по времени пользования услугой,

Основные проблемы ASP

  • Проблема информационной безопасности коммерческой организации. Для того, чтобы доверить сторонней организации обслуживание своих систем: бухгалтерии, финансовых процессов, офисных приложений и др. необходимо доверять поставщику услуг.
  • Проблема хакерских атак. При сосредоточении большого числа магазинов на одном сервере с единой системой защиты делает эти серверы привлекательной мишенью для хакеров.
  • Проблема гарантий качественной бесперебойной связи. Так как работа с приложением происходит по каналам связи, то важно их качество. При потере данных (полной или частичной) коммерческая компания может понести ощутимые убытки.
  • Проблема ответственности провайдера услуг при остановке или сбоях в работе сервера за бизнес своих клиентов.
  • Необходимость системы страхования рисков электронного бизнеса, Cтрахование ответственности ASP остается серьезной проблемой. поскольку первые прецеденты страхования IT-рисков на российском рынке появились только в 2001 году.
  • Проблема отношений «третьих лиц» с государством в условиях коллективного доступа. Что будет, если люди в черных масках придут в центр коллективного доступа за одним из его клиентов, опечатают и унесут с собой все сервера, остановив бизнес всех клиентов центра. Где должен находиться центр коллективного доступа в России или за границей.

  • ASP — провайдер несет ответственность за работоспособность размещенных систем, их безопасность и доступность согласно Соглашению об уровне сервиса (SLA-Service Level Agreement ), которое подписывается с каждым заказчиком и где фиксируются величины ключевых параметров функционирования( максимальное время простоя оборудования, степень защиты, штрафные санкции, которые могут быть применены к ASP и др.). В случае несоблюдения или непредоставления сервисов надлежащего качества клиенту выплачиваются материальные компенсации. На практике поставщики всячески стараются сузить круг фиксируемых в нем параметров, а для заказчика мониторинг этих параметров порой превращается в настоящий кошмар.

Типы программного обеспечения, чаще всего предлагаемые на рынке ASP

Примеры бесплатных ASP-решений:

Служба для организации мобильного Интернет-офиса
www.beep.ru — Гран-при конкурса «Бизнес-сайт’2000»
Основа для построения интернет/интранет решений для организации совместной работы и общения практически неограниченного числа пользователей. Можно организовать систему для корпоративной почты и корпоративной работы над документами.
Средство для организации совместной работы и общения пользователей.
Механизм групп позволяет создавать приватные или публичные сообщения в рамках beep.ru. Группы обладают:
— коллективным почтовым адресом. Система почты интегрирована с адресной книгой и еженедельниками.
— коллективным хранилищем документов,
— собственными web-форумами (конференциями).
Возможный доступ ко всем компонентам мобильного Интернет-офиса:
— непосредственно через web- интерфейс с офисного или домашнего компьютера, с карманного компьютера:
— с клиентских почтовых программ;
— с сотовых телефонов с wap-браузерами.
Приходяшая корреспонденция и напоминанмя о запланированных делах также могут копироваться на пейджеры или сотовые телефоны в виде текстовых сообщений.

www.Narod.ru — cервис создания бесплатных сайтов.
www.stavka.ru -сервис бесплатного создания интернет-аукциона.
www.Parking.ru -сервис «Готовый сайт», в рамках которого можно арендовать удобное средство для быстрого создания и сопровождения современных сайтов — Metric Site Optimizer.
www.applications.ru — демонстрация решений компаний Oracle, IBM и Avicomp Service AG, и в первую очередь, ERP-системы — Oracle Applications на сервере IBM RS/6000

Прогноз аналитиками Gartner(март 2003): к 2006 году 30 % IT-функций предприятий будет возложено на внешних исполнителей, действующих по принципу коммунальных служб с оплатой по мере использования.

ASP — проекты для крупных коммерческих решений.

Многие компании стали чаще задумываться о повышении своей эффективности благодаря информационным технологиям. Происходит универсализация бизнес-процессов в компаниях, появляются стандартизированные решения для этих задач. Модель аренды информационных ресурсов и аутсорсинг(внешняя поддержка и управление) все чаще будут задействованы в работу IT-служб. Отдавая на аутсорсинг решение тактических задач, компании смогут сосредоточиться на стратегических. При использовании внешних служб поддержки корпоративных данных, выбор варьируется от простого размещения сервера до полного обеспечения работы трехуровневой системы, включающей как внешние так и внутренние базы данных. При размещении приложений, критически важных для бизнеса, требуется широкий спектр услуг (мониторинг, архивирование, обеспечение безопасности и т.д.), поддержка SLA.
Все больше поставщиков решений предоставляют лицензии в режиме ASP. На текущий момент практически все крупные мировые поставщики программного обеспечения предлагают свои продукты по модели ASP. Среди них: Oracle, Microsoft, SAP, PeopleSoft, Siebel, Ariba, Commerce One и другие. Развивается рынок ASP — сетевых приложений, позволяющих группе сотрудников работать с распределенными данными. По мнению экспертов, ASP-модель уже в недалеком будущем составит конкуренцию традиционной модели поставки ERP- и CRM-решений. В ASP-схемах для крупных коммерческих решений ( например ERP-систем типа SAP R/3 или Axapta, CRM, SCM, биллинговых и некоторых других систем) необходима настройка на конкретное предприятие, на его бизнес-процессы.
Проблему закрытия корпоративной информации из конкурентных соображений можно решить, разделив корпоративную информационную систему на две части: оперативный учет, систему управления текущими производственными процессами отдать на ASP, а аналитику держать у себя на собственном сервере.

CRM-решения на базе ASP перечислены в статье «Обзор поставщиков CRM-решений на российском рынке». Некоторые CRM-решения поддерживают работу даже через карманные компьютеры (PDA).

mySap.com- ASP портал компании SAP, предоставляет доступ к приложениям для вертикальных рынков (приложения для компаний, специализирующихся на разных фазах производства и реализации конечного продукта). В портале эксплуатируются не только ERP компании SAP, но и приложения от независимых разработчиков.
Oracle начала заниматься Веб-арендой бизнес-приложений в 1998 году. Весной 2002г. веб-арендой от Oracle пользовались 200 компаний. За следующие 5 лет Oracle намерена перевести на веб-аренду 25% из своих 12 тыс. клиентов. Oracle также предлагает веб-аренду своей СУБД Oracle9i. Целью этого проекта является предоставление возможности использовать СУБД Oracle компаниям с небольшим IT-бюджетом, которые раньше не могли себе позволить покупку данного ПО или использовали его нелегально.

Проект DATA FORT www.datafort.ru компании IBS и международного телекоммуникационного холдинга Cable & Wireless — это первый действующий в России ASP-провайдер систем высокого уровня и инфраструктуры для крупных коммерческих решений(это идея предлагать в аренду торгово-закупочные площадки и корпоративные системы управления). http://b2b.ibs.ru
Технологической площадкой, на базе которой разместился DATA FORT, стал недавно построенный Центр обработки данных Cable & Wireless. Коммерческая эксплуатация DATA FORT начата в октябре 2001 года. Компания DATA FORT сейчас работает с несколькими производителями ПО. DATA FORT являемся одним из первых ASP-партнеров компании Microsoft и партнером для компаний Oracle, Navision, Integral Solutions Corporation (ISC) , Siebel в России. С сентября 2002г. DATA FORT размещает у себя на платформе Unix электронную торговую площадку Matisse.ru, где совершаются сделки с местами и блоками мест на чартерных авиарейсах. DATA FORT предоставляет на льготных условиях СУБД Oracle в режиме аренды, обеспечивает антивирусную защиту, круглосуточный контроль работоспособности системы, полное ежедневное резервное копирование открытой базы данных и архивных журналов, а также хранение резервных копий. Таким образом, обеспечивается легальность эксплуатации ПО Oracle.

В настоящее время услуги по аренде несложных приложений уже оказывает несколько компаний, например «Гарант-Парк-Интернет», предлагает в рамках проекта PARKING.RU продукты компании Microsoft и некоторые собственные разработки. В частности решение MicrosoftR SharePointTM Team Services — возможность создания специализированных web-порталов — средства для коллективной работы над документами членам команды, реализующей единый проект, а также для организации доступа удаленных сотрудников или групп к ресурсам этого проекта через Интернет.

Другие российские компании готовятся к выходу на рынок ASP. Например компания Sterling Group в качестве полигона для обкатки единой ERP-системы SAP R/3 использует одиннадцать своих региональных филиалов, находящихся за тысячи километров друг от друга и от центрального офиса в Москве. Проверяется и вариант зарубежного, открытого фирмой в Женеве , центра коллективного доступа. Таким образом компания выявляет на себе плюсы и минусы модели ASP.

В России есть аутсорсинг бизнес-процессов в бухгалтерии, и он очень активно развивается.

API транзакций и ASP.NET

Надеюсь, что кто-то из вас был там. Мне нужно сделать некоторые вещи базы данных, которые включают несколько таблиц. Я использую SubSonic 3 SimpleRepository для обновления/доступа к записям. Теперь между вызовами для обновления таблиц я вызываю методы System.Web.Security.Roles , чтобы сделать некоторый поиск. Я использую единственный объект репозитория для выполнения всех обновлений DAO, но когда мой код попадает в User.IsInRole(«blahblah») , он выдает исключение MSDTC is not available on the server .

Я понимаю, что это происходит, потому что SimpleRepository использует другое соединение, а объекты Membership API используют другое соединение.

Есть ли способ обойти это или мне нужно обернуть объекты Membership API в свои собственные классы?

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

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

HttpContext.Current.User.IsInRole() вызывает RolePrincipal.IsInRole() для пользователя, прошедшего проверку подлинности через FormsAuthentication. Внутренне RolePrincipal.IsInRole() вызывает SqlRoleProvider.GetRolesForUser() , который создает и уничтожает объект SqlConnection внутри метода.

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

  • Внедрите собственный поставщик ролей, чтобы вы могли самостоятельно управлять подключениями к базе данных.
  • Внедрите свой собственный объект IPrincipal , чтобы вы могли самостоятельно управлять подключением к базе данных.
  • Предварительно выберите роли перед началом транзакции SubSonic и проверьте список для соответствующей роли по мере необходимости.
  • Возможно, вам даже не нужно сохранять роли, поскольку RolePrincipal.IsInRole() кэширует роли при его вызове и только выходит в базу данных, если кеш пуст или недействителен. Вызов IsInRole() до начала транзакции будет предварительно заполнять кеш объекта RolePrincipal , что означает, что последующие вызовы в середине транзакции SubSonic будут вытаскивать роли из кеша вместо подключения к базе данных для их получения.

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

Лекция 1. Что такое ASP.NET. Инсталляция и тестовый проект.

Введение

Microsoft .NET Framework — это платформа для создания, развертывания и запуска Web-сервисов и приложений. Она предоставляет высокопроизводительную, основанную на стандартах, многоязыковую среду, которая позволяет интегрировать существующие приложения с приложениями и сервисами следующего поколения, а также решать задачи развертывания и использования интернет-приложений. .NET Framework состоит из трех основных частей — общеязыковой среды выполнения (common language runtime), иерархического множества унифицированных библиотек классов и компонентной версии ASP, называемую ASP.NET.

ASP.NET – это часть технологии .NET, используемая для написания мощных клиент-серверных интернет приложений. Она позволяет создавать динамические страницы HTML. ASP.NET возникла в результате объединения более старой технологии ASP (активные серверные страницы) и .NET Framework. Она содержит множество готовых элементов управления, используя которые можно быстро создавать интерактивные web-сайты. Вы также можете использовать сервисы, предоставляемые другими сайтами, прозрачно для пользователей вашего сайта. В общем, возможности ASP.NET ограничены только вашим воображением.

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

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

Но что, если мы хотим отобразить на странице текущий курс евро или прогноз погоды? Если мы написали страницу HTML вчера, сегодня она уже устареет. Следовательно, мы должны уметь создавать динамические страницы. Динамическое наполнение страницы – это информация, содержание которой определяется тем, кому она предназначена, и которая отличается от просмотра к просмотру. Оно позволяет обеспечить двусторонний обмен информацией – от клиента к серверу и обратно.

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

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

Существуют языки, способные динамически изменять содержимое веб-страницы. С одной стороны, это языки скриптов, выполняющиеся непосредственно у клиента. Примеры скриптовых языков — JavaScript и VBScript. Скрипты на этих языках встроены в код HTML, который сервер посылает браузеру. Сценарии, выполняемые на стороне клиента, выделяются тегами и . Браузер интерпретирует этот код и показывает пользователю результат. Сам код можно просмотреть через View Source браузера. Естественно, эти программы не могут быть большими. Например, если нужно выполнить поиск в базе данных, мы не может отправить пользователю все ее содержимое. Но скрипты могут проверить правильность запроса, введенного в форму, тогда не придется перезагружать сервер обработкой неправильных запросов. Некоторые программисты создают на JavaScript анимационные эффекты. Одна студентка intuit.ru желала найти скрипт, который бы отправлял SMS-сообщения. Увы, это невозможно. Выполняемых на стороне клиента сценариев недостаточно для создания полноценных динамических страниц. Даже если на странице используется JavaScript, анимированные картинки .gif, она называется статической.

Динамическая веб-странице должна быть создана «на лету» программой, исполняющейся на интернет-сервере. Широко применяются механизм шлюзов CGI(Common Gateway Interface). Вначале пользователь получает статическую страницу с формой. Вам известно, что в теге FORM существует атрибут ACTION. Именно он задает адрес (URL) исполняемого приложения. На сервере находятся исполняемые файлы программ, написанных, например на C/С++ или Дельфи, которые по протоколу HTTP принимают данные из входного потока или из переменных окружения и записывают в стандартный выходной поток готовую страницу.

Пользователю в ответ на запрос посылается HTML код, который был специально сгенерирован для него. Это может быть, например, результат поиска в поисковой системе. CGI -скрипты могут быть написаны на интерпретируемом языке (Perl) или даже скрипте командной строки. Входной и выходной потоки переназначаются. На вход интернет-сервер принимает данные, введенные пользователем. После обработки полученных данных, пользователю возвращается результирующая страница. При исполнении cgi-программа загружается в память сервера, а при завершении – удаляется. Когда 100 клиентов одновременно обращаются к серверу, в памяти создаются 100 процессов, для размещения кода каждого из которых нужна память. Это отрицательно сказывается на масштабируемости. Напомним, что масштабируемость — это возможность плавного роста времени ответа программной системы на запрос с ростом числа одновременно работающих пользователей.

Для решения это проблемы Microsoft была предложена альтернатива – ISAPI(Internet Server Application Programming Interface)-расширения и фильтры. Вместо исполняемых файлов используются DLL – библиотеки. Код DLL находится в памяти все время и для каждого запроса создает не процессы, а нити исполнения. Все нити используют один и тот же программный код. ISAPI –приложение выполняется в процессе IIS-сервера. Это позволяет повысить производительность и масштабируемость.

ISAPI-расширения можно создавать в Visual Studio C++ 6.0, пользуясь мастером.

У ISAPI тоже есть недостатки, относящиеся к разработке. Если мы меняем исходный код dll, мы должны его откомпилировать и поместить в исполняемую директорию сервера. Но так как предыдущий вариант dll находится в памяти, необходимо остановить сервер, чтобы получить доступ на изменение файла. В это время клиенты не смогут получить в сервера ни один документ, и, конечно, будут не удовлетворены.

Скриптовые языки, исполняющиеся на стороне сервера – php и asp. Технология asp была разработана Microsoft в 90-х годах.

Выполнение кода asp поддерживается ISAPI-расширением сервера. В диалоге конфигурации сервера IIS определяются способы обработки файлов с различными расширениями. Для обработки URL-адреса с расширением в установках сервера определен файл asp.dll. Файлы asp отправляются к нему на обработку. На вход поступает asp, а на выходе имеем поток HTML-кода.

Пример файла asp:

Тег сигнализирует asp, что в нем находится код, который он должен обрабатывать на сервере. Выполняется скрипт на языке, который указан в директиве Language. Оператор Response.Write записывает текст в выходной поток сервера, таким образом, он становится частью HTML-страницы, отправленной пользователю.

Технология asp была ограничена по своим возможностям. Он использовал скриптовые языки, которые имеют меньше возможностей, чем полнофункциональные языки программирования. Код asp был встроен в HTML в виде специальных тегов, что создавало путаницу. Кусочки asp были разбросаны по нему, как изюм в булке. Но HTML код обычно создают дизайнеры, которые умеют «делать красиво», а asp – программисты, которые заставляют все это работать. В ASP.NET вы можете держать код asp и HTML в разных файлах.

Скриптовые языки не поддерживают строгую типизацию. Что это значит? Вы можете не описывать переменную до ее использования и можете присваивать ей значения разных типов. Это удобно, но создает почву для ошибок. Например, у вас есть переменная x1, и вы присваиваете ей значение 1, но вы сделали опечатку и по ошибке написали x2=1. Будет создана новая переменная x2, а значение x1 не изменится. В языке со строгой типизацией компилятор заметит, что переменная x2 не описывалась, и выдаст ошибку.

В 2000 году на конференции разработчиков в качестве части новой технологии .NET Microsoft представила ASP+. С выходом .NET Framework 1.0 она стала называться ASP.NET.

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

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

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

Платформа .NET Framework предоставляет приложениям среду выполнения, сама непосредственно взаимодействуя с операционной системой. Выше лежит интерфейс ASP.NET приложений, на котором в свою очередь базируются веб-формы (ASP.NET страницы) и веб-сервисы. Интерфейс .NET Framework позволяет стандартизировать обращение к системным вызовам и предоставляет среду для более быстрой и удобной разработки. CLR обеспечивает единый набор сервисов для всех языков.

ASP.NET использует технологию доступа к данным ADO.NET, которая обеспечивает единый интерфейс для доступа к базам данных SQL Server и файлам XML. Кроме того, усиленная модель безопасности позволяет обеспечивать защиту клиента и сервера от несанкционированного доступа.

В 2004 году появилась версия ASP.NET 2.0(бета-версия, окончательный выход – конец 2005-начало 2006). Как утверждается, эта версия позволяет сократить объем кодирования на 70%. Новые возможности версии 2.0 – например, использование шаблонов дизайна страниц(Master Page), упрощенная локализация Web-приложений, более 50 новых серверных элементов управления. Цели, которые преследовали разработчики новой версии – повысить скорость разработки сайтов, масштабируемость, легкость поддержки и администрирования сайтов, скорость работы сервера. Появилась панель остнастки MMC (консоль управления Microsoft), предоставляющая графический интерфейс для управления настройками ASP.NET. Изменять настройки проекта теперь можно и через web-интерфейс. ASP.NET 2.0 поддерживает работу на 64-битных процессорах. Сервис персонализации (personalization) предоставляет готовое решение для хранения персональных данных, непосредственно характеризующих пользователя сайта, так называемого профиля пользователя (Profile).

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

Предыдущие версии Visual Studio для проектов ASP.NET требовали наличия на машине разработчика сервера IIS. Теперь сервер встроен в среду разработки.

ASP.NET 2.0 и Visual Studio 2005 предоставляют инструменты для легкого построения локализируемых сайтов, которые определяют предпочитаемый язык пользователя и посылают ему страницы на его языке.

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

В ASP.NET 2.0 встроена технология автоматического обновления кэширования баз данных. Данные, полученные из базы, хранятся на сервере и он не обращается к базе для обработки повторного запроса. При изменении базы данных кэш обновляет свое содержимое.

ASP.NET — это технология, а не язык, и позволяет программировать на разных языках – С#, Visual Basic, J#. В платформе .NET все языки равны, но некоторые равнее(Дж. Оруэлл). Вот таким языком и является С#, потому что он был специально создан для этой платформы. Программирование C# позволяет в полной мере использовать концепции, методы и паттерны объектно-ориентированной разработки. Язык Visual Basic 8.0 наделен почти теми же возможностями. Чтобы научиться ASP.NET, вам нужно знать основы HTML, а знание asp не обязательно. Оно может даже помешать, так как придется менять образ мышления. Также для понимания многих желательно знать CSS и JavaScript.

Процесс инсталляции

ASP .NET 2.0 можно установить на компьютерах с ОС Windows 2000 с Service Pack 4, Windows XP с Service Pack 2 и более поздними версиями Windows. Готовые сайты предпочтительно устанавливать на Windows Server 2003.

Для разработки приложения можно использовать любую среду разработки или даже текстовый редактор, при условии, что у вас есть доступ к IIS. Если же вы хотите воспользоваться всей мощью Microsoft .NET Framework и ASP.NET и при этом, затратить как можно меньше усилий, то нужно воспользоваться средой разработки, специально разработанной для программирования ASP.NET 2.0.

Если вы приобретете Visual Studio .NET 2005, то для работы достаточно будет только его. .NET Framework содержится на дисках. В его состав входит Visual Web Developer, который позволяет создавать профессиональные веб-приложения, а также desktop-приложения на разных языках программирования. Продукты Microsoft выпускаются на DVD, но есть набор из двух CD от «Мегасофт». Visual Studio .NET 2005 требует около 2 Гигабайт дискового пространства. При этом инсталлируется ASP.NET 2.0, среда разработки, SQL Server Express, встроенный веб-сервер, Crystal Reports со специальными элементами управления для ASP.NET 2.0.
Бесплатно распространяемое программное обеспечение.

Visual Web Developer 2005 Express Edition – свободно распространяемая среда предназначенный для новичков и студентов, доступная по адресу http://msdn.microsoft.com/vstudio/express/vwd/. Список отличий VWD от Visual Studio.NET 2005 невелик и для начинающих несущественен, он приведен здесь: http://msdn.microsoft.com/vstudio/products/compare/default.aspx

Инсталлятор VWD имеет объем 2,8 Мб, но в процессе инсталляции он загрузит еще 40 Мб и 80 Мб, если захотите установить документацию. При этом также будет установлен .NET Framework с ASP.NET 2.0.

Системные требования – процессор с минимальной скоростью 600 МГц, 128 МБ памяти и 1.3 ГБ дискового пространства. После инсталляции нужно будет зарегистрировать свою установку, это совершенно бесплатно.

В качестве среды разработки вы можете выбрать WebMatrix. Эта программа совмещает в себе редактор и http-сервер. Ее можно загрузить на http://www.asp.net/WebMatrix.

У WebMatrix инсталлятор размером всего 1.2 Мб, но у него меньше возможностей, чем у VWD. Но, в общем, эти среды разработки похожи. У WebMatrix есть неприятная особенность – она дает запрос на сохранение во время закрытия файлов, которые не редактировались. VWD Express позволяет одним нажатием кнопки открыть Web-интерфейс конфигурирования проекта. В VWD работает технология IntelliSense, которая автоматически предлагает возможные в данном месте элементы кода.

Если вы решили работать с WebMatrix, вы должны установить на своей машине .NET Framework 2.0 и ASP.NET 2.0.

Если у вас операционная система Windows Server 2003, то .NET Framework уже предустановлен. Вы можете проверить, есть ли вас директория %WINSDIR%Microsoft.NETFramework. Если нет, вы можете ее загрузить на сайте Microsoft. Последние версии находятся по адресу http://msdn.microsoft.com/netframework/downloads/updates

На данный момент это .NET Framework 2.0, но к моменту, когда вы будете читать эту лекцию, могут появиться более новые версии. Вы можете скачать новую версию, даже если у вас уже есть другая. Они будут существовать на компьютере одновременно в поддиректориях %WINSDIR%Microsoft.NETFramework, с именем, соответствующим номеру версии. Можно сказать, что каждая версия представляет собой сборку. Система версий поддерживается для всех приложений, созданных с использованием .NET Framework.

Там вы увидите ссылки на .NET Framework для разных архитектур компьютера.

При желании загрузите .NET Framework Version 2.0 SDK, которая содержит наряду с .NET Framework Version 2.0 SDK документацию и примеры, которые могут оказаться полезными.

По адресу http://asp.net/default.aspx можно найти много полезных для разработчиков программных продуктов, примеров кода и статей.

IIS(Internet Information Server) находится на инсталляционном диске Windows 2000/XP, но предустановлен только на серверах. Его можно установить, зайдя в Control Panel->Add or Remove Programs->Add/Remove Windows Components. Компьютер попросит вас вставить инсталляционный диск.

IIS может понадобиться, если вам нужен полноценный сервер для работы в интернет, а не просто на своем компьютере или в локальной сети или вы решили набирать текст в обычном редакторе. Для работы на своем компьютере во все эти среды разработки встроен сервер Cassini, который первоначально появился как часть WebMatrix. Символ WebMatrix – планета Сатурн, а Кассини — известный исследователь Сатурна. Предыдущие версии Visual Studio требовали наличия IIS, но теперь Cassini встроен и в Visual Studio 2005, что позволяет работать даже в Windows XP Home Edition.

Примеры будут даваться как для WebMatrix, так и Visual Studio. Некоторые примеры требуют VWD Express или Visual Studio.
Сообщества разработчиков.

Через меню помощи Visual Web Developer Express можно зайти на сайты форума по ASP.NET. А вот адреса сайтов на русском языке:

* http://www.aspnetmania.com
* http://www.gotdotnet.ru/
* http://www.sql.ru/
* http://dotsite.ru/
* http://www.rsdn.ru/

Вы можете завести пробный хостинг на http://europe.webmatrixhosting.net/russia/default.aspx.

Первый проект

Вначале решите, в какой директории будете создавать страницы. Все файлы, находящиеся в одной директории, считаются единым проектом.Запустите выбранную вами среду разработки. Выберите пункт меню File-New-Website. Появится диалоговое окно. Назначьте в нем имя проекта и выберите язык программирования С#.

По умолчанию проект создается в файловой системе. По желанию его можно создать на HTTP или FTP-сервере. Из файловой системы проект всегда можно скопировать на сервер нажатием одной кнопки в заголовке Solution Explorer.

В проекте будет создана страница default.aspx. Выберите ее, и появится окно редактирования с закладками Design и Source. Не меняя ничего, щелкните на кнопке со стрелкой, чтобы просмотреть страницу в браузере. Появится окно, котором спрашивается, нужно ли добавить в файл web.config возможность отладки. Нажмите OK. На панели задач должен появиться значок веб-сервера. Откроется браузер, показывающий страницу по адресу http://localhost:номерпорта/Website1/default.aspx. localhost обозначает сервер, работающий на вашем компьютере. Встроенный сервер Cassini сам назначает себе номер порта – для каждого проекта он разный. Сервер IIS обычно работает через порт 80(или 8080, если тот занят), и для него номер порта указывать не нужно. При этом ваша страница будет скомпилирована.

Пока что страница в бразере пустая.

Но исходный код этой страницы не пустой. Программа сгенерировала код для вас.

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