Книга
Книга
Глава 1 ВВЕДЕНИЕ В .NET1
Большой Интернет1
Поднимаем планку: общие проблемы инфраструктуры3
Планы, составленные наилучшим образом5
И все же, что это за NET?7
Об этой книге10
Предостережение: ознакомительноеПО12
Песнь Интернету13
Глава 2 ОБЪЕКТЫ .NET17
Суть проблемы17
Архитектура решения22
Вот так... И почем все это?26
Простейший пример27
Подробнее о пространствах имен .NET34
Сборки38
Понятие сборки38
Сборки и развертывание41
Сборки и управление версиями46
Особенности объектно-ориентированного программирования ... 50
Наследование51
Конструкторы объекта57
Управление памятью в NET59
Взаимодействие с СОМ68
Использование объектов СОМ из программ .NET68
Использование объектов .NET из СОМ74
Транзакции в .NET76
Структурная обработка исключений79
Безопасность доступа к коду86
Глава 3 ASP.NET97
Суть проблемы97
Архитектура решения101
Простейший пример: создание простой страницы
ASP.NET105
Еще кое-что об управляющих элементах Web109
Управление и настройка проектов Web-приложений: файл Web.config118
Управление состоянием в ASP.NET121
Безопасность в ASP127
Аутентификация128
Windows-аутентификация130
Cookie-аутентификация на основе форм131
Passport-аутентификация135
Авторизация140
Идентификационные данные144
Управление процессом149
Глава 4 WEB-СЛУЖБЫ .NET153
Суть проблемы153
Архитектура решения158
Простейший пример: создание Web-службы161
СамоописываемостьWeb-служб: WSDL-файлы167
Создание клиента Web-службы1 71
Случай 1: HTTPGET171
Случай 2: HTTP Post172
Случай 3: необработанный Soap173
Случай 4: синхронная работа интеллектуального SOAP-прокси175
Случай 5: асинхронная работа интеллектуального прокси SOAP178
Поддержка Web-служб вVisual5tudio.NET181
Управление состоянием Web-службы185
Глава 5 WINDOWS FORMS187
Суть проблемы187
Архитектура решения190
I Простейший пример192
Более сложный пример: события и элементы управления195
Создание собственных элементов управления Windows Forms.. 199
Размещение элементов управления ActiveX
в приложениях Windows Forms204
Эпилог и благословение209
Предметный указатель211
Об авторе219
Вступление
Я познакомился с Дэвидом Платтом в 1998 г., когда обдумывал свою книгу о СОМ. Мой предполагаемый редактор также редактировал книгу Платта «COM and ActiveX Workbook» и дал мне ее экземпляр, чтобы я посмотрел, что публиковалось на эту тему раньше. Я нашел ее замечательной и очень подробной. (На самом деле тогда я в глаза не видел Дэйва, но ведь прочитать чью- то книгу — это все равно, что познакомиться с ее автором.)
Прошло несколько лет (а я так и не выпустил ни одной книги о СОМ и DCOM по причине болезни), и я встретил Дэйва в своем офисе в Microsoft, на сей раз во плоти. К тому времени у меня была возможность прочитать его прекрасную книгу о СОМ + , чего и вам советую. Я ждал этой встречи! Мне хотелось узнать такой ли он веселый и интересный, как и его последняя книга. Он превзошел мои ожидания.
Стиль Дэйва изменился со времен его ранних книг. В книге о СОМ+, как и в этой, много весьма непосредственных моментов и читать их очень весело. V него особый литературный стиль, хотя я и догадываюсь, что вы скажете: «Литературный стиль? Да ведь это компьютерные книги!»
Знаете, я иной раз задумывался о классификации книг по программированию и выделил три их типа.
Основательные книги с большим объемом кода; в них обычно освещается одна конкретная тема. К этой категории относится книга Дэйва о СОМ и ActiveX. Такие книги отвечают на вопрос «как?»
Книги с очень глубоким анализом рассматриваемого предмета и небольшим объемом кода, например, книга Дона Бокса (Don Box) о технологии СОМ. Такие издания отвечают на вопрос «зачем?»
• Книги-размышления. В них даетсялегкий для понимания обзор предмета и немного кода. При этом они не пытаются объяснить все и вся, как книги первой категории, и не погружают в предмет так глубоко, как книги второй. Их цель почти метафизическая: для понимания предмета вооружить вас подходом, подобным дзэн. Эти книги учат вас, когда задавать вопрос《как?», а когда — «зачем?»
«Знакомство с Microsoft .NET» — безусловно, книга последнего типа. Ее очень приятно читать, она информативна и содержит много интересного кода. Она формирует отношение к .NET и, поверьте, делает это отлично. Чтобы стать специалистом no .NET вам потребуется изменить свой образ мышления. Но это не так уж сложно, и книга, которую вы держите в руках, — первый шаг в этом направлении.
Кэйт Болинджер (Keith Ballinger) Менеджер программы NETFramework Microsoft Corporation
PS Меня всегда интересовало, что заставляет людей читать вступления. Если с вами это случилось, помогите мне в моих исследованиях, напишите мне по адресу keithba@microsoft.com. О результатах сообщу.
Предисловие
Я всегда считал, что продукт, который сейчас называется Microsoft NET, — это круто. Я помню статьи Мэри Киртлэнд (Mary Kirtland) в ноябрьском и декабрьском номерах Microsoft Systems journal за 1997 г. В них описывалось то, что тогда называлось COM+, — среда периода выполнения, предоставляющая разные полезные ВОЗМОЖНОСТИ вроде межъязыкового наследования и контроля доступа в период выполнения. Мне, помешанному на СОМ, понравились способы, которыми эта среда обещала ре- ILUUIb массу бесивших меня проблем СОМ.
Затем в Microsoft решили, что следующая версия Microsoft Transaction Server будет называться COM4 1.0 и будет интегрирована с Windows 2000, а то, о чем писала Мэри, будет СОМ+ 2.0. Позднее Microsoft переименовала СОМт в Microsoft .NET и для всей этой возни я выдумал новый термин — MINFU, Microsoft Nomenclature Foul-Up (Терминологическая Неразбериха Microsoft). Но звучит название продукта все же круто, и я был приятно удивлен, когда в Microsoft меня попросили написать о нем книгу, придерживаясь такого же общего подхода как для СОМ+ 1.0в книге Understanding COM+ (Microsoft Press, 1999). Вот эту книгу вы сейчас и держите в руках (надеюсь, что вы ее купили).
Я боялся, что Microsoft не позволит мне рассказать историю по- своему и заставит придерживаться линии партии. Но этого не произошло. Все, о чем я говорю в этой книге, — понравится вам это или нет — мое личное мнение. Конечно, мне нравится NET, и я считаю, что она позволит обогатиться ее пользователям — Microsoft с этим не спорит. Когда предполагаемый работодатель просит у вас рекомендацию, чью рекомендацию вы дадите: того, кто считает вас полубогом или того, кто считает вас бараном? Большинство известных мне программистов дают немного тех и других. При обсуждении рукописи один менеджер, которому не понравились мои разглагольствования об административных средствах, написал мне: «По моему мнению, эта книга больше
похожа на беллетристику, чем на руководство к действию. Это входило в ваши планы?> Я ответил: «Я горжусь, что моя книга указывает как на хорошие, так и плохие стороны №Т, как на плюсы, так и на минусы. Иначе я был бы льстецом. По моему скромному мнению, это и позволит ей стать руководством к деи- ствию. Если вы обвиняете меня в том, что я называю вещи своими именами, признаю себя виновным».
Терпеть не могу скучного, сухого текста — как сухую рыбу или мясо. Помню, в колледже я попытался сдобрить отчет по лабораторной по химии шуточками и... завалился. «В науке не место легкомыслию, — изрек мой профессор — переделайте все заново. Используйте страдательный залог». V этого парня даже усы были будто нахмурены. Ты что, с наследством пролетел, Филипп? Расслабься — будешь жить дольше или хотя бы веселей! Может, он думал, что если будет скучным, то проживет дольше, но это ему не удастся.
По-моему, лучшие авторы — это хорошие рассказчики, даже в таких и особенно в таких областях, как наука или история. Например, я восхищен «Нашествием чумы» Лори Гарре (Laurie Carrett, The Coming Plague, Penguin, 1995), «Сыном Венеры» Ивзна Коннела (Evan S. Connell, Son of the Morning Star, North Point Press, 1997) u биографией Уинстона Черчиля «Последний лев», которую написал Уильям Манчестер (William Manchester, The LastLion. Little Brown, 1983). Вспомните свои учебники, написанные людьми вроде моего бывшего профессора. Что может быть гаже? А теперь прочитайте эту выдержку о поисках Эмилем Ру антитоксина от дифтерии и первых опытах на человеке во время эпидемии в Париже в 1894 г.:
Ру глянул на беспомощных врачей, а затем перевел взгляд на свинцово-серые лица, руки, в страхе сжимающие края одеял, тела, извивающиеся в поисках глотка воздуха...
Ру посмотрел на свой шприц — спасет ли эта сыворотка жизнь?
«Да!» — воскликнул Эмиль Ру-человек.
«Не знаю, нужен эксперимент», — прошептал Эмиль Ру —
искатель истины.
«Но для эксперимента нам придется отказать в сывороткеминимум половине этих детей — мы не можем этого сде-лать». Так сказал Эмиль Ру — человек с большим сердцем
— и голоса всех отчаявшихся родителей слились с моля- идим голосом этого Эмиля Ру.
О том, какой выбор предпочел Эмиль Ру и к чему это привело, вы можете узнать из книги Поля де Крюифа «Охотники за микробами» (Paul de К「и if, Microbe Hunters), вышедшую в 1926 г. и периодически переиздающуюся (последний раз в 1996г. в издательстве Harcourt Brace], В ней не так много академической точности, но что бы вы предпочли читать? Я знаю, что я предпочел бы писать. Я не претендую на красноречие де Крюифа и всерьез сомневаюсь, что кто-нибудь переиздаст эту книгу, пока мне не стукнет 112 лет. Но я сделал все, что мог, чтобы вы получили удовольствие, а кто из технических авторов хотя бы попытался это сделать?
Книга Поля де Крюифа заканчивается так: «Эта не приукрашенная история была бы не полной, если бы я не сделал признания: я люблю этих охотников за микробами, от старика Антония Левенгука до Пауля Эрлиха. Не за их открытия и благодеяния для рода человеческого. Нет. Я люблю их за то, какие они люди. Не были, а есть — в моей памяти каждый из них жив и будет жить, пока мне служит мой мозг». Как говорится в моем эпилоге (не надо сразу к нему переходить, прочитайте сначала книгу), Интернет заставляет эволюционировать человеческий вид — ни больше, ни меньше. Microsoft №Т — это продукт, который обещает широко распахнуть мир Интернета. И для меня очень много значит, что я могу рассказать о нем и рассказать по-своему. Причина моего переключения на Microsoft Press и ухода от прежнего издателя — возможность работать над проектом с командой и обсуждать будущее технологий. Первые читатели рукописей сказали МНЕ, что смогли пробиться через мой текст. В общем, я на это и надеялся.
IКаждая книга — дело коллективное, как полет на Луну, но в меньшем масштабе. Все лавры достаются автору, как и астронавтам (будете следить, как мои акции идут вверх?), но без всех остальных людей, много работавших над этим проектом, и читать было
бы нечего. Благодарностей им достается немного, как и тысячам участников программы «Аполлон» (хотя я думаю, что в фильме «Аполлон 13» облаченный в жилет заядлый курильщик контролер полетов Джин Кранцв исполнении Эда Харриса переплюнул Джима Довела в исполнении Тома Хэнкса). Пока «Знакомство с Microsoft .NET» не экранизируют (кстати, прекрасная идея, надеюсь, меня слышит кто-нибудь из продюсеров) придется им за свои подвиги довольствоваться этими скромными благодарностями. Первая премия — Джону Пиэсу (John Pierce), главному редактору этой книги. Много лет назад, в моей книге Understanding СОМ+, изданной Microsoft Press, он играл роль второго плана. Я очень рад, что в этой книге он сыграл главную роль. У нас с ним одинаково извращенное чувство юмора. Подписать его на то, чтобы он держал меня в рамках, — все равно, что пригласить Билла Клинтона присматривать за старшеклассницами из группы поддержки спортивной команды. Я знал, что он не будет корежить мой стиль и ломать мой голос, который — нравится вам это или нет — отличается от остальных. Он отточил мою прозу так, как не смог бы сделать я сам.
Дальше идет Марк Янг (Marc Young), технический редактор. Он находил ответы на все мои технические вопросы, обычно в условиях дефицита времени и ежедневных изменений в коде. Кроме Марка, многие другие члены команды разработки .NET находили окна в своем зверском графике, чтобы направить меня в нужном направлении. Я особенно признателен Сьюзан Уоррен (Susan Warren), Кэйту Болинджеру (Keith Ballinger), Марку Боултеру (Mark Boulter), Лорен Конфелдер (Loren Kohnfelder), Эрику Олсону (Erik Olson), Джону Риварду (John Rivard), Полу Вику (Paul Vick), Джеффри Рихтеру (Jeffrey Richter) и Саре Уильяме (Sara Williams).
С коммерческой стороны процесс был запущен год назад Бэном Райаном. (Ben Ryan), а после его ухода подхвачен Даниэлем Бердом (Danielle Bird). Поддержку осуществляла Энни Гамильтон (Anne Hamilton). Тереза Фэган (Teresa Fagan), менеджер продуктов в Microsoft Press, услышав название «Знакомство с Microsoft .NET» подала идею; «Эй, ты должен зарегистрировать это как Web-адрес!» — и я помчался под дождем в свою одинокую писа-
тельскую мансарду (это был этаж для консьержек в отеле Club Hotel в Бельвью) и реализовал эту идею, пока никто другЕ до нее не додумался. Это была вишенка в водочке с мороженым.
Я также признателен Дюан Бэйкер (Duane Baker) и Крису Бэллу (Chris Bell) из Interiand, Inc. за совместную работу по установке Web-сайта, где вы можете увидеть демонстрационные программы к этой книге.
И, наконец, я должен поблагодарить мою жену Линду, теперь мать моей дочери Эннабел.
Дэвид С. Платт wwwrollthun der. com
Ипсвич, Массачусетс, США апрель 2001 г.
Глава 1
Введение в .NET
Я нынче ночью 〃е засну — болят года во мне.
На вахте время потяну — с Тобой наедине.
Опять сойду в машинный мрак: пойду к моей машине,
В морях поднявшей кавардак в трехмесячной путине.1
Р. Киплинг о важности доступа к системе
24 часа в сутки, 7 дней 8 неделю.
(«Молитпа МакЭндрю». 1 894 г.)
Большой Интернет
Интернет большой. (Раздраженный Читатель: «Я заплатил за то, чтобы знать НАСКОЛЬКО большой!». Подсчитывающий Гонорар Автор: «Я что-то не так сказал?»)
1Сами по себе настольные ПК неинтересны.
二 Автономные ПК гораздо как неинтересна и одноклеточная амеба. Ко- менее полезны^ чем ПКГ нечно, их можно использовать (ПК, а несоединённые в сеть.
амеб), чтобы сыграть в главную игру — Па
сьянс 一 и компьютер не даст вам сжульничать (это достоинство?).
Да и Блокнот всегда под рукой. Но в отличие от значения амебы в процессе эволюции, экономическое значение автономного ПК для общества не имеет мало-мальски достойного обоснования.
Он просто не может делать многих полезных и интересных ве- щей( пока его кругозор ограничен его собственным ящиком. Однако когда вы через Интернет подключаете свой ПК ко всем
Здесь и далее стихотворения Р, Киплинга в переводе В. Топорова.
другим ПК з мире (и не только к ПК, но и другим интеллектуальным устройствам типа компьютеров на ладони или холодильни- ikob) — практически без затрат на дополнительную аппаратуру — начинают происходить забавные вещи. Одноклеточное эволюционирует и превращается в человекоподобное существо, способное сочинять, исполнять и ценить симфонии, взять вас с собой на Луну или уничтожать себе подобных. И на кой вам после этого Пасьянс?
Web начиналась как средство просмотра
Интернет продолжает' 口厂
менять обществе все скучных научных отчетов, но это давно поза- возрастающимиди. Она колоссально упростила распростра-
темпами.1 нение всех видов данных. Растущие визмож*
ности представления данных привлекали к
Интернету все новых пользователей, а рост аудитории подталкивал к активным действиям провайдеров контента. и этот замкнутый процесс продолжает набирать обороты, даже когда я пишу эти строки. Вчера я просматривал в Web голевые моменты из хоккейного матча, который я пропустил. Потом с помощью Napster нашел несколько приятных мелодий из 500 000 песен, записанных на жестких дисках 10 000 различных пользователей (меня, конечно, интересовали только легальные копии). Затем я рассказал маме, как нужно настроиться на соединение с mor〔i видеокамерой, чтобы она посмотрела на свою внучку, спящую в колыбельке за 500 миль от нее. Интернет открывает нам особый
мир, о котором мы не могли подумать даже пять лет назад.
Аи| Аппаратурадля подключения к Интернетуи
доступа в Интернетканалы передачи данных постоянно дешеве-
дешевы и продолжают ют, Web-камера, позволяющая моей маме дешеветь.смотреть на внучку, стоит всего несколько
сотен долларов и не требует никаких дополнительных расходов при работе через установленный у меня кабельный модем. Прикиньте, сколько бы это стоило десять или даже пять лет назад: купить видеоаппаратуру и оплатить выделенный канал от Ипсвича, штат Массачусетс, до Орвигсбурга, штат Пенсильвания. Цены на аппаратуру и услуги Интернета скоро упадут до уровня лотерейных выигрышей, если еще не упали,
Поднимаем планку: общие проблемы инфраструктуры
Аппаратура и услуги Интернета дешевы, ноПрограммы для
есть одна загвоздка. Согласно Второму Зако-Интернета создают :
ну Платта, общее количество всякого родаHoSbfe классьт проблем,
неприятностей во Вселенной — величинатребующие сложных
постоянная? Если кому-то приходится иметьи дорогих реиюниО.
дело с меньшим количеством неприятностей,
то не потому, что они исчезли, а потому, что он свалил их на чужую голову. Если аппаратура и каналы связи легче и дешевле, значит, по вселенскому закону программы для Интернета на столько же сложнее и дороже. Это бесспорно, и каждый может в этом убедиться. Проблемы Интернет-приложений не связаны с бизнес- логикой ( которая не отличается от таковой в настольных приложениях (если некоторое число меньше 0 — расходы по вашему счету превышены). Между тем тот факт, что приложение должно работать на нескольких машинах, связанных Интернетом, порождает новый класс проблем, которые определяются открытой, неконтролируемой и разнородной природой Интернета. Поду- ,майтел как просто (относительно) уследить за малышом в соб- ственно。 гостиной и насколько труднее это сделать на вокзале, Тот же ребенок, те же цели (безопасность, развлечения) и совершенно другое окружение.
Безопасность в настоль-ных приложенияхобычно вообщене реализована.Безопасность в настоль-ных приложенияхобычно вообщене реализована.Рассмотрим, например, вопрос безопасности. Многие пользователи держат личную финансовую информацию на автономном ПК и обрабатывают ее с помощью Quicken или других подобных продуктов. Разработчики
Безопасность в настоль-ных приложенияхобычно вообщене реализована.
Безопасность в настоль-ных приложенияхобычно вообщене реализована.
ранних версий Quicken не написали вообще никакого кода, обеспечивающего безопасность. Они были спокойны, точнее спокойны были их потребители, уверенные, что коль ПК физически недоступен, то никто их денежки не стянет. Параноики могли ку-
Первый Закон Платта называется «Экспоненциальный рост оценочных значений» и утверждает, что каждый проект по разработке ПО требует атрое больше времени, чем при самых пессимистических оценках, даже
если принимается во внимание сам этот закон.
пить продукты, защищающие всю систему с помощью паролей, но вряд ли многие это делали.
Однако, узнавая о различных новшествах, многие пользователи стали понимать, что толку от Quicken на автономном компьютере не так уж много. Он мало чем отличался от бумажного реестра платежных документов, разве что работать можно было быстрей и проще. Quicken не давал никаких преимуществ сетевым пользователям, пока не предоставил возможность подключаться к Интернету и взаимодействовать с другими участниками финансовых операций для таких действий, как получение и оплата счетов и автоматическое получение выписок по банковским счетам I и кредитным картам. (То есть Quicken дал бы эти преимущества сетевым пользователям. если бы не его кривой пользовательский интерфейс. По-настоящему он не справл51лся с этими новыми возможностями, загружая пользователя бесконечным числом разных параметров, которые нужно было выбирать, Но это не проблема Интернета.)
Итернет-приложениядолжны иметь средствазащиты на всех фазахработы.Итернет-приложениядолжны иметь средствазащиты на всех фазахработы.Но как только операции Quicken вышли за пределы безопасного кокона — одного ПК, на котором они выполнялись, — нужно было призадуматься о защите. Например, когда пользователь просит электронный центр оп
Итернет-приложениядолжны иметь средствазащиты на всех фазахработы.
Итернет-приложениядолжны иметь средствазащиты на всех фазахработы.
латы счетов выписать чек телефонной компании, центру нужно быть уверенным, что запрос пришел от истинного владельца счета, а не от телефонной компании, отчаянно пытающейся избежать банкротства путем перечисления самой себе авансовых платежей за много месяцев вперед. Кроме того, пересылаемые данные нужно шифровать. Вряд ли вы захотите, чтобы соседский сынок- придурок узнал номер вашего банковского счета, подключив к линии вашего кабельного модема сетевой анализатор пакетов (что скажет ваша жена, увидев счет на 295 долларов за услуги сауны «Веселые девчонки»?).
Flor'Ll ЫКод, обес п еч и вающи й безопасность, исклю-
безопасный
код исключительно чительно сложно писать (и проверять, и от- сложно,лаживать,, и разворачивать, и поддерживать,
и сопровождать), когда сотрудники приходят и уходят. Вам нужно найти людей, знающих о безопасности все: как ауте н тиф и цировать пользователей, как решать, имеет ли
пользователь право делать то или это, как шифровать данные, чтобы их могли легко прочитать авторизованные пользователи, но не могли злоумышленники, как создать средства, позволяющие администраторам устанавливать и удалять права пользователей и т. д.
Безопасность и связан-ные с ней проблемыраспределенных вьнис-лен ий — неопэемлемаяприм адлежнас гьинфраструктуры.Безопасность и связан-ные с ней проблемыраспределенных вьнис-лен ий — неопэемлемаяприм адлежнас гьинфраструктуры.Интернет-вычисления порождают другие сходные классы проблем, которые я рассмотрю далее в этой главе. Как л объяснил в своей книге Understanding COM + (Microsoft Press, 1999), все эти проблемы сходны в том, что они напрямую не связаны с бизнес-про-
Безопасность и связан-ные с ней проблемыраспределенных вьнис-лен ий — неопэемлемая
прим адлежнас гьинфраструктуры.
Безопасность и связан-ные с ней проблемыраспределенных вьнис-лен ий — неопэемлемая
прим адлежнас гьинфраструктуры.
цессами, хотя именно за реализацию последних вам и платят деньги клиенты. Эти проблемы относятся к инфраструктуре, — как, например, к автотрассам или электрической сети ^^^^^» к базе, на которой основана ваша повседневная жизнь.
Реализация инфраструктуры убивает проек-
卄 суИнфраструктура,
ты, Проекта, погибшего из-за бизнес-логики,не би^нес-доги^а
я не видал. Вы знаете свои бизнес-процессыгубит проекты.
лучше всех, именно поэтому вы и пишете
ПО, облегчающее управление ими. А инфраструктура вам неизвестна (если, конечно, не вы сами ее разрабатывали, как в случае с Microsoft). Экспертов по алгоритмам аутентификации и шифрования почти нет. Если вы попытаетесь сами написать такой код, произойдет одно из двух. Или ваша реализация будет увечной, потому что вы не понимаете, что делаете (вы легко отделаетесь, если о ней не узнают какие-нибудь нехорошие ребята), или вы не сможете довести дело до конца в рамках существующего бюджета. Когда я работал над распределенным приложением для торговли валютой (это было до Интернета, 12 лет назад; об этом тоже в моей книге Understanding COM + ), мы получили оба этих удовольствия.
Планы, составленные наилучшим образом
Разработчики ПО самисебя обманывают.Разработчики ПО самисебя обманывают.Разработчики ПО всегда начинают проект с величественных замыслов и колоссальных
Разработчики ПО самисебя обманывают.
Разработчики ПО самисебя обманывают.
обещаний. Как алкаш, стоящий у руля партии,
мы кая немея, что благодаря тщательному проектированию мы избежим ошибок, а наш код весь будет полностью документирован. Мы его всесторонне оттестируем, а после этого никаких дополнительных функций включать не будем. Более того, мы составим реалистичный график и будем его придерживаться. («Эта функция ОС делает не совсем то, что нам нужно, но я за недельку напишу получше, так что наши требования к программе менять не надо».) Создать надежное и полезное (в меру) приложение — в наших силах; все, что нам нужно, — дисциплина. Никаких пасьянсов. Во всяком случае до пяти часов. Ну, ладно, одну игру во время обеда. «Черт! Проиграл! Еще разок для ровного счета, идет? Ого! Уже 16:00?» Все проекты, которые я знал, начинались с таким угарным пылом.
Хоть кто-нибудь это сделал? Хоть один разработчик сдержал свои обещания? Нет. Такого никогда не было и не будет. Когда мы даем такие обещания, в глубине души мы знаем, что безбожно врем. Это не лечится. Как у наркоманов, выход здесь один (не считая летального исхода). Чтобы создавать успешные Интернет- приложения мы должны вести себя смиренно, как выздоравливающие пациенты, и на пути нашем к праведности мы должны:
признаться себе в собственном бессилии — наша жизнь стала неуправляемой;
2. уверовать, что здравый рассудок вернет нам только сила, большая, чем наша.
Сами построит»инфраструктуру выне в состоянии.Сами построит»инфраструктуру выне в состоянии.Прикладные программисты должны осознавать, чт<изменить инфраструктуру Интернета мы бессильны. Это сделает наши проекты неуправляемыми, Мы не сможем их реализо-
Сами построит»инфраструктуру выне в состоянии.
Сами построит»инфраструктуру выне в состоянии.
вать, они будут длиться слишком долго, стоить слишком много — мы
не знаем сколько. Не стоит и пытаться — это самообман и верный путь к краху. В совершенно невероятном случае, если мы даже напишем пристойный код, наши конкуренты не заставят себя ждать и слопают наши завтраки, обеды и ужины тоже. Вы не строите собственное шоссе, чтобы водить свою машину и не устанавливаете собственный электрогенератор (если не живете в Калифорнии в начале 2001 г.)
К счастью,, требования вашего Интернет-приложения к инфраструктуре совпадают с требованиями всех остальных, так же как ваши требования к автострадам и электричеству такие же, как у других людей. На основании такой глобальной потребности правительство строит автомагистрали, а энергетические компании—электростанции, которыми вы пользуетесь за соответ ствую щую плату (или непосредственно — оплачивая счета, или косвенно - платя налоги). Правительство и коммунальные службы связаны с экономикой другого масштаба — для достижения своих целей они могут нанять или подготовить самых талантливых людей и амортизировать свои затраты из огромного числа источников, которые вам и не снились.
Что нам на самом да\е нужно, это чтобы кто-Нужно использовать
то сделал для распределенных вычислений тоинфраструктуру,
же, что правительство делает для автомаги-а не строить ее.
страдей (может не буквально то, что делает правительство в этом направлении, но суть вы уловили). Как выздоравливающий наркоман верит, что вернуть его к жизни может только Сила, сотворившая Вселенную, так и разработчикам нужна высшая сила в области компьютеризации, обеспечивающая инфраструктуру Интернета и возвращающая здравый смысл разработчикам.
И все же, что это за .NET?
Microsoft NETпредоставляет готовуюинфраструктурудлярешения общих задачпри создании i юдля Интернета.Microsoft NETпредоставляет готовуюинфраструктурудлярешения общих задачпри создании i юдля Интернета.Это и есть Microsoft .NET — готовая инфраструктура для решения общих проблем Ин- тернет-приложений. Последнее время Microsoft NET невероятно много — даже для нашей отрасли — рекламируется. Именно поэтому г5 ' 000 чумовых фанатов, припухших от
Microsoft NETпредоставляет готовуюинфраструктурудлярешения общих задачпри создании i юдля Интернета.
Microsoft NETпредоставляет готовуюинфраструктурудлярешения общих задачпри создании i юдля Интернета.
Jolt Cola% собрались в Орландо, штат Флорида, в июле 2000 г.
Не потому, что они не могут отказаться от покупки уцененных
Ходят слухи, что в качестве части приговора, вынесенного судьей Пенфилдом Джексоном, Microsoft впредь обязана подавать на своих конференциях только диетическую Jolt Cola, не содержащую кофеина. (Jolt Cola — напиток с повышеннымсодержанием сахара и кофеина. — Прим. "叩ев.)
авиабилетов (даже если они не туда, куда им надо, да и вообще — не сезон) и не потому, что тащатся от жуткой жары и солнечных ударов. Они хотели первыми услышать о Microsoft .NET.
Microsoft.NET—это прикомпоновываемая среда периода выполнения, работающая в ОС Windows 2000. Наверное, в будущем Министерство юстиции США постановит, чтобы она была частью ОС. Последующие версии могут предлагать часть своих возможностей для других версий Windows, а, вероятно, как мы увидим, и для других ОС. Сервис, обеспечиваемый NET мы и обсудим далее в этой книге.
,N£T предоставляетновую среду периодавыполнения — ,NETFramework.,N£T предоставляетновую среду периодавыполнения — ,NETFramework.,NE1 Framework — среда периода выполнения, облегчающая написание полноценного надежного кода в сжатые сроки, управление, развертывание и модификацию этого кода.Написанные вами программы и компоненты выполняются в этой среде. Она дает программистам в период выполнения такие классные возможности, как автомати
,N£T предоставляетновую среду периодавыполнения — ,NETFramework.
,N£T предоставляетновую среду периодавыполнения — ,NETFramework.
ческое управление памятью (сборка мусора) и упрощенный доступ ко всем службам ОС. Она добавляет массу вспомогательных функций вроде простого доступа к Интернету и базам данных. Кроме того, она обеспечивает новый механизм повторного применения кода — более простой в использовании и в то же время более мощный и гибкий, чем СОМ. Развертывать №Т Framework проще, так как она не требует настройки реестра. Она также поддерживает на системном уровне стандартизированный механизм управления версиями. Все это доступно программистам на любом .NET-совместимом языке. .NET Framework мы обсудим в главе 2.
качестве клиентского интерфейса мы будем использовать обычные браузеры, Для этого серверам нужно создавать страницы с помощью языка HTML, которые браузеры могут понимать и выводить пользователю. ASP.NET (следующая версия Active Server Pages) — этокачестве клиентского интерфейса мы будем использовать обычные браузеры, Для этого серверам нужно создавать страницы с помощью языка HTML, которые браузеры могут понимать и выводить пользователю. ASP.NET (следующая версия Active Server Pages) — этоХотя число специализированных программ растет, в ближайшей и среднесрочной перспективе для доступа к Интернету в
качестве клиентского интерфейса мы будем использовать обычные браузеры, Для этого серверам нужно создавать страницы с помощью языка HTML, которые браузеры могут понимать и выводить пользователю. ASP.NET (следующая версия Active Server Pages) — это
качестве клиентского интерфейса мы будем использовать обычные браузеры, Для этого серверам нужно создавать страницы с помощью языка HTML, которые браузеры могут понимать и выводить пользователю. ASP.NET (следующая версия Active Server Pages) — это
№Т прерпставляет новую программную модель для создания
HTML-страниц—
A5P.NET.
новая среда, работающая на Internet Information Server (I⑸, заметно упрощающая написание кода для создания HTML- страниц. ASP.NET предлагает новый, не зависимый от языка способ создания кода и привязки его к запросамWeb-страниц, — NET Web Forms — управляемую событиями программную модель взаимодействия с элементами управления. Она делает программирование Web-страниц аналогичным программированию форм Visual Basic. ASP.NET содержит развитые средства управления сеансами и функции защиты. Она надежнее, и производительность ее значительно выше в сравнении с ASP. Про ASP.NET я расскажу в главе 3.
.NET предлагает новыО 5с/^живяния .. любыхИнтернет-серверами —.NETWeb Services..NET предлагает новыО 5с/^живяния .. любыхИнтернет-серверами —.NETWeb Services.Хотя стандартные браузеры продолжают играть важную роль, я думаю, что будущее за специализированными приложениями и устройствами. Из Web можно будет не просто получить информацию и отобразить ее в браузере. Специализирован-
.NET предлагает новыО 5с/^живяния .. любых
Интернет-серверами —.NETWeb Services.
.NET предлагает новыО 5с/^живяния .. любых
Интернет-серверами —.NETWeb Services.
ный клиент (скажем, Napster для поиска музыки) будет через
Интернет вызывать функции сервера и получать данные для отображения через специализированный пользовательский интерфейс, а в случае межмашинного взаимодействия пользовательский интерфейс вообще не потребуется. Microsoft .NET предлагает новый набор служб, позволяющих серверу предоставлять свои функции любому клиенту на любой машине с любой ОС. Клиент запрашивает сервер, применяя минимальный общий знаменатель — XML и HTTP. Набор предоставляемых таким образом функций называется Web-служба №Т. Вместо того чтобы сидеть и ждать, когда потребителей озарит и они падут в обьпти灯 Единственно Достойной Операционной Системы (аллилуйя!) надо просто сказать: «Покупайте нашу ОС, потому что мы предоставляем множество готовых функций, облегчающих написание приложений, способных взаимодействовать с любыми другими приложениями по всему миру, независимо от того, что они делают и где работают.» Я расскажу о Web-службах .NET в главе 4.
Специализированные пользовательские приложения, обращающиеся к Web-службам, нуждаются в хорошем пользователь-
NETпредоставляет : 1 ском интерфейсе. Высококачественный ин- WindowsForms'—новый тер“е0с гораздо удобней, как, скажем, спе- способ разработкициализированный интерфейс Microsoft Out-
шикарных клиентскихlook лучше универсального Web-интерфейса
• приложений сиспользо-Hotmail. Microsoft №1 предоставляет новый
занием .nl ГFramework.Windows Forms,_ облегчаю-
иций написание специализированных клиентских приложений с помощью .NET Framework. Чтобы представить себе его возможности, вообразите Visual Basic, сидящий на анаболических стероидах. NE1 Windows Forms мы обсудим в главе 5.
• Ни одна среда программирования для Интернета не будет полной без средств доступа к базам данных. Большинство Интенет-программ, по крайней мере сейчас; ? ADO. МЕТ обеспечивает尸',尸l /
прекрасную поддержку расходуют львиную долю своего времени на доступа к базам данных сбор информации от клиента, выполнение в рамках №1запросов к БД и представление результатов
Framework.клиенту. .NEI обеспечивает развитую под
держку работы с БД с помощью ADO. NET.
Хотя здесь я эту технологию не обсуждаю, главу проADO.NET можно загрузить с web-сайта этой книги www.in troducingmic- rosoft.net,
Об этой книге
I Пока я не написал Understan dingCOM-h, все мои книги были подробными руководствами с примерами на C++. Это очень нравилось продвинутым программистам на C+ + , но покупателей, увы, находилось немного, что очень удручало моих кредиторов. Я решил сделать эту книгу доступной для разработчиков, которые не знают или не любят С+ Больше того, я обнаружил, что менеджеры абсолютно ничего не получают от моего С+ + -подхода, поскольку никогда не работают с примерами программ (было одно исключение — этому человеку я бесплатно отослал экземпляр своей книги, чтобы он трудился и над последующими). Я хочу расширить аудиторию и не ограничивать ее программист тами. Безграмотные (или еще хуже — полуграмотн ы е) менеджеры — твари исключительно опасные. Истребление этого вида было бы моим величайшим вкладом в развитие цивилизации.
В этой книге применяется стиль. с которым я Примеры программ экспериментировал в моем последнем опусе, и инструкции поих приспособив формат, успешно использован- установке находятся на ный Давидом Чеппелом (David Chappel) в егоweb-сайте этой книги.
Understand! ng ActiveX and OLE (Microsoft Press,
1996 — Технологии ActiveX и OLE. M.: «Русская Редакция», 1997): множество пояснений и диаграмм и совсем немного кода в тексте. Как бы мне ни нравилась книга Дэвида Чаппела, кода мне все равно не хватало (как зачастую мне нужен кусочек шоколадного торта Iпосле изысканного суши). Я ловил себя на том, что пишу код, чтобы лучше понять его идеи, как писал уравнения для понимания текста в книге Стифена Хокинга (Stephen Hawking) «Краткая история времени». (Ладно, допустим, я — чокнутый.) Итак, для всех глав есть Iпримеры программ, кое-что я написал сам, а кое-что — на основе примеров Microsoft. Эти примеры находятся на web-сайте книги, адрес которого, естественно, http://www.introdudngmicrosoft.net. Me* неджеры и проектировщики могут читать эту книгу не захлебь!ва-
ясь кодом, а изголодавшиеся по коду программисты по-прежнему могут удовлетворить свой аппетит. Несмотря на весь шум вокруг C# (произносится «Си-ииарп»), я написал код примеров на Visual Basic.NET/, поскольку с этим языком знакомо большинство читателей. Если вы захотите запустить примеры программ, вам потребуется компьютер с Windows 2000 Server, как минимум бета-версия Microsoft .NETSDK и предварительная версия Visual Studio.NET. Подробно требования к системе и настройке описаны на web-сайте.
В каждой главе •..представлена одна темав нисходяицем порядке. ;::В каждой главе •..представлена одна темав нисходяицем порядке. ;::В каждой главе представлена одна последовательно рассматриваемая тема. Я начинаю с описания архитектурных проблем, подлежащих разрешению. Затем объясняю архитек-
В каждой главе •..представлена одна темав нисходяицем порядке. ;::
В каждой главе •..представлена одна темав нисходяицем порядке. ;::
туру верхнего уровня той инфраструктуры, которую .NET предоставляет, чтобы решить проблему, кодируя как можно меньше.
После этого я перехожу к простейшему примеру решения пробле-
мы. Менеджеры могут прекратить чтение после этого раздела. Затем идет обсуждение всяких тонких моментов: альтернативных
вариантов, граничных условий и т. п. Я всюду пытаюсь следовать закону Порнелля, придуманного Джерри Порнеллем (Jerry Pournelle) IB его рубрике «Владения хаоса» в журнале Byte, который формулируется очень просто: слишком много примеров не бывает.
Предостережение: ознакомительное ПО
Выбрать момент аля написания книги попрограммированиюдовольно сложно.Выбрать момент аля написания книги попрограммированиюдовольно сложно.менностью. Еслименностью. ЕслиСовременное ПО — наиболее быстро меняющаяся область человеческой деятельности, из всех когда-либо существовавших. При написании книги об актуальном ПО требуется компромисс между точностью и своевре- вы начнете писать, когда ПО действительно
Выбрать момент аля написания книги по
программированиюдовольно сложно.
Выбрать момент аля написания книги по
программированиюдовольно сложно.
менностью. Если
менностью. Если
начнет поставляться, книга окажется на полках через полгода или через год после выхода ПО. А это может составлять половину жизненного срока программы, а то и больше. С другой стороны, если вы приступите к книгу слишком рано, в процессе разработки, окончательная версия ПО слегка утратит сходство с тем, что описано в книге. Я всегда старался откладывать написание фун- 1ки.иональной спецификации продукта до момента его поставки — это единственный способ гарантировать соответствие продукта спецификации.
Я написал эту книгу в первом квартале 2001 г., используя версию Beta 2 Microsoft №Т Framework u Visual Studio.NET. Я даю абсолютную гарантию, что некоторые функции в период между написанием этой книги и выходом окончательной версии ПО будут изменены: могут быть добавлены новые, ожидаемые удалены, а существующие изменены. Я ведь тоже, когда планирую направление разработки собственного проекта по мере его приближения к завершению или когда хочу добавить новые функции, действую по собственному усмотрению, не ставя об этом в из вест- ность Microsoft, чтобы они что-то переделали или просто учли этот факт. Если хотите оставаться в курсе моих соображений относительно .NETи знать об изменениях в этой книге, подпишитесь на бесплатную информационную рассылку Thunderclap («Ужасная новость») на моем web-сайте www.rollthunder.com.
В какой-то момент вы, несомненно, скажете: «Черт возьми! Платт абсолютно прав (или не прав)! Надо бы, чтобы Microsoft изменила то или добавила это». В Microsoft будут рады услышат ваше мнение. Например, в главе 3 я объясняю. что в соответствии с текущими планами Microsoft предполагает, что вы должны использовать Блокнот (Notepad) для настройки ASP.NET. Я спорю с ними, объясняя, почему это просто неприемлемо для админист-
раторов в реальной работающей среде. Если вы со мной согласны и считаете, что это нужно исправить, направьте свои соображения в Microsoft. Мы все рады вашим замечаниям на всех ста- дияхразработки!
Песнь Интернету
Современная поэзия сводит меня с ума. По-
Современная поэзия —
чти вся она для меня неотличима от “ап"полный бред.
щен ной политизированной прозы с рассы
панными там и сям возвратами каретки. Ни рифмы, ни ритма, — только автор (обычно с личными доходами или с грантом за счет налогоплательщиков, иначе он бы умер с голоду) у которого фатальная мания, что Он Должен Сказать Что-то Важное. Может, мой скромный интеллект просто не хочет предпринимать усилии, чтобы разобраться в его умственных отклонениях. Не знаю, как вы, а я найду другое применение немногим оставшимся у меня извилинам.
Поэзия Киплингапрекрасна.Поэзия Киплингапрекрасна.Вместе с тем я люблю старую поэзию, особенно Киплинга. По нынешним временам политкорректным его не назовешь {прочтите его
Поэзия Киплинга
прекрасна.
Поэзия Киплинга
прекрасна.
поэму «Бремя белого человека», если хотите знать почему). В его защиту могу сказать, что все мы — продукты своей эпохи. И он получил Нобелевскую премию по литературе в 1907 г., так что кому-то он тогда должен был нравиться. Дедушка и бабушка подарили мне его книгу «Вот так сказки». Мои родители читали мне ее перед сном и по ней я сам учился читать. Я изучал поэзию Киплинга в школе, заметив, что читать раздел в хрестоматии с его стихами гораздо интересней, чем слушать учителя. Его стихи до сих пор звучат во мне как никакие другие ни до, ни после.
Киплинг написал поэму,прославляя флотскогоинженера, и почти все,о чем он говорил^ отно-сится к сегодняшнимпрограммистам.Киплинг написал поэму,прославляя флотскогоинженера, и почти все,о чем он говорил^ отно-сится к сегодняшнимпрограммистам.Вы спросите, какое отношение это имеет к компьютерному безумию? Невероятное ускорение технологических инноваций в последние годы заставили меня вспомнить поэму Киплинга «Молитва МакЭндрю», опублико' ванную в 1894г. Многие считают, что ввре~
Киплинг написал поэму,прославляя флотскогоинженера, и почти все,о чем он говорил^ отно-сится к сегодняшнимпрограммистам.
Киплинг написал поэму,прославляя флотскогоинженера, и почти все,о чем он говорил^ отно-сится к сегодняшнимпрограммистам.
менность сильно отличается от прошлого, особенно, когда речь идет о технологиях. И все же я поражаюсь, насколько ощущения
МакЭндрю совпадают с моими сегодняшними. Главный герой — старый шотландский морской инженер — размышляет о наиболее блестящем технологическом достижении своих дней — корабельном паровом двигателе. Это было началом смерти расстояний — процесса, который я и вы, мои дорогие чудики, доведем до конца, прежде, чем обретем вечный покой. Мне так нравится эта поэма, что каждую главу я начинаю с цитаты из нее. Полностью вы ее можете прочитать на http://home.pacifier.com/—rboggs/ KIPUNG.HTML Может, вы думаете, что прототипом шотландских инженеров является Скотти из фильма Star Trekf но я уверен, что Джен и Роденберри взял за основу киплинговского МакЭндрю,
Например, каждый программист знает фор-
Эта поэма содержит尸十 尸
раннюю формулировку мулировку закона Мура, так? Он гласит, что закона Мура.'.мощность за данную цену
удваивается каждые восемнадцать месяцев.
Многие знают и его опровержение — закон Гроша, который утверждает, что как бы ни старались ребята-железячники, ребята- программисты все равно сведут их усилия на нет. Многим известно даже следствие Яблокоу, которое формулируется очень просто: «И это не предел». Но МакЭндрю постиг это сто лет назад, куда раньше, чем некоторые плагиаторы прилепили к этой идее имя Мура и назвали ее законом. Когда я смотрю на старую добрую IBM PC с частотой 4,77 МГц (два флопа и 256 Кбайт памяти), я вспоминаю слова Киплинга:
Он начинал еще тогда — G машинном на подхвате!
Не пароход был в те года — труба на самокате!
Давленье — десять фунтов. Смех! Иначе не назвать, Теперь мы выдадим на всех аж сто шестьдесят пять / Мы ковырялись так и сяк с убоищем мотора, Л ведь на тридцати узлах работать будем скоро!
Подобно Родни Дэнжерфилду4 мы жаждем почета и признательности. Че/ховечество смотрит на нас косо с тех самых пор, как первый пещерный программер исследовал заостренный камень I и сказал: «Классная фрактальная структура. Интересно, что если масштабировать его до размеров наконечника для копья?» Помните, как одноклассницы толпились вокруг футболистов, боль-
Популярный в США комик. — Прим, перев.
шинство из которых (не все, Брайан) были немы, как стена? Отличники, как правило, были не интересны (я не исключение), и даже мои шахматные награды не подкреплялись университетс- I ким дипломом. Хотя я теперь и знаю, что в перспективе я зара~ ботал гораздо больше денег, чем мои разгильдяи-одноклассни' ки (которые, по мнению моего отца, пользуются большим успехом у противоположного пола), мне все еще больно. МакЭндрю в голос рыдал о том же, только гораздо красноречивей (выделено мной):
Романтику ему пода口! Проклятый первый класс! — - Да в чистых томиках издай. — Л кто споет про нас? Аюбовь и кровь, любовь и кровь — тошнит от перегара!
О Боже, нужен новый Бернс, чтоб создал песню Пара!
Я не Бернс, и даже моя матушка затыкает уши, когда я пою. Но я приложу все усилия, чтобы рассказать эту историю так, как я ее вижу. Надеюсь вы получите удовольствие от чтения.
Глава 2
Объекты <NET
Басами поршни зазвучат, а помпы — чуть визгливо, Эксцентрики заголосят, и заскрежещут шкивы, И передачи подадут свой глас в свой миг и час, И вал —услышишь! — подпоет, в великий хор включась. Вот это песня! В ней напор, и слаженность и сила.
Р. Киплинг о чрезвычайном разнообразии типов компонентов, гармоничная работа которых необходима для функционирования каждогоприложения.
(«Молитва МакЭндрю», 1894г.)
Сутьпроблемы
Хорошие программы писать трудно — так
Хорошиепрограммы
было всегда. А сложность проблем, которыеписать нелегко
приходится решать разработчикам при со
здании полезных приложений, в современном распределенном и гетерогенном мире Интернета возросла. Иногда я ловлю себя на ностальгии по старым добрым временам, когда под разработкой ПО понимали создание процессора вводимой информации, который, анализируя считанные прямо с клавиатуры коды, преобразовывал их в понятные командному процессору символы. Те- I перь все не так. В настоящее время разработчиков постоянно преследует ряд сложнейших проблем.
Во-первых, выбирая язык программирования, мы сразу же столкнемся с противоречием. Хотя теоретически на любом языке можно создать программу, которая задействует все преимущества ОС, уж слишком часто приходится слышать: «Эй, парень, если
2—1 760
Все системные функциидолжны быть efoewoHbi口 любом языкепрограммирован ия.Все системные функциидолжны быть efoewoHbi口 любом языкепрограммирован ия.ты пишешь на COBOL4 то не сможешь использовать автоматическое управление памятью. Пора бы тебе перейти на настоящий язык». Хотелось бы, чтобы выбор языка определялся тем, насколько хорошо он подхо-
Все системные функциидолжны быть efoewoHbi口 любом языкепрограммирован ия.
Все системные функциидолжны быть efoewoHbi口 любом языкепрограммирован ия.
дит для реализации прикладной области, а не соответствием возможностям системы — хватит нам граждан второго сорта! Думаю, что, если все крутые возможности Java были бы доступны лишь в Java, это стало бы причиной его скорого заката. Терпеть не могу, когда кто-нибудь настойчиво утверждает, что, дескать, принимаю лишь Единстгзенный Истинный Язык Программирования. Я считаю, что Спасение должно бытьдоступно адептам всех «вероучений» от программирования.
Технологии СОМпозволила разрабаты-вать приложения путемсборки их из коммер-чески доступных компо-нентов, освобождал отнеобходимости писатьвсе «с нуля»Технологии СОМпозволила разрабаты-вать приложения путемсборки их из коммер-чески доступных компо-нентов, освобождал отнеобходимости писатьвсе «с нуля»После выхода в 1993 г. технологии СОМ раз
Технологии СОМпозволила разрабаты-вать приложения путемсборки их из коммер-чески доступных компо-нентов, освобождал отнеобходимости писатьвсе «с нуля»
Технологии СОМпозволила разрабаты-вать приложения путемсборки их из коммер-чески доступных компо-нентов, освобождал отнеобходимости писатьвсе «с нуля»
работчики ПО для Microsoft Windows поняли, что им больше не надо писать весь код приложения «с нуля». СОМ позволяет клиенту вызывать функции сервера на уровне двоичного , не б компиляци исходного текста. В СОМ прикладную логику ПО можно реализовать с помощью компонентов, куп-
ленных у сторонних поставщиков (например, элемента управления «календарь») и подключенных к приложению через сравнительно тонкий слой связующего кода. Это позволяет быстрее разрабатывать приложения, функциональность которых лучше, чем у самостоятельно написанных программ, а сторонним ком-
паниям — намного повысить удельную стоимость для амортизации своих затрат на разработку. С помощью COM Microsoft также предоставила доступ к функциональности ОС (в частности, к организации очередей и транзакциям) что также ускоряет работу приложений и облегчает их создание. Идея была неплоха, и программные боги стали благосклонны. На время...
До сих пор мыo6xoquAUCi> СОМТеперь же требуется абстрагироваться от различий а реализации.До сих пор мыo6xoquAUCi> СОМТеперь же требуется абстрагироваться от различий а реализации.Как и в случае большинства архитектур ПО. с помощью СОМ удалось в определенной
До сих пор мыo6xoquAUCi> СОМ
Теперь же требуется абстрагироваться от различий а реализации.
До сих пор мыo6xoquAUCi> СОМ
Теперь же требуется абстрагироваться от различий а реализации.
мере облегчить ситуацию. Но теперь ее внутренняя структура из вспомогательного фактора превратилась в источник затруднений. V СОМ две главные проблемы: во-первых,
она требует от приложенияинфраструктуры, например,
фабрик классов иинтерфейсов. Всре
де разработки эти механизмы реализованы по-своему, поэтому они несколько отличаются и не настолько совместимы, как хотелось бы. Во-вторых, клиент и сервер СОМна
расстоянии. Их взаимодействие основано на внешних
сах, а не на сходствереализации. Можно сказать, что
у клиента и сервера СОМпо телефону». отличия
междуинтерфейсов СОМ коварны и трудно согла-
Например, в C + + строки реализованы иначе, чем в Microsoft Visual Basic, а строки в Java отличаются и от С + и от Microsoft Visual Basic. При передаче строки от сервера СОМ, написанного на Visualклиенту, написанному накто-то
должен сглаживать эти отличия. Обычно это делают приложения на С+ +, поскольку реализация из Visual Basic инвариантна. V программистов уходит куча времени на устранениев реа
лизации. При этом много времени пропадает зря (кроме того, это надоедает программистам, которые стремятся заняться чем-нибудь повеселее), и вы никогда не узнаете наверняка, будут ли все клиенты СОМ работать с вашим сервером,на их реа
лизацию. Необходимо сгладить эти различия, допуская более тесное взаимодействие
бы,наши npospaMMbt работали на самыхплатформах.бы,наши npospaMMbt работали на самыхплатформах.Web no своей сути гетерогенна, гомогенная Web это ничто. Этодоминирующеесвой- ство должно учитываться в архитектуре любой программы,на успех.
бы,
наши npospaMMbt работали на самых
платформах.
бы,
наши npospaMMbt работали на самых
платформах.
Хотя Microsoft и желала бы повсеместно
деть ПК подWindows, стало очевидно, что этого не
будет. Желательно, чтобы однажды написанное ПО работало на самых разных платформах. Этого ожидали от Java, но ожидания оправдались не полностьюне надо электронных
полных праведного гнева иэто МОЯ книга). Даже
если сегодня мы не можем использовать этот подход в
мере, в будущем хотелось бы иметь возможность развития ин- платформ.
памяти сегодня — одна из самых существенных причин сбоев программ, особенно тех, что работают в течение долгого времени. Случается, программист выделяет в ОС блок памяти с
А тматин^ексеуправление памятьюдолжна предотвращатьутечки памяти.А тматин^ексеуправление памятьюдолжна предотвращатьутечки памяти.намерением освободить его позже, но забы- ваетэтссделать и выделяет следующиеблок.
А тматин^ексеуправление памятьюдолжна предотвращатьутечки памяти.
А тматин^ексеуправление памятьюдолжна предотвращатьутечки памяти.
Тогда говорят, что произошла «утечка» блока памяти, поскольку в дальнейшем его уже не используешь. Если приложение работает
долго, «утечки» накапливаются, и ему не хватает памяти. Это не
важно в случае таких программ, как Блокнот, которые пользова-
тель запускает всего на несколько минут и после закрывает, но фатально для таких приложений, как Web-серверы, которые должны непрерывно работать в течение дней и недель. Можно следить за освобождением каждого выделенного бАОка, но все равно в программах со сложной логикой блоки часто теряются. Нужен такой механизм борьбы с утечкой памяти, о котором просто нельзя забыть; он должен быть как автоматический ремень безопасности, который невозможно забыть пристегнуть.
Требуется помощьприуправлении различнымиверсиями одного ц ТО2Оже пакета ПО.Требуется помощьприуправлении различнымиверсиями одного ц ТО2Оже пакета ПО.Ниодин продукт недостигает совершенства к моменту начала поставок. (Знаю, знаю: ваши достигают, но согласитесь, что все остальные — нет, да? Кроме того, как без обновлений получить дополнительные деньги за
Требуется помощьприуправлении различнымиверсиями одного ц ТО2Оже пакета ПО.
Требуется помощьприуправлении различнымиверсиями одного ц ТО2Оже пакета ПО.
уже проданное ПО?) Спустя некоторое время после выхода первой версии вы начинаете поставлять обновленную версию продукта с новыми функциями и исправлениями ошибок в старых, После этого начинается веселье: не важно, сколько усилий вы затратили на поддержку преемственности нового выпуска со
всеми старыми клиентами, на деле это осуществить очень труд- Iно и практически невозможно испытать. Как было бы здорово иметь механизм, используя который, серверы публиковали бы сведения о версии их ПО. Было бы неплохо, если б эти механизмы позволяли клиентам читать сведения о версиях ПО всех доступных серверов и выбрать совместимый или, при отсутствии такового, точно определить отсутствующие компоненты.
Благодаря таким методикам, как классы и наследование, ООП проникло в мир разработки ПО- Программы, сложность которых превышает определенный не слишком высокий уровень^ можно создавать лишь по этим методикам. К сожалению, все языки поддерживают очень разные сочетания функций ООП, которые в силу естественных причин несовместимы. Это значит, что взаи-
функции ООП былидоступны невои чтобыфункции ООП одногоязыка оыли доступныизфункции ООП былидоступны невои чтобыфункции ООП одногоязыка оыли доступныизмодействие различныхвозможно
функции ООП былидоступны нево
и чтобы
функции ООП одногоязыка оыли доступныиз
функции ООП былидоступны нево
и чтобы
функции ООП одногоязыка оыли доступныиз
лишь на очень низком ния.СОМ не
мистам на Visual Basic расширять
написанных на C++ с
помощью удобных механизмов масАрдовп- ния. Вместо этого приходится обходить эти
ограничения, применяя громоздкие механизмы. Хотелось
чтобы функции ООП были доступны не только в каждом языке,
но и чтобы функции ООП одного языка были доступны в другом.
•безопасностивозможность ограничения действий фрагмен-нетполного доверия.;•безопасностивозможность ограничения действий фрагмен-нетполного доверия.;Web очень быстро становитсяпользова-
•
безопасности
возможность ограничения действий фрагмен-
нет
полного доверия.
;
•
безопасности
возможность ограничения действий фрагмен-
нет
полного доверия.
;
телеи главным средством получения ПО, что ведет к возникновению серьезных проблем в области безопасности. Хотя в текущих версиях Windows автор загружаемых тов кода идентифицируется с помощью циф-
сертификатов, в настоящее время невозможно гарантировать, что какая-либо программа не нанесет ущерба скажем, зашифровав файлы. Можно решить, устанавливать за- программу или нет, но после этого нет ни одного приемлемого способа ограничить ееТакое решение типа
«все или ничего» на самом деле неприемлемо. Хотелось бы, чтобы нашем распоряжении был какой-то механизм, позволяющий устанавливатьразличных программ разрешенные и запре
щенные действия, а ОС могла бы реализовать эти ограничения. Скажем, только чтопрограмме можно было бы разрешить чтениено запретить запись.
лучшийорганизации функцийОСоблегченияработъ! с ними.лучшийорганизации функцийОСоблегченияработъ! с ними.По мере роста ОС Windows стала невообразимо сложной. Будучи вначале сервером игры «Пасьянс» ссотен фун
лучшийорганизации функцийОСоблегчения
работъ! с ними.
лучшийорганизации функцийОСоблегчения
работъ! с ними.
кций, она выросла в чудовищный сервер «Свободной ячейки», у которого более 5 000
функций. Нужную функцию просто невозможно отыскать в алфавитном— на это уходит слишком много времени. Программистысложными проектами, организуя ПО в
логические объекты. Чтобы получитькакой-то шанс найти
нужную функцию, нужен аналогичный способ организации функций ОС в логически связанные группы.
Новэя объёктнзя моо^дь ■ В конце концов я вовсе не хочу принижать
революционная технологияf и значительная ее часть останется с нами в обозримом будущем. Подобно первым цветным телевизорам, которые должны были принимать нереволюционная технологияf и значительная ее часть останется с нами в обозримом будущем. Подобно первым цветным телевизорам, которые должны были принимать недолжна бесшовно значение СОМ. Для своего времени это была взаимодействовать
революционная технологияf и значительная ее часть останется с нами в обозримом будущем. Подобно первым цветным телевизорам, которые должны были принимать не
революционная технологияf и значительная ее часть останется с нами в обозримом будущем. Подобно первым цветным телевизорам, которые должны были принимать не
с СОМ как в ячестве ;клиента> так и сервера.
только цветные, но и преобладавшие в то время черно-белые передачи, новая объектная модель должна бесшовно взаимодействовать с СОМ, как в качестве клиента, так и сервера. Должно быть ясно, что столь длинный список требовании не в состоянии реализовать самостоятельно ни один отдельно взятый разработчик приложений. Здесь мы достигли потенциального предела. Чтобы перейти в мир Интернета, требуется больше сил, чем нам может дать мир, в котором мы живем.
Архитектура решения
Решение заключается висйолмовании ^прайля-емого кода, gmo抽的一емого под управлениемCLR (Common languageкипите).Решение заключается висйолмовании ^прайля-емого кода, gmo抽的一емого под управлениемCLR (Common languageкипите).NET Framework — это продукт для ОС, со- зданнь1х Microsoft, который предоставляет готовые решения для перечисленных проблем при программировании. Ключевым понятием этой платформы является управляе- !享 мый код (managed code).равляемыйкод
Решение заключается висйолмовании ^прайля-емого кода, gmo抽的一емого под управлениемCLR (Common languageкипите).
Решение заключается висйолмовании ^прайля-емого кода, gmo抽的一емого под управлениемCLR (Common languageкипите).
работает в среде CLR (Common Language Runtime), которая поддерживает более богатьш набор служб; чем стандартная ОС Win32 (рис. 2-1). Среда CLR дает нам большую мощь, позволяющую нашим программам выжить в суровом и диком мире, которым является программирование для Интернета в настоящее время.
Но как может CLR, обладая такой архитектурой, работать с любым языком? Звучит не очень убедительно, но это зависит от вашего определения термина «язык». Любой инструмент разработки, совместимый с CLR, компилирует свой исходный текст в программы на стандартном языке Microsoft Intermediate Language (MSIL или, для краткости, IL) (рис. 2-2). Поскольку независимо от языка исходного текста все инструменты разработки выдают программы на одном и том же языке — IL, все различия в их реализации исчезают к моменту достижения CLR. Независимо от формы представления строк в исходном тексте на самом языке
шрограммирования их внутренняя реализация одинакова в любых программах, так как в CLR все они используют объект String. To же самое верно в отношении массивов, классов и всего остального.
Рис. 2-1. Управляемое исполнение программы в CLR.Рис. 2-1. Управляемое исполнение программы в CLR.Инструментыразработки,, такие какJust-in-timeVisual Studio.NETкомпилятор.Инструментыразработки,, такие какJust-in-timeVisual Studio.NETкомпилятор.Рис. 2-2. Исходные тексты на различных языках компилируются в программы на MS広Рис. 2-2. Исходные тексты на различных языках компилируются в программы на MS広
Рис. 2-1. Управляемое исполнение программы в CLR.
Рис. 2-1. Управляемое исполнение программы в CLR.
Инструменты
разработки,, такие какJust-in-time
Visual Studio.NETкомпилятор.
Инструменты
разработки,, такие какJust-in-time
Visual Studio.NETкомпилятор.
Рис. 2-2. Исходные тексты на различных языках компилируются в программы на MS広
Рис. 2-2. Исходные тексты на различных языках компилируются в программы на MS広
Исходныетексты налюбом язь1ке,совместимом с CLRкомпилируются впрограммы на единомпромежуточном языке.Исходныетексты налюбом язь1ке,совместимом с CLRкомпилируются впрограммы на единомпромежуточном языке.Для запуска на целевоймашине исходный текстна IL компилируется ПОтребованию (just-in-time).Для запуска на целевоймашине исходный текстна IL компилируется ПОтребованию (just-in-time).
Исходныетексты налюбом язь1ке,совместимом с CLRкомпилируются впрограммы на единомпромежуточном языке.
Исходныетексты налюбом язь1ке,совместимом с CLRкомпилируются впрограммы на единомпромежуточном языке.
Для запуска на целевоймашине исходный текстна IL компилируется ПОтребованию (just-in-time).
Для запуска на целевоймашине исходный текстна IL компилируется ПОтребованию (just-in-time).
Любая компания может создать язык, совместимый с CLR. В Microsoft Visual 5Edio.NET входят С L R-co вместимые версии Visual Basic, C# (произносится как «Cu-шарп)?), JScript и C + + . Сторонние компании также создали много других языков, среди которых APL, COBOL и Perl.
Код на IL, созданный инструментом разработки, не может сразу работать ни на каком компьютере. Для этого требуется следующий шаг — компиляция по требованию (just-intime, JIT) (рис. 2-2). Утилита компилятор по
требованию (just-in-time compilerили JITter) читает исходный текст
на IL и производит настоящий машинный код, способный рабо-
тать на данной платформе. Благодаря этому .NET в некоторой степени независима от платформы/ коль скоро для каждой платформы существует свой JITter. Microsoft не создает вокруг компиляции по требованию большой шумихи, какую создала Sun вокруг Java пять лет назад, поскольку эта функция еще не вышла из яслей. В настоящее время анонсирована лишь реализация CLR для Windows 2000, но я ожидаю, что через некоторое время появятся и другие. Эта стратегия рассчитана скорее на поддержку будущих версий Windows типа грядущей 64-разрядной версии и Windows XP, чем других ОС, например, Linux.
,ЖТ f ramework поддер-живает автоматическоеуправление памятьюс помощью методики,ЖТ f ramework поддер-живает автоматическоеуправление памятьюс помощью методикипод названием «сбор мусора».под названием «сбор мусора»..NET Framework поддерживает автоматическое управление памятью с помощью механизма сбор мусора (garbage collection). Программа н обязана явно освобождать выделенную для нее память. CLR определяет, что память
,ЖТ f ramework поддер-живает автоматическоеуправление памятьюс помощью методики
,ЖТ f ramework поддер-живает автоматическоеуправление памятьюс помощью методики
под названием «сбор мусора».
под названием «сбор мусора».
больше не используется программой и авто-
матически повторно использует ее. Хотел бы я себе прислугу, которая так же стирала бы мое белье!
№Т Frameworkподдерживает “вноестандартизированноеуправление версиями.№Т Frameworkподдерживает “вноестандартизированноеуправление версиями.Наконец, .NET Framework noqqepxuBaeTzyn- равление версиями. Технология 'Microsoft .NET дает разработчикам серверов стандар- , тизированный способ указания версии (эти
№Т Frameworkподдерживает “вноестандартизированноеуправление версиями.
№Т Frameworkподдерживает “вноестандартизированноеуправление версиями.
сведения находятся в конкретном ЕХЕ или
DLL-файле) и стандартизированный механизм, позволяющий клиенту указать нужную ему версию. ОС будет поддерживать запросы клиентами сведений о версии с помощью базового набора функций управления поведением, допуская их подмену разработчиком и позволяя в явном виде задавать поведение при управлении версиями.
.NET Framework расширяет сферу применения богатого набора функции ООП на все языки..NET Framework расширяет сферу применения богатого набора функции ООП на все языки.Поскольку в результате компиляции ucxoq- ных текстов нлюбом языке получаются тексты на IL, все поддерживающие CLR языки потенциально поддерживают одинаковый набор функций. Хотя в принципе можно со-
.NET Framework расширяет сферу применения богатого набора функции ООП на все языки.
.NET Framework расширяет сферу применения богатого набора функции ООП на все языки.
здать язык, совместимый с CLR, который не будет показывать программисту какие-либо лежащие в его основе функции CLR, думаю, что в этих безжалостных дарвиновских джунглях, коими
современный рынок ПО, эта нездоровая идея быстро отомрет. CLR поддерживает богатый набор ООП, в частности, наследование и создание объектов с параметрами. Не пугайтесь, если на слух эти понятия покажутся вам сложными — зато они просты в использовании. Они сэкономят вам массу сил, избавят от многих потенциальных ошибок и со временем понравятся вам.
NET Frameworkзует функциональность вкоеNET Frameworkзует функциональность вкоеFramework организует'
NET Framework
зует функциональность в
кое
NET Framework
зует функциональность в
кое
ность ОСпространства
System. Все объекты, интерфейсы и функции ОС теперь иерархически организованы, так что искать нужныестало гораздо лег-
че. Это также исключает конфликты имен между объектами и функциями, созданными вами, объектами и функциями самой ОС и созданными другими разработчиками.
Frameworkподдерживаетбезопасность кода.Frameworkподдерживаетбезопасность кода.Frameworkбезопасность
Framework
поддерживаетбезопасность кода.
Framework
поддерживаетбезопасность кода.
доступа к коду. Можно разрешить выполнять действия одной программе и
запретить другой. Скажем, программе мож-
но разрешить чтение файлов, но запретить запись. CLR реализует заданные ограничения и блокирует любые попытки выйти за их Это значит, что к полученному из разных источников коду можно разные уровни доверия аналогично тому, как вы no-разному людям, с которыми имеете дело. Это позволяет работать с кодом, загруженным из не беспокоясь за целостность системы.
Frameworkчитает бесшовноевзаилюдействие с СОМвтак иFrameworkчитает бесшовноевзаилюдействие с СОМвтак иFrameworkбес-
Framework
читает бесшовноевзаилюдействие с СОМв
так и
Framework
читает бесшовноевзаилюдействие с СОМв
так и
взаимодействие с СОМ как в каче- так и сервера.помещает
объект СОМ в объект-оболочку, в те первый воспринимается как встроенный объектЭто значит,у коданет
об объектах, с которыми он работает, да это и не суть важно. С другой стороны, объекты знают, как регистрироваться на определенном уровне абстрагирования, что позволяет
клиентам СОМ воспринимать их как серверы СОМ.
Вот так... И почем все это?
Становится сложнее ОС, на деле не стоит об этом беспокоиться.Становится сложнее ОС, на деле не стоит об этом беспокоиться.А как быть созаконом Платта («Ко
Становится сложнее ОС, на деле не стоит об этом беспокоиться.
Становится сложнее ОС, на деле не стоит об этом беспокоиться.
во Вселенной см. главуу меня стало
проблем (скажем, мне больше не нужно заботиться освобождении выделенной
памяти), они не исчезли бесследно и обязательно падут на чью- то голову. В случае эти проблемы свалились главным образом на две группы голов: Microsoft и Intel (все мои читатели, работающие в Sun, вскочили с радостным воплем).
Microsoft создание ОС усложнилось. Написать автоматический сборщик мусора вроде что содержится в на несколько порядков чем диспетчер кучи вроде встроенного в Windows 2000. Поскольку Microsoft надеется продать несколько миллионов корпорация может позволить себе нанять много умных программистов и инженеров. Такое разделение труда — оставить Microsoft все заботы по разработке инфраструктуры — очень неглупо с экономической точки зрения.
Вычислительные задачитоже—растут к вычислительном мощи компьютеров.Вычислительные задачитоже—растут к вычислительном мощи компьютеров.Framework заставит Intelбо-
Вычислительные задачитоже—
растут к вычислительном мощи компьютеров.
Вычислительные задачитоже—
растут к вычислительном мощи компьютеров.
быстрые процессоры и больше чипов памяти. Кое-кто из отдела маркетинга Microsoftчторабо-
как прочие, ноне
так, и никогда так не будет. Сложный меха-
низм сбора мусора требует больше вычислений, чем простое выделение памяти из кучи аналогично тому, как в автоматическом ремне безопасности большечем в ручном. Кроме
поскольку сбор мусора производится не так часто, придется увеличить память компьютера, чтобы ее хватило приложениям, в то время как остается достаточно «мусорных»подлежа
щих уборке. (Помните закон Гроша? Если нет — загляните в конец главыНе думаю, что дополнительная память и циклы процессора будут потраченывпустую, как в Офи
се на танцы дурацкой скрепки. Думаю, они будут разумно вложены, что сэкономит, таким образом, ваше время и деньги, позволяя писать программы быстрее и снижая число ошибок в них, поскольку большая часть грязной работы достанется ОС. Приложения, использующие обычную дисковую ОС, никогда не
будут работать так же быстро, как те, что программируют движения головок жесткого диска (указывая сектор и дорожку). Но это непозволительно, так как занимает слишком много времени, стоит чересчур дорого и не позволяет обработать достаточно много данных. Можно потратить все свое время на глупые операции с дисковыми секторами и никогда не кончить работы, за которую платят. Как только появляется возможность абстрагироваться от проблем, связанных с инфраструктурой, это становится потребностью. Если ваш диспетчер памяти работает довольно сносно, вы сэкономите время при отладке, отслеживая утечки памяти.
Простейший пример
Здесь начинаетсярассмотрение примераобъекта ,N'£T F*meworkЗдесь начинаетсярассмотрение примераобъекта ,N'£T F*meworkЯ написал простейш'ую программу, чтобы на ее примере продемонстрировать принципы работы .NET Framework. В дальнейшем по ходу книги я буду поступать так же. Этот при-
Здесь начинаетсярассмотрение примераобъекта ,N'£T F*mework
Здесь начинаетсярассмотрение примераобъекта ,N'£T F*mework
мер, как и другие программы из этой книги, доступны по адресу www.introducingmicrosoft.net. Я написалобъект-сервер .NET, .NET- альтернативу библиотеки ActiveX из Visual Basic 6 и соответствующий клиент. Сервер поддерживает единственный объект, имеющий единственный метод — CetTime, который в виде строки предоставляет текущее системное время с секундами или без них.
Даже несмотря на то, что сервер написан на Visual Basic, а клиент — на С#, мне не пришлось задействовать Visual Studio. Честно говоря, оба приложения я писал в Блокноте и компоновал их, используя инструменты командной строки из состава .NETSDK. В других разделах этой главы я обязательно приведу примеры применения Visual Studio.NET. Копия .NETSDK доступна по адресу www.msdn.microsoft.com/net.
Г Vis-iial BssIcNET сги^п- житрядсущественных otaumuG от Visuat Basic 6.внесла ряд важныхГ Vis-iial BssIcNET сги^п- житрядсущественных otaumuG от Visuat Basic 6.внесла ряд важныхНиже приведен пример объекта-сервера (рис. 2-3). По крайней мере на первый взгляд он напоминает программу, написанную на классическом Visual Basic. Однако в версию Visual Basic, которая вошла в NET, Microsoft
Г Vis-iial BssIcNET сги^п- житрядсущественных otaumuG от Visuat Basic 6.
внесла ряд важных
Г Vis-iial BssIcNET сги^п- житрядсущественных otaumuG от Visuat Basic 6.
внесла ряд важных
изменений, позволивших ей работать с классами CLR из NET и
корректно взаимодействовать с другими языками CLR. Подроб-
ное обсуждение этих изменений выходит далеко за рамки этой
книги, нопримера скажу: теперь индексация элементов массивовне с а с 0. Еслимассив сэлементами x (10)его члены будут пронумерованы
числами от 0 до 9 вместокак вы привыкли. В сражении
между ребятами, программирующими на C++ и за то, чей синтаксис массивов лучше соответствуетпобеда за С++-
но эти изменения означают, что корректная работа существующих программ на VB послеперекомпиля
ции в Visual Studio.NET невозможна. Вопреки вашим надеждам приведение программ вс требованиямипотребует определенных, но не слишком больших усилийпос
ледние новости в примечании в конце главы).
Примечание
Т"
В Visualсредство обновления, которое
запускается, когда вы
Visual Basic 6. Оно помечает обнаруженные необходимые и предлагаетОпределенно,
стал болееМожно решиться на переход к
за крутыхпоИнтернета. Даже
если вытолько
приложенияобработки форм,могут поддержкауправленияразиресурсов.
При взгляде на исходный текст нашегопрежде
всего заметна директива Imports. Эта новая директива языка Visualзаставляет компилятор «импортировать простран
ства имен». Термином пространство имен (namespace) обозначают описание набора готовой функциональности, поддерживаемого некоторым классом в некотором окружении. Концептуально он идентичен ссылке в проекте Visual Basic 6. Список имен наборов функциональности,после директивы Imports,
задает наборы функциональности, ссылки на которые должны быть включены исполняющим ядром. В данном случае Micro- это ссылка, содержащая определение функции которая служит для получения значения времени. При использовании языка Visual Basic в Visual Studio.NET пространство
имен Visual Basic импортируется автоматически, для этого не требуется указывать оператор в явном виде.
' Импортировать внешнее пространство имен Visual
' Basic, чтобы получить возможность обращаться к
' функции Now по ее сокращенному имени.
Imports Microsoft. Visual Basic
, Объявить пространство имен. с помощью которого клиенты смогут получать доступ к классам этого
'компонента.
Namespace TimeComponentNS
' Объявить класс(ы)! которые будет предоставлять
' клиенту эта DLL.
' Это делается так же, как и на VB6.
Public Class TimeComponent
' Объявить функцию(и), которую(*е) этот класс
' будет предоставлять клиенту.
' И это делается так же, как и на VB6.
Public Function fietTiwe (ByVai ShowSeconds As Boolean) _
As String
' В силу некоторых причин форматирование дат и возврат значений функций в Visual Basic,NET различны.
If (ShowSeconds = True) Then
Return Now. ToLongTimeString
Else
Return Now. ToShortTimeString
End If
End Function
End Class
IEnd Namespace
Рис. 2-3. Листинг исходного текста простейшего объекта-сервера.
Далее мы видим директиву Namespace TimeComponentNS. Она объявляет пространство имен моего компонента; с помощью этого имени клиенты смогут получить доступ к функциональности компонента. Пространства имен мы обсудим ниже в этой главе. Опять же, при использовании Visual Studio.NET пространство имен объявляется автоматически.
Далее им объявления классов и функций, 8 этом разделе
• приводится описаниеидентичные таковым наvisual Basic 6. Нако-
объекту 叩肥paNET,не a я разместил во внутренней логике полу
чения времени операторы для форматирования его значения в строку и возврата строки клиенту. Эти операторы несколько различны. Свойство Now no-прежнему получает дату, но форматирование в строку теперь производит метод нового класса DateTimef а не отдельная функция. Значение, возвращаемое функцией Visual Basic, теперь задается новым ключевым словом Return, что отличается от синтаксиса, применявшегося в
ранних версиях.
Затем инструментами командной строки из
Прикомпиляции исход-,
ных текстов «аязыкескомпилировал исходный текст в
Visual Baste получаются DLL, которую назвал timecomponent.dll. Те, ОН, содержащие IL кому нужен образец синтаксиса командной и метаданные.строки, найдут его в программе-примере,
загруженной с сайта книги. Полученная в
результате библиотека может показаться обычной DLL, но внутри она устроена совершенно иначе. Компилятор Visual Basic.NET
не преобразует код Visual Basic в машинные коды (команды, спе-
цифичные для вашего процессора). Вместо этого логика моего объекта-сервера в DLL выражена на IL, промежуточном языке, с которым мы познакомились в разделе «Архитектура решения». Все компиляторы языков CLR выдают вместо машинных кодов процессора исходные тексты на IL. Это позволяет CLR бесшовно работать с множеством различных процессоров. Полученная DLL также содержит метаданные (metadata), т. е. описание кода для системы CLR. Формат метаданных^ необходимый для описания содержимого DLL, определяется CLR: они содержат сведения о том, какие классы и методы хранятся в DLL, какие внешние объекты ей нужны, какую версию программы она представляет Iи т. д. Ее можно рассматривать как библиотеку типов, накачан-
ную анаболиками. Главное отличие в том, что сервер СОМ иногда должен работать без библиотеки типов, тогда как сервер объекта .NET не может и подумать о том, чтобы работать без своих метаданных. Эти метаданные мы обсудим в разделе «Сборки».
Степень сходства ме*оу Visual Basic и C# б(мь- ше, чем это принято считать в сообществах программистов, использующих эти языки.Степень сходства ме*оу Visual Basic и C# б(мь- ше, чем это принято считать в сообществах программистов, использующих эти языки.Для проверки готового сервера нужен клиент, Чтобы продемонстрировать тот факт, что .NE1 работает с различными языками., я написал клиент на С#. Знаю, что в настоящее время этот язык знаком немногим, а может, и никому из вас. Но если взглянуть на следу-
Степень сходства ме*оу Visual Basic и C# б(мь- ше, чем это принято считать в сообществах программистов, использующих эти языки.
Степень сходства ме*оу Visual Basic и C# б(мь- ше, чем это принято считать в сообществах программистов, использующих эти языки.
ющий код (рис. 2-4), станет ясно, что на таком уровне сложнос-
ти разобраться в нем можно. По правде говоря. после улучшений, внесенных в Visual Basic. NET для поддержки функции ООП,
таких как наследование (см. ниже), мне доводилось слышать, как программисты после пары кружек пива называли C# «VB с ;» или даже «Java без Sun», За любой из этих эпитетов легко схлопотать, если произнести его слишком громко, перепутав бары в Редмонде и Саннивэйле.
Исходный текст примера клиента начинается с импорта пространств имен, для этого на C# требуется указать директиву using. Наш клиент импортирует пространство имен System (его подробное описание см. ниже), которое содержит описание中ун- кции Console.Write и пространство имен нашего компонента time. Надо явно указать компилятору DLL, в которой расположено пространство имен, что можно сделать в пакетном файле компилятора. Для этого также служит удобный пользовательский интерфейс Visual Studio.NET.
Исполнение любой С#-программы начинается со статического метода Main. Видно, что в нем наша клиентская программа с помощью оператора С # new дает указание исполняющему ядру CLR отыскать DLL, содержащую класс Time Component, и создать его экземпляр. В следующей строке вызывается метод этого объекта CetTime. Затем системный метод Consoie.Write выводит значение времени в окне командна строки. В этом случае компилятор С# создает ЕХЕ-файл. Подобно DLLсервера,, этот ЕХЕ-файл содержит не машинные коды, а промежуточный язык и метаданные.
//
Импортировать пространства
имен.
которые
//
использует эта программа,
чтобы
получить
//
возможность обращаться к их функциям по
//
сокращенным именам.
using System ;
using TimeComponentNS ;
class MainApp
// Статический метод "Main" является точкой
// входа в приложение.
public static void Main ()
// Объявить и создать новый компонент класса, // который поддерживается сервером,
// написанным на VB.
TimeComponent tc = new TilneCoinponent ()
// Вызвать метод сервера GetTlme. Вывести
// результирующую строку в консольном окне.
Console. Write (tc. GetTlme (true)) ;
Рис. 2-4. Исходный текст на С# простейшего клиента объекта,
При компиляцииклиента, написанногона С#, тоже получаетсяфайд с IL.При компиляцииклиента, написанногона С#, тоже получаетсяфайд с IL.При запуске исполняемого файла клиента, написанного на С#, системный загрузчик определяет, что это управляемый код, и передает его ядру CLR. Ядро, обнаружив IL в ЕХЕ-файле, вызовет компилятор по требова
При компиляцииклиента, написанногона С#, тоже получаетсяфайд с IL.
При компиляцииклиента, написанногона С#, тоже получаетсяфайд с IL.
нию (just-in-time compiler или JITter). JITter — это системный инструмент, который преобразует IL в машинные коды любого процессора и ОС, под управлением которой он работает. Для каждой архитектуры есть собственный JITte「, соответствующий особенностям конкретной системы. Благодаря этому один и тот же набор IL-инструкций может работать на системах различного типа. JITter создает машинные коды, которые начинает исполнять обработчик CLR. Когда клиент вызывает оператор new для созда-
ния объекта класса Time Component, обработчик CLR вновь вы- 3OBeTjlTterz чтобы по требованию скомпилировать IL из DLL компонентов, а затем выполняет вызов и возвращает результат. При этом выводится следующая информация (рис. 2-5).
С onuiMRd ЯПЯ|Ц><С onuiMRd ЯПЯ|Ц><|«ri/ZJz7mif 02/ИЬ/2001|«ri/ZJz7mif 02/ИЬ/2001——>^ -me/2 ми——>^ -me/2 ми<»IR><»IR>卜一…卜一…Ws ,;:■Ь ■1lr<r >Ws ,;:■Ь ■1lr<r >k;:、M:lk;:、M:lIhMkM^tdflMUMjHerIhMkM^tdflMUMjHerbo・ k7 A4c、Ch.|t,r rbo・ k7 A4c、Ch.|t,r r——2\K 1Лц1*>1 X*Mc 3 ♦■■■2\K 1Лц1*>1 X*Mc 3 ♦■■■beeh'-<Z»He *-Омр1*>1*beeh'-<Z»He *-Омр1*>1*Z\S mi. I ・•■ >t inac 1 lr«tZ\S mi. I ・•■ >t inac 1 lr«t♦? 2I tent.hatII 2nnponr|)( .l»OtbS(i 11яс< I tent .ci t iiM-i I ictit .■" 11ги*Оимюпгп1 .411 QwtponcMt .*h♦? 2I tent.hatII 2nnponr|)( .l»OtbS(i 11яс< I tent .ci t iiM-i I ictit .■" 11ги*Оимюпгп1 .411 QwtponcMt .*h2,ltl.lu—%■ ^■•eiet'eiicc: t imecuiipu»t>«t riill t iriflci 11в>>1,2,ltl.lu—%■ ^■•eiet'eiicc: t imecuiipu»t>«t riill t iriflci 11в>>1,mict*«3ort <R> ・,B11 <:■ Cocptl。,Uers ion 7,*Я»Л14« I CLR ven len vl.・.2S,5l li.upvt'iwbt <C> Hiurviaft C«*i-)> ^HM. A11 ri*(litt ecarvod.mict*«3ort <R> ・,B11 <:■ Cocptl。,Uers ion 7,*Я»Л14« I CLR ven len vl.・.2S,5l li.upvt'iwbt <C> Hiurviaft C«*i-)> ^HM. A11 ri*(litt ecarvod.С:\НЫ hook\(.Hadd''€brtptor 2\S 1иц1*4К >t irwic LivniLG:2U:43 ЙМC: \NE1 huok'.Cuda '-Chaptpv 2\£1л№^и* (^1^Ь1*йп * Ll'^nc^>п|Kri^*,^^ .dl 5С:\НЫ hook\(.Hadd''€brtptor 2\S 1иц1*4К >t irwic LivniLG:2U:43 ЙМC: \NE1 huok'.Cuda '-Chaptpv 2\£1л№^и* (^1^Ь1*йп * Ll'^nc^>п|Kri^*,^^ .dl 5|C:、NL[ booh^Vnd• чС1м1»С0г 2 4$ci>L・a,>|C:、NL[ booh^Vnd• чС1м1»С0г 2 4$ci>L・a,>Рис. 2-5. Информация, которую выводит на консоль программа TimeClient.Рис. 2-5. Информация, которую выводит на консоль программа TimeClient.Модель компиляции в период выполнения неплохо работает в случае некоторых классов приложений, например, программы на Ин- тернет-странице, на которую вы только что зашли. Но для других приложении она подходит хуже, например, для Visual Studio, ко-Модель компиляции в период выполнения неплохо работает в случае некоторых классов приложений, например, программы на Ин- тернет-странице, на которую вы только что зашли. Но для других приложении она подходит хуже, например, для Visual Studio, ко-Исходный текст на It, компилируетсяпо требозанаю призапуске клиента или吟компонентов.Исходный текст на It, компилируетсяпо требозанаю призапуске клиента или吟компонентов.торой be пользуетесь семь дней в неделю и обновляете ее раз или два в год. Поэтому можно указать, что JIT-компиляция при-торой be пользуетесь семь дней в неделю и обновляете ее раз или два в год. Поэтому можно указать, что JIT-компиляция при-ложения должна осуществляться только раз при установке его на машину, а полученный при этом машинный код будет храниться в системе, как обычное приложение. Это делает утилита командной строки Ngen.exe (native image generator), которая в этом примере не показана.ложения должна осуществляться только раз при установке его на машину, а полученный при этом машинный код будет храниться в системе, как обычное приложение. Это делает утилита командной строки Ngen.exe (native image generator), которая в этом примере не показана.Как загрузчик узнает местонахождение DLL сервера, когда клиент создает объект с помощью оператора new? Он просто ищет ее в каталоге, где находится клиентское приложение. Эта простейшая из моделей разверты-Как загрузчик узнает местонахождение DLL сервера, когда клиент создает объект с помощью оператора new? Он просто ищет ее в каталоге, где находится клиентское приложение. Эта простейшая из моделей разверты-Загрузчик находитзапрошенную клиентомDLL в каталоге клиентс-кого приложения.Загрузчик находитзапрошенную клиентомDLL в каталоге клиентс-кого приложения.вания NET называется закрытой сборкой (private assembly). На закрытую сборку можно ссылаться только из ее каталога. Она не поддерживает проверку версий и функции безопасности. Она невания NET называется закрытой сборкой (private assembly). На закрытую сборку можно ссылаться только из ее каталога. Она не поддерживает проверку версий и функции безопасности. Она не
С onuiMRd ЯПЯ|Ц><
С onuiMRd ЯПЯ|Ц><
|«ri/ZJz7mi
f 02/ИЬ/2001
|«ri/ZJz7mi
f 02/ИЬ/2001
——>^ -
me/2 ми
——>^ -
me/2 ми
<»IR>
<»IR>
卜一…
卜一…
Ws ,;:■
Ь ■1lr<r >
Ws ,;:■
Ь ■1lr<r >
k;:、M:l
k;:、M:l
IhMkM^tdflMUMjHer
IhMkM^tdflMUMjHer
bo・ k7 A4c、Ch.|t,r r
bo・ k7 A4c、Ch.|t,r r
—
—
2\K 1Лц1*>1 X*Mc 3 ♦■■■
2\K 1Лц1*>1 X*Mc 3 ♦■■■
beeh'-<Z»He *-Омр1*>1*
beeh'-<Z»He *-Омр1*>1*
Z\S mi. I ・•■ >t inac 1 lr«t
Z\S mi. I ・•■ >t inac 1 lr«t
♦? 2I tent.hat
II 2nnponr|)( .l»Ot
bS(i 11яс< I tent .ci t iiM-i I ictit .■" 11ги*Оимюпгп1 .411 QwtponcMt .*h
♦? 2I tent.hat
II 2nnponr|)( .l»Ot
bS(i 11яс< I tent .ci t iiM-i I ictit .■" 11ги*Оимюпгп1 .411 QwtponcMt .*h
2,ltl.lu—%■ ^■•eiet'eiicc: t imecuiipu»t>«t riill t iriflci 11в>>1,
2,ltl.lu—%■ ^■•eiet'eiicc: t imecuiipu»t>«t riill t iriflci 11в>>1,
mict*«3ort <R> ・,B11 <:■ Cocptl。,Uers ion 7,*Я»Л14« I CLR ven len vl.・.2S,5l li.upvt'iwbt <C> Hiurviaft C«*i-)> ^HM. A11 ri*(litt ecarvod.
mict*«3ort <R> ・,B11 <:■ Cocptl。,Uers ion 7,*Я»Л14« I CLR ven len vl.・.2S,5l li.upvt'iwbt <C> Hiurviaft C«*i-)> ^HM. A11 ri*(litt ecarvod.
С:\НЫ hook\(.Hadd''€brtptor 2\S 1иц1*4К >t irwic Livni
LG:2U:43 ЙМ
C: \NE1 huok'.Cuda '-Chaptpv 2\£1л№^и* (^1^Ь1*йп * Ll'^nc^>п|Kri^*,^^ .dl 5
С:\НЫ hook\(.Hadd''€brtptor 2\S 1иц1*4К >t irwic Livni
LG:2U:43 ЙМ
C: \NE1 huok'.Cuda '-Chaptpv 2\£1л№^и* (^1^Ь1*йп * Ll'^nc^>п|Kri^*,^^ .dl 5
|C:、NL[ booh^Vnd• чС1м1»С0г 2 4$ci>L・a,>
|C:、NL[ booh^Vnd• чС1м1»С0г 2 4$ci>L・a,>
Рис. 2-5. Информация, которую выводит на консоль программа TimeClient.
Рис. 2-5. Информация, которую выводит на консоль программа TimeClient.
Модель компиляции в период выполнения неплохо работает в случае некоторых классов приложений, например, программы на Ин- тернет-странице, на которую вы только что зашли. Но для других приложении она подходит хуже, например, для Visual Studio, ко-
Модель компиляции в период выполнения неплохо работает в случае некоторых классов приложений, например, программы на Ин- тернет-странице, на которую вы только что зашли. Но для других приложении она подходит хуже, например, для Visual Studio, ко-
Исходный текст на It, компилируетсяпо требозанаю призапуске клиента или吟компонентов.
Исходный текст на It, компилируетсяпо требозанаю призапуске клиента или吟компонентов.
торой be пользуетесь семь дней в неделю и обновляете ее раз или два в год. Поэтому можно указать, что JIT-компиляция при-
торой be пользуетесь семь дней в неделю и обновляете ее раз или два в год. Поэтому можно указать, что JIT-компиляция при-
ложения должна осуществляться только раз при установке его на машину, а полученный при этом машинный код будет храниться в системе, как обычное приложение. Это делает утилита командной строки Ngen.exe (native image generator), которая в этом примере не показана.
ложения должна осуществляться только раз при установке его на машину, а полученный при этом машинный код будет храниться в системе, как обычное приложение. Это делает утилита командной строки Ngen.exe (native image generator), которая в этом примере не показана.
Как загрузчик узнает местонахождение DLL сервера, когда клиент создает объект с помощью оператора new? Он просто ищет ее в каталоге, где находится клиентское приложение. Эта простейшая из моделей разверты-
Как загрузчик узнает местонахождение DLL сервера, когда клиент создает объект с помощью оператора new? Он просто ищет ее в каталоге, где находится клиентское приложение. Эта простейшая из моделей разверты-
Загрузчик находитзапрошенную клиентомDLL в каталоге клиентс-кого приложения.
Загрузчик находитзапрошенную клиентомDLL в каталоге клиентс-кого приложения.
вания NET называется закрытой сборкой (private assembly). На закрытую сборку можно ссылаться только из ее каталога. Она не поддерживает проверку версий и функции безопасности. Она не
вания NET называется закрытой сборкой (private assembly). На закрытую сборку можно ссылаться только из ее каталога. Она не поддерживает проверку версий и функции безопасности. Она не
требует записей в реестре, что необходимо серверу СОМ. Все, что нужно сделать для удаления закрытой сборки, — стереть ее файлы, и никакой дополнительной очистки. Очевидно, ”то, несмотря на эффективность таких простых решений в подобных ситуациях, они годятся не всегда. В частности, они не идеальны, когда одну серверную программу нужно предоставить в совместное использование нескольким клиентам. Более сложные сценарии мы обсудим ниже в разделе, посвященном сборкам.
Подробнее о пространствах имен .NET
Легко выбиратьэлементы из короткихалфавитных списков.Легко выбиратьэлементы из короткихалфавитных списков.функцию, чье имяфункцию, чье имяПомню, как, программируя для Windows 2.0, я просматривал алфавитный список функций ОС (отпечатанный на бумаге — вот как давно это было!), пока не находил какую-нибудь напоминало мне предмет поиска. Я пробовал
Легко выбиратьэлементы из короткихалфавитных списков.
Легко выбиратьэлементы из короткихалфавитных списков.
функцию, чье имя
функцию, чье имя
задействовать ее, иногда получалось, иногда — нет. Если функция не работала, я опять лез в список. Организовать в алфавитный список несколько сотен функций Windows 2.0 было довольно разумно. Обычно я с первого взгляда (ну, со второго или третьего точно) замечал все, чем мне может быть полезна ОС, что давало мне шанс написать достойную программу, хотя и не без ограничений.
-По мере того, как список становится длиннее;.все осложняется.-По мере того, как список становится длиннее;.все осложняется.В современных 32-разрядных Windows все Функции ОС просто невозможно организовать в алфавитный список. Их жутко много — больше 5 000. Я не смогу найти функции для
-По мере того, как спи
сок становится длиннее;.
все осложняется.
-По мере того, как спи
сок становится длиннее;.
все осложняется.
вывода на консоль в таком чересчур длинном списке. Они разбросаны среди слишком большого числа функций, не имеющих отношения к предмету, что затрудняет их поиск. Для создателей ОС это тоже проблема. Добавляя новую функцию, им приходится выбирать для нее имя, которое должно быть описательным и
не конфликтовать с именами уже реализованных функций. Прикладные программисты также должны быть уверены, что имена их глобальных функций не конфликтуют с функциями ОС. Отношение «сигнал/шум» при таком подходе снижается по мере удлинения списка функций, и на сегодня оно приближается к абсолютному нулю. Можно сказать, что пространство имен (name-
набор имен, в пределах которого любое имя должно быть уникальным, стало слишком велико.
С большими списками легчераз-
способ обработ-
бив их на меньшие «подсписки», — их легче Классическимтакого подхода может служить кнопка менюгруппы.
Start в Windows. Если бы приложения со все
го компьютера были собраны в одно гигантское меню, вы бы никогда не нашли в нем нужное приложение. Вместо этого ужаса меню Startотносительносписок (что-то
околопунктов), который легко просматривать в поисках нужного элемента. Вгруппесписок логических подгрупп,
вложенных настолько глубоко, насколько это вам покажется оправданным. В итоге каждая из них раскрывается в короткий список реальных приложений. Чтобы запустить нужное приложение припо меню, в общей сложности приходится про
до 50 элементов, но их никогда не бывает больше дюжины (или около того) одновременно. Вы только подумайте, насколько это легче по сравнению с выбором нужного приложения из тысячистолько их установлено на
компьютеров) с помощью единственного меню.
Frameworkспо
-- Виспользуется
соб организации функции и объектов ОС.пространства
Этот механизм исключает конфликты между—
именами функций и объектов, написаннымив пределах
вами и другими разработчиками. Он основан на понятии пространства имен — логическо
го подразделения функциональности ПО, в пределах которого имена должныуникальны. Само по себе это понятие не
ново, его десятилетиями использовали в объектно-ориентированных языках. Однако этоизвестный мне случай, когда с
помощью пространств имен ворганизована вся функцио
нальность ОС.
Всеи функцииCLR являются 1
Всеи функции
частью пространства имен System. При поис-в
ке в документации можно заметить, что всеимен
имена начинаются с символов «System». Мож- :
но сказать, что все объекты и функции, имена которых начинаются с таких символов, «принадлежат к пространству имен System». Конечно, пространство имен System довольно велико, так как оно содержит имена каждого функционального элемента из их богатого набора в ОС. Поэтому оно разделено на несколько подчиненных пространств имен, скажем, System.Console, содержащее все функции, которые имеют дело с вводом-выводом в окно консоли. V некоторых из этих подпространств имен есть еще вложенные «п одподп ростра нства» и т. д. вглубь, пока не устанут Iразработчики. Полностью квалифицированным именем (fully qualified name) функции, которое иногда называют квалифицированным именем (qualified name) или q-именем (q-name), является имя, где перед именем собственно функции стоит полный путь к ней в пространстве имен, или квалификатор (qualifier). Например, System.Console. Write— это полностью квалифицированное имя системной функции, которая выводит информацию в окне консоли. Полностью квалифицированное имя позволяет вызвать функцию из любого места программы.
;Р Пространство имен System очень велико. Пространство имен
DLL, поэтому надоудостовериться. что I ваше средстворазработки «знает>>. что ;нужно подключить всенеобходимые DLL.DLL, поэтому надоудостовериться. что I ваше средстворазработки «знает>>. что ;нужно подключить всенеобходимые DLL.System реализовано в Поэтому оно реализовано в нескольких от- нескольких отдельных дельных DLL. Простого факта принадлежно-
DLL, поэтому надо
удостовериться. что I ваше средство
разработки «знает>>. что ;нужно подключить всенеобходимые DLL.
DLL, поэтому надо
удостовериться. что I ваше средство
разработки «знает>>. что ;нужно подключить всенеобходимые DLL.
сти функции или объекта к пространству имен System недостаточно, чтобы ваш редактор, компилятор или компоновщик смог ее наши. Еобщем случае при сборке придется
( указать инструментам разработки, какие DLL
пространства имен System подключить к про-
екту. Скажем, я часто выполняю сборку компонентов .NET в Visual
Studio и при их отладке использую сообщения. Объект MessageBox является частью пространства имен System. Win dows. Forms, реализованного в библиотеке System.Windows.Forms.dll. При созда-
нии проекта «Библиотека компонентов» Visual Studio не включа-
ет эту DLL в список ссылок автоматически (возможно, потому, что авторы Visual Studio полагают, что эти компоненты будут работать «за кулисами», не взаимодействуя с пользователем). Если я хочу получить в проекте доступ к MessageBox, мне приходится добавлять эту ссылку в явном виде.
Импорт пространства имен позволяет вызывать его функцииI ; с ПОМОифЮИмпорт пространства имен позволяет вызывать его функцииI ; с ПОМОифЮПодобный способ организации функций в логические группы очень удобен и позволяет найти нужную функцию с минимумом суеты. Его единственный недостаток в том, что полностью квалифицированные имена могут быть очень длинны. Так, функция System. Run
Импорт пространства имен позволяет вызывать его функции
I ; с ПОМОифЮ
Импорт пространства имен позволяет вызывать его функции
I ; с ПОМОифЮ
time. In teropServices.Marshal. ReleaseCom Object сразу освобождает заданный объект СОМ, не выполняя полный сбор мусора (см. раздел «.Управление памятью в .NET»). В большинстве .NET-npu- ложений эта функций вообще не нужна, но в некоторых может использоваться многократно. Если набирать это длиннющее имя целиком каждый раз, когда нужно вызвать функцию^ вы быстро выбьетесь из сил. Ведь моя жена обращается ко мне «Дэвид Сэмюэл Платт, сын Бенджамина, внук Джозефа», только когда о-о- очень сердита, а в этом состоянии она бывает лишь недолго. Поэтому аналогично тому, как люди, состоящие в близких отношениях, обращаются друг к другу по имени, CLR позволяет импортировать пространство имен (рис. 2-3 и 2-4). Импортируя пространство имен, вы как бы говорите компилятору о том, что будете использовать функции из этого пространства имен так часто, что хотите перейти с ними на «ты» и обращаться по имени, Импорт пространства имен на Visual Basic выполняет ключевое слово imports, а в Сопрограммах — ключевое слово using. Так, выше я импортировал пространство имен System, благодаря чему смог вывести информацию на консоль, вызвав функцию Console. Write (рис. 2-4). Если бы я не импортировал пространство имен System, эту функцию пришлось бы вызывать по полностью квалифицированному имени System.Console. Write. С другой стороны, если импортировать пространство имен System. Console, я смог бы вызвать эту функцию просто как Write. Выбор пространства имен для импорта должен определяться комфортом при разработке и не влияет на конечный продукт. Он просто позволяет организовать мыслительный процесс так, чтобы получать наилучшие результаты. Поскольку вся идея отдельных пространств имен заключается в том, чтобы предотвратить конфликты путем помещения одноименных функций в разные пространства имен, нельзя одновременно импортировать все пространства имен. Во избежание путаницы я настоятельно рекомендую
определить непротиворечивый набор правил для выбора импортируемых пространств имен и следовать им на всем протяжении разработки проекта.
Ваш eq также поселит-ся в пространЕ© именпод тем именем, кото-рое SD1 ему дадите.Ваш eq также поселит-ся в пространЕ© именпод тем именем, кото-рое SD1 ему дадите.При написании объекта-сервера .NETследуй ет задать имя пространства именв котором обитает ваш код. Это делается с помощью директивы Namespace (рис. 2-3). Часто (но не обязательно) имя пространства имен совпа-
Ваш eq также поселит-ся в пространЕ© именпод тем именем, кото-рое SD1 ему дадите.
Ваш eq также поселит-ся в пространЕ© именпод тем именем, кото-рое SD1 ему дадите.
дает с именем файла, в котором живет программа. В одном файле может быть несколько пространств имен, и, наоборот, одно пространство имен можно распространить на несколько файлов. Часто Visual Studio.NET и другие среды разработки автоматичес-
ки присваивают проекту пространство имен. Но как убедиться, что ваше пространство не будет конфликтовать с пространством имен, избранным другим поставщиком для своего компонента? С помощью сборок.
Сборки
В NET широко исполь--зуются новые единицы упаковки — сборки.В NET широко исполь--зуются новые единицы упаковки — сборки.В .NET Framework для хранения кода, ресурсов и метаданных широко используются сбор- I ки (assemblies). Весь код, исполняемый средством поддержки периода выполнения №Т,
В NET широко исполь-
-зуются новые единицы упаковки — сборки.
В NET широко исполь-
-зуются новые единицы упаковки — сборки.
должен находится в сборке. Кроме того, все функции безопасности, разрешения пространств имен и управления версиями работают для отдельной сборки. Поскольку сборки применяются часто и для самых разных нужд, мы обсудим их подробнее.
Понятие сборки
Сборка — это логический набор, состоящий из одного или нескольких ЕХЕ- или DLL 冲 аП/юв, в которых находятся код и ресурсы приложения. В сборку также входитдекларация (manifest) — метаданные, описывающие код и ресурсы, которые находятся «внутри» сборки (чуть позже я объясню, почему «внутри» взято в кавычки). Зачастую сборки состоят из единственного ЕХЕ- или DLL-фаила (рис. 2-6).
DLL, которую создал компилятор при компоновке программы- примера простого сервера времени (см. выше)? на самом деле была сборкой. Вторая однофайловая сборка — это исполняемое
Наши программы-при-меры создают две сбор-ки, каждая из которыхсостоит из: одного файла.Наши программы-при-меры создают две сбор-ки, каждая из которыхсостоит из: одного файла.Рис. 2-6. Однофайловые и многофайловые сборки.Рис. 2-6. Однофайловые и многофайловые сборки.
Наши программы-при-меры создают две сбор-ки, каждая из которыхсостоит из: одного файла.
Наши программы-при-меры создают две сбор-ки, каждая из которыхсостоит из: одного файла.
Рис. 2-6. Однофайловые и многофайловые сборки.
Рис. 2-6. Однофайловые и многофайловые сборки.
I клиентское приложение, также скомпонованное для этого примера. При использовании таких инструментов, как Visual Studio.NEL каждому проекту скорее всего будет соответствовать одна сборка.
Сборка также можетбыть логической' совокупностью нескольких файлов.Сборка также можетбыть логической' совокупностью нескольких файлов.Хотя часто сборка располагается в одном файле, она может быть и логической {в противоположность физической) совокупностью нескольких файлов из одного каталога (рис. 2-6). Декларация с указанием файлов, состав-
Сборка также можетбыть логической
' совокупностью нескольких файлов.
Сборка также можетбыть логической
' совокупностью нескольких файлов.
ляющих сборку, может располагаться в одном из ЕХЕ- или DLL- файлов сборки, содержащих код приложения. Она также может жить в отдельном ЕХЕ- или DLL-файле, который при этом не со-
держит ничего, кроме декларации. Имея дело с многофайловыми сборками, надо помнить, что файлы сборки не связаны друг с другом средствами файловой системы. Ответственность за то, чтобы все перечисленные в декларации файлы были в наличии,
1когда их станет искать загрузчик, целиком и полностью лежит на вас. Единственный признак принадлежности файла к сборке — ссылка на него в декларации. В этом случае термин сборка не
слишком удачен, так как подразумевает свинченные вместе металлические части. Возможно, термин «перечень» («roster») будет
более адекватным. Вот поэтому термин «внутри», упоминавшийся выше, я взял в кавычки. Утилита командной строки AL.exe [Assembly Generation Utility) из состава SDK позволяет добавлять/ удалять файлы из многофайловых сборок. Интеллектуальные среды разработки типа Visual Studio делают это автоматически.
:В] А©^а|^曲© сборки■ можнопросмотретьс помощью программы lLDASM.exe/:В] А©^а|^曲© сборки■ можнопросмотретьс помощью программы lLDASM.exe/Декларацию сборки позволяет просматривать дизассемблер IL (lLDASM.exe). Декларация нашего компонента time показана ниже (рис. 2-7). В ней перечислены внешние сборки, от которых зависит данная сборка. В на-
:В] А©^а|^曲© сборки
■ можнопросмотретьс помощью программы lLDASM.exe/
:В] А©^а|^曲© сборки
■ можнопросмотретьс помощью программы lLDASM.exe/
шем случае она зависит от mscodib.dll/ главной библиотеки .NET CLR, а также от сборки Microsoft. VisualBasic, содержащей внутренние функции языка Visual Basic, такие как Now. Кроме того, там перечислены имена сборок, которые мы сделаем доступными из внешнего мира, в этом случае —TimeComponent.
Рис. 2-7. Декларация сборки нашего компонента Time.Рис. 2-7. Декларация сборки нашего компонента Time.
Рис. 2-7. Декларация сборки нашего компонента Time.
Рис. 2-7. Декларация сборки нашего компонента Time.
Кроме объектов программна предоставляемых сборкой и необходимых ей, в декларации находятся сведения, описывающие саму сборку. Так, она содержит сведения о версии сборки в стандартизированном формате (о нем см. ниже). Она также может описывать «культуру» (culture), для которой написана сборка (в данном случае культура — забавное название человеческих язы-
ков и их диалектов, скажем, австралийского английского). В случае совместно используемой сборки (мы поговорим об этом подробнее чуть позже) в декларации содержится открытый ключ, позволяющий гарантированно отличить эту сборку от других независимо от имени ее файла. К декларации даже можно добавлять собственные атрибуты, которые будут игнорированы CLR. Атрибуты декларации устанавливаются с помощью вышеупомянутой Assembly Generation Utility или в Visual Studio.NET.
Сборки и развертывание
При разделении коаа по сборкам централь- 1
•Тщательно пштуч^ыйай- ным является вопрос: как будет использо- 丁已 какими будут ваши ваться код вашей сборки — только вашим сборку: закрытыми или приложением или им и другими приложени- открьгтымй.
ями, которым он необходим. Microsoft.NET *
поддерживает оба варианта, но в последнем случае придется попотеть. Вероятно, в случае кода, написанного для собственных приложений (скажем, вычислительного ядра для сложной финансовой программы) вы захотите сделать сборку закрытой. С другой стороны, объекты общего назначения, которые по логике могут использоваться несколькими приложениями (скажем, алгоритм сжатия файлов)г лучше сделать совместно используемыми.
Сборки могут SbfTb зак-рытыми и предназна-одшся:для определен-, ного приложенуя> чтопорой может 函л^гчипэвам жизнь.Сборки могут SbfTb зак-рытыми и предназна-одшся:для определен-, ного приложенуя> чтопорой может 函л^гчипэвам жизнь.Полагаю, у вас возникнет желание сделать сборки закрытыми — в NE「это проще проста- го. По правде говоря, именно так я и поступил в приведенном выше примере. Для этого нужно всего лишь скомпоновать простую сборГ ку/ как DLL и скопировать ее в каталог
Сборки могут SbfTb зак-рытыми и предназна-одшся:для определен-, ного приложенуя> чтопорой может 函л^гчипэвам жизнь.
Сборки могут SbfTb зак-рытыми и предназна-одшся:для определен-, ного приложенуя> чтопорой может 函л^гчипэвам жизнь.
или подкаталог, где находится использующая ее сборка-клиент.
Не нужно делать записей в системном реестре или Active Directory, что необходимо при использовании компонентов СОМ. При этом ни одна программа не будет изменена, если только вы сами не измените ее, так что вы никогда не столкнетесь с общеизвес-
тной ситуацией, когда при изменении версии совместно используемой DLL приложение без видимой причины выходит из строя.
Очевидной проблемой этого подхода является возрастание числа сборок (попыткой решения аналогичной проблемы стало использование DLL в Windows 1,0). Если каждому приложению, ко-
Oq*aK5 иногда ваммогут понадобитьсясовместно исполузуемые сборки.Oq*aK5 иногда ваммогут понадобитьсясовместно исполузуемые сборки.торое использует, например, текстовое поле, потребуется собственная копия содержащей его DLL, то сборки, размножаясь как бакте* рии, захламят весь компьютер. В мартовском номере журнала MSDN Magazine за 2001 год
Oq*aK5 иногда ваммогут понадобитьсясовместно исполузуемые сборки.
Oq*aK5 иногда ваммогут понадобитьсясовместно исполузуемые сборки.
Джеффри Рихтер выступил с возражениями. Он не считает это
проблемой, поскольку сегодня жесткие диски объемом больше 40 ГБ продаются по цене меньше 200 долл., и каждый может позволить себе необходимое дисковое пространство. Таким образом, большинство сборок должны быть закрытыми, потому что тогда
приложение никогда не выйдет из строя, если кто-то испортит совместно используемый код. Этот аргумент в стиле врачей скорой помощи, которые говорят, что мир был бы намного более приятным местом, если бы люди не напивались и не кололись. Хотя эти точки зрения абсолютно верны, ни одна из них не станет реальностью в ближайшее время. Идея Рихтера осуществима для разработчиков, у которых, как правило, есть быстрые компьютеры с большой памятью. Но клиент с обширным парком ПК двухлетней давности, который в данный момент невозможно модернизировать или просто заменить из-за отсутствия финансов, не будет покупать диски большего объема. Довольно скоро в процессе разработке вы ощутите необходимость совместного использования сборок несколькими приложениями, и в этом вам опять поможет .NE1 Framework.
.NET Framework допускает совместное использование сборок путем размещения их в глобальном кэше сборок (global assembly cache, GAC — звучит как ВОПАи героев мультиков). GAC — это каталог на вашем компьютере (в данный моментWwinnt'assembly), где должны жить все совместно используемые сборки. Утилита командной строки GACUTIL.exe из .NET SDK, которая хорошо работает при запуске из сценариев и пакетных файлов, поможет помещать сборки в кэш, просматривать их свойства и удалять их из кэша. Большинство пользователей предпочтут программу Assembly Cache Viewer, которая является расширением оболочки и устанавливается вместе с №】 SDK. Она автоматически подключается к Windows Explorer и позволяет просматривать GAC (рис. 2-8). При совместном использовании компьютерных файлов любого типа вы постоянно рискуете столкнуться с проблемой конфдик-
Гарантированная уни-кальность имен совмест-но используемь^х сборокдостигается с помощьюкриптографиисоткрытым ключом.Гарантированная уни-кальность имен совмест-но используемь^х сборокдостигается с помощьюкриптографиисоткрытым ключом.Рис. 2-8. Средство просмотра глобального кэша сборок.Рис. 2-8. Средство просмотра глобального кэша сборок.
Гарантированная уни-кальность имен совмест-но используемь^х сборокдостигается с помощьюкриптографиисоткрытым ключом.
Гарантированная уни-кальность имен совмест-но используемь^х сборокдостигается с помощьюкриптографиисоткрытым ключом.
Рис. 2-8. Средство просмотра глобального кэша сборок.
Рис. 2-8. Средство просмотра глобального кэша сборок.
та имен. Поскольку все совместно используемые сборки .NETдолжны быть в GAC, чтобы ими можно было управлять, нужен какои- то способ присвоения гарантированно уникальных имен всем программным файлам, живущим в САС (даже если исходно у них были одинаковые имена). Это делается с по-
мощью строгого имени (strong пате), или совместно используемого имени (shared name). С помощью криптографии по открыто-
му ключом строгое имя гарантированно уникально и отличается от имен остальных сборок в системе. В декларации совместно используемой сборки содержится открытый ключ из пары открытого и закрытого ключей. Строгое имя формируется в результате комбинирования имени файла и части этого открытого ключа.
Совместно используе-мые сборки живут в гло-бальном кэше сборок,администрированиекоторого осуществ-льется с помощьюспециальных утилит.Совместно используе-мые сборки живут в гло-бальном кэше сборок,администрированиекоторого осуществ-льется с помощьюспециальных утилит.
Совместно используе-мые сборки живут в гло-бальном кэше сборок,администрированиекоторого осуществ-льется с помощьюспециальных утилит.
Совместно используе-мые сборки живут в гло-бальном кэше сборок,администрированиекоторого осуществ-льется с помощьюспециальных утилит.
Предположим, что нам требуется написать совместно используемую сборку, которая будет жить в САС. Для этого примера я использую Visual Studio.NET, так как я нахожу, что эта среда разработки удобнее, чем инструменты командной строки. Я написал другой компонент Visual Basic.NET выполняющий те
же действия, что и простейшая программа-пример time, за исключением того, что он добавляет к строке результата символы «Shared example:», что позволяет отличить его от первого примера. После компоновки для этого компонента надо сгенерировать
и присвоить строгое имя, или, иначе говоря, подписать компо-
нент. Можно сконфигурировать Visual Studio.NET так, чтобы она выполняла это автоматически (рис. 2-9). Для этого нужен файл, содержащий пару криптоключей, который позволяет сгенерировать утилита командной строки из SDK — SN.exe. При компоновке Visual Studio.NET автоматически подписала этот компонент. После этого я вручную поместил его в GAC с помощью Windows Explorer.
■' £««аоН0паг-■' £««аоН0паг-• War 5п»• War 5п»|、h■c""♦■•■,<>т[ям>гп1 Кч*,т» “Qe・|、h■c""♦■•■,<>т[ям>гп1 Кч*,т» “Qe・FFРис. 2-9. VisualStudio.NET, генерирующая строгое имя.Рис. 2-9. VisualStudio.NET, генерирующая строгое имя.-J Сялжп ftnpeihej.5-Г ..Men»nceMhriXi E№>3*i Ргорвг tie-J Сялжп ftnpeihej.5-Г ..Men»nceMhriXi E№>3*i Ргорвг tieк: «wdi> mA « "гее ч Мт、%гн1 е:з1м> w мнк: «wdi> mA « "гее ч Мт、%гн1 е:з1м> w мн'* 4ЙЙжЗп«йвие^'* 4ЙЙжЗп«йвие^
■' £««аоН0паг-
■' £««аоН0паг-
• War 5п»
• War 5п»
|、h■c""♦■•■,<>т[ям>гп1 Кч*,т» “Qe・
|、h■c""♦■•■,<>т[ям>гп1 Кч*,т» “Qe・
F
F
Рис. 2-9. VisualStudio.NET, генерирующая строгое имя.
Рис. 2-9. VisualStudio.NET, генерирующая строгое имя.
-J Сялжп ftnpeihej
.
5-Г ..
Men»nceMh
r
iXi E№>3*i Ргорвг tie
-J Сялжп ftnpeihej
.
5-Г ..
Men»nceMh
r
iXi E№>3*i Ргорвг tie
к: «wdi> mA « "гее ч Мт、%гн1 е:з1м> w мн
к: «wdi> mA « "гее ч Мт、%гн1 е:з1м> w мн
'* 4ЙЙжЗп«йвие^
'* 4ЙЙжЗп«йвие^
Здесь даются二 инструкции для генерации совместно |цспользуемай сборки.Здесь даются二 инструкции для генерации совместно |цспользуемай сборки.Кроме того, я написал клиент (на этот раз с помощью Visual Studio.NET на Visual Basic), применяющий совместно используемую сборку. Я дал указание Visual Studio.NET генерировать ссылку на DLL сервера, щелкнув пра
Здесь даются
二 инструкции для генерации совместно |цспользуемай сборки.
Здесь даются
二 инструкции для генерации совместно |цспользуемай сборки.
вой кнопкой папку References в окне Solution Explorer (рис. 2-10), потом выбрал Add Reference, щелкнул кнопку Browse и нашел файл совместно используемой сборки, расположенный в стандартном каталоге.
В настоящее время Visual Studio не может добавлять ссылки на । сборки в GAC, но эту функцию обещали включить в следующий выпуск. Дело в том, что ко времени разработки механизма ссылок Visual Studio конструкция GAC еще не устоялась. Поэтому если разработчики не создают клиент и сервер вместе как части одного проекта, приходится устанавливать по две копии компо-
нентов: одну в стандартный каталог длл компиляции, а другую — в САС для работы клиента. Пользователям понадобится лишь копия в САС, Visual Studio.NEl генерирует класс-ссылку, который обращается к этому пространству имен. Далее мне понадобится установить свойство CopyLoca! как False, сообщив таким образом Visual Studio.NET, что локальная копия не нужна, При запуске клиента загрузчик ищет локальную копию и, если ее нет, проверяет GAC.
Acid ReferenceAcid Reference:| CrystalDecISions.Cr/^alRepo.,.• CrjStaDacfeions. Re|.crtSourc e |Cr /italDedsions. Shared;#Cry$tdCeciwn< Web. :ГrystalDedsicrs.Windows. Fo..:::CrystalEn:erprl5ewib; Crysr^nnfnStcre^.t'::Crys^lKeyCode^lb:Cryst alP'x^irf'igr'.ib. Cj$tomMar$hafets 戶「WdSelected Cc^ORet^s::| CrystalDecISions.Cr/^alRepo.,.• CrjStaDacfeions. Re|.crtSourc e |Cr /italDedsions. Shared;#Cry$tdCeciwn< Web. :ГrystalDedsicrs.Windows. Fo..:::CrystalEn:erprl5ewib; Crysr^nnfnStcre^.t'::Crys^lKeyCode^lb:Cryst alP'x^irf'igr'.ib. Cj$tomMar$hafets 戶「WdSelected Cc^ORet^s:;|-;|-I 5。©I 5。©20OU 914cl … 200。.9】4口… 2000.91 ад.., 2000,9140... 2000.9140..,1,0.0.01.0,0.01.0.0.0L&Q.O 1.0.2615Q 7,П.П,П20OU 914cl … 200。.9】4口… 2000.91 ад.., 2000,9140... 2000.9140..,1,0.0.01.0,0.01.0.0.0L&Q.O 1.0.2615Q 7,П.П,П'''':沪吋加FMM二・二:^Program Fites\Comrncn FH. . C:program Files^Commcn Fil… C:\Program FilesVIummon Fil.. C:\Program FiesV"onimon Fil.,. ■:\ProgramFiHes\CDmmonFiL,, C:\Pro^am FHes\Commor> 用… C ^Program F|tes\Cormion Fil,.. C:\Prooram Files\Comman HI... C\WlNNT5VkMicro$oft. rO\F.,, - !WrNNTSV\Mlrrnsn^ MFTlF:沪吋加FMM二・二:^Program Fites\Comrncn FH. . C:program Files^Commcn Fil… C:\Program FilesVIummon Fil.. C:\Program FiesV"onimon Fil.,. ■:\ProgramFiHes\CDmmonFiL,, C:\Pro^am FHes\Commor> 用… C ^Program F|tes\Cormion Fil,.. C:\Prooram Files\Comman HI... C\WlNNT5VkMicro$oft. rO\F.,, - !WrNNTSV\Mlrrnsn^ MFTlF''TypeType--1 EM喉故1 EM喉故11CiWbbq^Code^dwter 旣£ …CiWbbq^Code^dwter 旣£ …Remove JRemove JC«k»i IC«k»i I
Acid Reference
Acid Reference
:| CrystalDecISions.Cr/^alRepo.,.
• CrjStaDacfeions. Re|.crtSourc e |Cr /italDedsions. Shared
;#Cry$tdCeciwn< Web
. :ГrystalDedsicrs.Windows. Fo..
:::CrystalEn:erprl5ewib
; Crysr^nnfnStcre^.t'
::Crys^lKeyCode^lb
:Cryst alP'x^irf'igr'.ib
. Cj$tomMar$hafets 戶「Wd
Selected Cc^ORet^s:
:| CrystalDecISions.Cr/^alRepo.,.
• CrjStaDacfeions. Re|.crtSourc e |Cr /italDedsions. Shared
;#Cry$tdCeciwn< Web
. :ГrystalDedsicrs.Windows. Fo..
:::CrystalEn:erprl5ewib
; Crysr^nnfnStcre^.t'
::Crys^lKeyCode^lb
:Cryst alP'x^irf'igr'.ib
. Cj$tomMar$hafets 戶「Wd
Selected Cc^ORet^s:
;|-
;|-
I 5。©
I 5。©
20OU 914cl … 200。.9】4口… 2000.91 ад.., 2000,9140... 2000.9140..,
1,0.0.0
1.0,0.0
1.0.0.0
L&Q.O 1.0.2615Q 7,П.П,П
20OU 914cl … 200。.9】4口… 2000.91 ад.., 2000,9140... 2000.9140..,
1,0.0.0
1.0,0.0
1.0.0.0
L&Q.O 1.0.2615Q 7,П.П,П
''
''
:沪吋加FMM二
・二:^Program Fites\Comrncn FH. . C:program Files^Commcn Fil… C:\Program FilesVIummon Fil.. C:\Program FiesV"onimon Fil.,. ■:\ProgramFiHes\CDmmonFiL,, C:\Pro^am FHes\Commor> 用… C ^Program F|tes\Cormion Fil,.. C:\Prooram Files\Comman HI... C\WlNNT5VkMicro$oft. rO\F.,, - !WrNNTSV\Mlrrnsn^ MFTlF
:沪吋加FMM二
・二:^Program Fites\Comrncn FH. . C:program Files^Commcn Fil… C:\Program FilesVIummon Fil.. C:\Program FiesV"onimon Fil.,. ■:\ProgramFiHes\CDmmonFiL,, C:\Pro^am FHes\Commor> 用… C ^Program F|tes\Cormion Fil,.. C:\Prooram Files\Comman HI... C\WlNNT5VkMicro$oft. rO\F.,, - !WrNNTSV\Mlrrnsn^ MFTlF
'
'
Type
Type
-
-
1 EM喉故
1 EM喉故
1
1
CiWbbq^Code^dwter 旣£ …
CiWbbq^Code^dwter 旣£ …
Remove J
Remove J
C«k»i I
C«k»i I
Рис. 2-10. Добавление ссылки на разделяемый компонент.
В •>том абзаце даютсяинструкции 9^ написа-ния клиента, использую-щего объекты из САС.В •>том абзаце даютсяинструкции 9^ написа-ния клиента, использую-щего объекты из САС.Дополнительным преимуществом подписи совместно используемых сборок с помощью открытого ключа является возможность проверки целостности файла сборки. Генератор сборок выполняет хэширование содержимо-
В •>том абзаце даютсяинструкции 9^ написа-ния клиента, использую-щего объекты из САС.
В •>том абзаце даютсяинструкции 9^ написа-ния клиента, использую-щего объекты из САС.
го файлов, указанных в декларации. После этого он шифрует этот хэш вашим закрытым ключом и сохраняет зашифрованные результаты в декларации. Выбирая сборку из САС, загрузчик хэши-
рует ее файл(ы) по тому же алгоритму, открытым ключом расшифровывает хэш из декларации и сравнивает полученные результаты. Если они совпадают, загрузчик знает, что целостность
• Криптографический• Криптографическийалгоритм также叩едо ставдяет возможность проверки целостностифайлов сборки,алгоритм также叩едо ставдяет возможность проверки целостностифайлов сборки,файлов сборки не нарушена. Это не позво-
• Криптографический
• Криптографический
алгоритм также叩едо ставдяет возможность проверки целостности
файлов сборки,
алгоритм также叩едо ставдяет возможность проверки целостности
файлов сборки,
ляе1 идентифицировать владельца сборки, так как нельзя точно установить настоящего владельца открытого ключа, но дает твердую гарантию сохранности целостности сборки с момента ее подписи.
Сборки и управление версиями
Управление версиямипрограмм—врамн^*мучительная и вовсеме привлекательнаяпроблема.Управление версиямипрограмм—врамн^*мучительная и вовсеме привлекательнаяпроблема.Работа с обновлениями опубликованных программ исторически представляет собой громадную проблему, которую часто называют «адом DLL». Замена DLL, которую использует существующий клиент, на более новую версию ударит вас дважды. Во-первых, но-
Управление версиямипрограмм—врамн^*мучительная и вовсеме привлекательнаяпроблема.
Управление версиямипрограмм—врамн^*мучительная и вовсеме привлекательнаяпроблема.
вый код иногда выводит из строя имеющиеся приложения, за-
висимые от оригинальной версии. Как бы вы ни пытались сохранить обратную совместимость нового кода со старым, узнать или проверить, что было с этим кодом после обновления, невозможно. Это особенно раздражает, когда после установки новой DLL старый клиент (уже не работающий после этого) не запускают целый месяц, а когда это наконец происходит, очень трудно сказать, что стало причиной его выхода из строя. Во-вторых, все обновления теряются, когда при установке приложение копирует старые DLL поверх новых, уже установленных на компьюте- Iре. При этом нарушается работа имеющегося клиента, зависимого от новых DLL. В 90% случаев на вопрос сценария установки: «Существует целевой файл XXX, более новыи? чем копируемый. Все равно копировать?» — пользователь отвечает «Да». Это особенно сводит с ума, когда причиной проблемы является совсем другое приложение, но в результате отказывается работать именно ваша программа, в результате ваша линия технической
поддержки принимает дорогостоящие звонки и угрозы терактов, I и остается лишь надеяться, что почтовая служба не купила ни одной копии программы. Проблемы с версиями обходятся чудовищно дорого и ведут к потерям производительности и замедлению отладки. Кроме того, эти проблемы заставляют людей воздерживаться от приобретения обновлений или даже от попыток их установки, поскольку они боятся, что после этого что-то обязательно перестанет работать, и часто они оказываются правы.
включена функциональ-ность для управленияверсиями.включена функциональ-ность для управленияверсиями.До cux пор Windows игнорировала проблему, связанную с управлением версиями, что вынуждало разработчиков самим решать эту проблему поэтапно. До NETу разработчиков не было стандартизированного способа за
включена функциональ-ность для управленияверсиями.
включена функциональ-ность для управленияверсиями.
дать нужную линию поведения при управлении версиями, которую реализовывала бы ОС. Похоже, Microsoft осознала, что эту общую проблему можно решить лишь на уровне ОС, и предоставила в №1 систему управления версиями программ.
В декларации каждой сборки есть сведения о ее версии. Они включают номер версии для совместимости — набор из четырех чисел, позволяющий загрузчику CLR реализовать запрошенные клиентом действия по управлению версиями. Номер версии для совместимости состоит из старшего номера версии, младшего номера версии, номеров компоновки и ревизии. Инструменты разработки, которые создают сборку, помещают сведения о версии в декларацию. В Visual Studio.NEl они хранятся в атрибутах, которые можно установить в файле проектаAssemblylnfo.vb (рис. 2-11), Чтобы задать номер версии инструментами командной строки, последним нужны сложные переключатели. Взгляните на номер версии, который вы водит дизассемблер IL (рис. 2-12 внизу). Его также можно увидеть при установке сборки в GAC (рис. 2-8).
' Сведения о версии сборки состоят из следующих ' четырех значений:
Старшая версия 'Младшая версия ' Ревизия
' Номер компоновки
' Можно задать все значения или оставить номера компоновки и ревизии по умолчанию с помощью как показано ниже:
<Assembly: AssemblyVersion („2. 0. *") >
Рис. 2-11. Файл Assembly Info.vb, который показывает версию сборки компонентов.
1111aseembty Shar««iTlmPC ams—VBf 1 Q 447:20941aseembty Shar««iTlmPC ams—VBf 1 Q 447:20941Рис. 2-12. ILDASM выводит версию компонента-сервера.Рис. 2-12. ILDASM выводит версию компонента-сервера.В каждой сборке естьинформация^ -котораяпозволяет исполняющейсреде узнавать номерверсии сборки.В каждой сборке естьинформация^ -котораяпозволяет исполняющейсреде узнавать номерверсии сборки.Каждая сборка+клиеитсодержит сведенияо версиях сборок, откоторых она зааисит.Каждая сборка+клиеитсодержит сведенияо версиях сборок, откоторых она зааисит.Рис. 2-13. ILDASM выводит версию, нужную клиенту.Рис. 2-13. ILDASM выводит версию, нужную клиенту.
11
11
aseembty Shar««iTlmPC ams—
VBf 1 Q 447:20941
aseembty Shar««iTlmPC ams—
VBf 1 Q 447:20941
Рис. 2-12. ILDASM выводит версию компонента-сервера.
Рис. 2-12. ILDASM выводит версию компонента-сервера.
В каждой сборке естьинформация^ -котораяпозволяет исполняющейсреде узнавать номерверсии сборки.
В каждой сборке естьинформация^ -котораяпозволяет исполняющейсреде узнавать номерверсии сборки.
Каждая сборка+клиеитсодержит сведенияо версиях сборок, откоторых она зааисит.
Каждая сборка+клиеитсодержит сведенияо версиях сборок, откоторых она зааисит.
Рис. 2-13. ILDASM выводит версию, нужную клиенту.
Рис. 2-13. ILDASM выводит версию, нужную клиенту.
£CI booft'Xrxfe-\rt»aptc» 2,.Wi—
s- ■ C.'*NETbooWCodB\C-Viap1er2\Sh3red'(8hciT0dTirrieCDmpon6nftbii - > MANIFEST
в -V SharedTimeComponenl
a 餐 Classi
""} class public auto ansi ・ ctor voidQ
Декларация также содержит информационную версию (informational version) — строку, доступную для чтения человеком, например «Microsoft. NET Beta 1 Sept 2000». Информационная версия предназначена для просмотра людьми и игнорируется CLR.
При компоновке клиентской сборки вы видели, что в ней указаны имена внешних сборок, от которых она зависит. В ней указан и номер версии внешней сборки сервера (рис. 2-13).
При запуске клиента CLR ищет сборку с нужным клиенту номером версии. Действия при управлении версиями, заданные по умолчанию, требуют точного совпадения версии загружаемой
По умолчанию клиентутребуется тонн ьи номерверсии сервера; дляработы с которой онсоздан,По умолчанию клиентутребуется тонн ьи номерверсии сервера; дляработы с которой онсоздан,сборки и версии, для работы с которой созаа- залась сборка-клиент, иначе загрузка окончится неудачей. Поскольку в GAC могут быть различные версии одной и той же сборки (рис. 2-8), вы не столкнетесь с проблемой,
По умолчанию клиентутребуется тонн ьи номерверсии сервера; дляработы с которой он
создан,
По умолчанию клиентутребуется тонн ьи номерверсии сервера; дляработы с которой он
создан,
когда установка новой версии нарушает ра-
по ошибке запи-по ошибке запи-боту старых клиентов или вместо новой версии
по ошибке запи-
по ошибке запи-
сывается старая. Можно держать в САС все нужные версии, при этом каждая сборка-клиент при запросе получит ту сборку, для работы с которой она создавалась и тестировалась.
С помощью файлаконфигурации можноизменить действиясистемы, заданныепо умолчанию.С помощью файлаконфигурации можноизменить действиясистемы, заданныепо умолчанию.сервера. Вместосервера. ВместоТакой noqxoq к управлению версиями может вас не устроить. Возможно, будет обнаружен фатальный побочный эффект, например, «дыра» в защите исходной версии сервера, ' что потребует ее немедленного обновления. Или в новом сервере обнаружится ошибка, и придется «откатить» клиенты к старой версии
С помощью файлаконфигурации можноизменить действиясистемы, заданныепо умолчанию.
С помощью файлаконфигурации можноизменить действиясистемы, заданныепо умолчанию.
сервера. Вместо
сервера. Вместо
того чтобы перекомпилировать все клиенты для работы с новой версией, что пришлось бы делать в случае классической DLL, можно изменить действия системы по умолчанию, используя файл конфигурации (рис. 2-14). Имя файла конфигурации соответствует ПОЛНОМУ имени конфигурируемого им приложения (включая его расширение), но отличается от него дополнительным расти рением «. config» в конце. В качестве примера приводится содержимое файла SharedTimeClient.exe.config В случае каждой сборки можно задать новую версию, предназначенную для замены старой.
<configuration>
<runtime>
<asseffiblyBindlr)g
xmlns="urn:schemas-microsoft-corn:asm.vl">
<dependentAssembly>
Ossemblyldentity name=,'SharedTimeComponent" publiKeyToken="496ed8bdld362et)2 7>
<bindingRedirect o1dVersion="1.0.451.11958" newVersion-'^.0.451.19800"/>
</(JependentAssenbly>
</assemblyBinding>
</runtime>
</configuration>
Рис. 2-14. Файл настройки управления версиями.
3— f 76c
Особенности объектно-ориентированного программирования
Организовать внутрен-нюю функциональностьсложных проектов ПОнепросто.областью. НиктоОрганизовать внутрен-нюю функциональностьсложных проектов ПОнепросто.областью. НиктоКогда сложность проекта ПО достигав! оп- pegеденного уровня, на организацию исходного текста и запоминание внутреннего устройства каждой функции приходится тратить больше усилий, чем на работу с прикладной не сможет запомнить все действия, которые
Организовать внутрен-нюю функциональностьсложных проектов ПОнепросто.
областью. Никто
Организовать внутрен-нюю функциональностьсложных проектов ПОнепросто.
областью. Никто
выполняют функции и как они взаи модем ству ют друг с другом. В результате начинается хаос. Для проектов, в которых задейство-
вано не более пяти программистов, это ограничение не столь
серьезно. Но для больших программ с богатым набором функциональности, например Microsoft Word, требуется лучший способ организации кода, чем использование глобальных функций для каждой мелочи. В противном случае будет затрачено больше усилий на то, чтобы пробиться сквозь дебри «макаронных» программ, чем на организацию обработки текстов,
Единственный способдостичь успеха в разработке проектов ПОс участием множествапрограммистов -разделение их на классы- обьектов.Единственный способдостичь успеха в разработке проектов ПОс участием множествапрограммистов -разделение их на классы- обьектов.Для решения этой проблемы были разработаны методы ООП, благодаря чему появилась возможность создавать программы побольше и посложнее. Трудно выяснить, что имеется в виду при употреблении термина «объектно-ориентированный». Его значение сильно зависит от контекста и особенностей
Единственный способдостичь успеха в разработке проектов ПОс участием множествапрограммистов -разделение их на классы- обьектов.
Единственный способдостичь успеха в разработке проектов ПОс участием множествапрограммистов -разделение их на классы- обьектов.
аудитории — в этом плане он похож на слово «любовь». Однажды я с удивлением наблюдал за тем, как два уважаемых автора полчаса яростно полемизировали, заслуживает ли некоторая методика программирования определения «объектно-ориентированная» или только «основанная на объектах». Но (как и в случае слова «любовь») есть некий компромисс: большинство разработчиков согласны, что объектно-ориентированное ПО — это хорошо, даже если в силу различных причин им не совсем ясно, почему и для кого. Большинство согласно с там, что слово «любовь» означает по крайней мере то, что предмет вам очень нравится. Аналогично большинство программистов согласится, что ООП под- Iразумевает как минимум разбиение программ на классы, в которых логически связанные наборы данных объединяются с функ-
циями, которые их обрабатывают. Объект — это отдельный экземпляр класса. Кошка — это класс, моя кошка Симба — экземпляр класса или объект. Если вы сделаете благое дело, осмысленно разделив функциональность программы на классы, вашим разработчикам не придется разбираться в функциональности всей программы. Они смогут сосредоточиться на конкретном классе/ классах из порученного им подмножества программы, которые будут испытывать минимальное (будем надеяться) влияние других классов.
Все языки .NET поддерживают такие метоцикиООП как наследованиеи конструкторы.Все языки .NET поддерживают такие метоцикиООП как наследованиеи конструкторы.Предоставить программисту' объектно-ориентированную функциональность ^^^^^^ исторически эту задачу решал язык программирования, и разные языки решали ее в разной степени. Например, COBOL ее вовсе не ре-
Все языки .NET поддерживают такие метоцикиООП как наследованиеи конструкторы.
Все языки .NET поддерживают такие метоцикиООП как наследованиеи конструкторы.
шает. Visual Basic поддерживает минимальный набор объектно-
ориентированной функциональности, в основном это классы и ничего более. C + + и Java обладают более продвинутой поддержкой функций ООП. Языки, нуждающиеся в бесшовном взаимодействии, должны поддерживать ООП в равной степени. Таким образом, Microsoft и разработчики оказались перед выбором: сделать Visual Basic (и другие языки, не поддерживающие ООП)
умнее или C + + (и другие языки с поддержкой ООП) — глупее. Архитекторы №1 принадлежат к школе, девиз которой: в современной индустрии ПО без ООП ничего полезного сделать нельзя. Поэтому они решили, что функции ООП должны стать неотьем- лемой частью окружения CLR и, таким образом, 6bJTI доступными всем языкам. Самые полезные из методик ООП, которые поддерживает CLR, — наследование и конструкторы. В следующих разделах я расскажу о каждой из них.
Наследование
Практически в каждойотрасли современнойэкономики производився добавление стои-мости к имеющимсякомпонентам.Практически в каждойотрасли современнойэкономики производився добавление стои-мости к имеющимсякомпонентам.В современной промышленности практически ни один производитель (кроме стеклоду- BOB) не производит продукцию из «чистых» природ нь?х элементов — земли, воздуха, огня и воды. Почти все они используют уже созданные кем-то ранее компоненты, увеличивая их стоимость в процессе производства.
Практически в каждойотрасли современнойэкономики производився добавление стои-мости к имеющимсякомпонентам.
Практически в каждойотрасли современнойэкономики производився добавление стои-мости к имеющимсякомпонентам.
Так, компания, продающая дома на колесах, не производит моторов и шасси — вместо этого она покупает небольшие грузовики у автомобильной компании и устанавливает на них специализированные кузова. Автомобильная компания в свою очередь купила ветровые стекла у производителя стекла, который приобрел песок для негоу владельца карьера. Желательно, чтобы процесс разработки ПО соответствовал этой модели и начинался с готовой универсальной функциональности, к которой добавляются наши специализированные компоненты.
М< - : oquK.i ООП noq названием «наслеаова-
ООП реализует эту
концепцию в ПО сние» намного облегчает написание ооьектов
помощью наследования. программ. Допустим, кто-то где-то на поддерживающем наследование языке написал класс объектов Класс. Этот класс поддерживает полезную универсальную функциональность, скажем, чтение байтов из потока и запись их в поток. Нам хотелось бы создать свой класс, который не только осуществляет чтение и запись, как базовый класс, но и предоставляет некоторую статистику (например, длину последовательности байтов), взяв за основу функциональность базового класса и добавив несколько наворотов. Для этого нужно написать фрагмент программы, называемый производным классом, в котором функциональность базового класса некоторым образом модифицирована: часть кода добавлена, другая — изменена, а часть оставлена как есть. Для этого с помощью синтаксиса языка компилятору дается указание, что наш производный класс наследует функциональность базового класса. В результате с помощью соответствующей ссылки компилятор автоматически включит в производный класс функциональность базового класса. Это можно представить в виде операции вырезания/ вставки, при которой не происходит на самом деле никаких перемещений. Говорят, что производный класс наследует от базового класса, происходит от него илирасширяет его (рис. 2-15— некоторые промежуточные классы опущены для ясности).
Всеобъекты. NETявлпю гея произзод иььмиот системного базовогокласса System,Object.Всеобъекты. NETявлпю гея произзод иььмиот системного базовогокласса System,Object.Все виды функциональности NET Framework, oi простого преобразованиястрок до самых сложных Web-служб, предоставлены с помощью наследования. Давайте, как всегда, нач-
Всеобъекты. NET
явлпю гея произзод иььмиот системного базовогокласса System,Object.
Всеобъекты. NET
явлпю гея произзод иььмиот системного базовогокласса System,Object.
нем изучение наследования с самого проста-
го примера. Хорошая иллюстрация наследования в •NET — компонент time, созданный в предыдущей главе. Несмотря на отсутствие соответствующего кода, который указывал бы это в явном виде, класс нашего компонента time происходит от базового клас- ca System,Object, предоставленного Microsoft. Убедиться, что это так, можно, изучив компонент с помощью ILDASM (рис. 2-16) Все без исключения объекты в системе .NE〕 происходят от System. Objectили производного от него класса. Если не указан иной базовый класс, подразумевается System.Object. При желании можно указать другой базовый класс ключевым словом Inherits (на Visual Basic, рис. 2-17) или оператором «:» (на C#).
Рис. 2-15. Наследование в ООП.
Рис. 2-16. Демонстрация наследования отSystem.Object с помощью ILDA5M.
В более сложных случаях можно вывести дерево наследования, используя Object Browser из Visual Studio. NEl (рис. 2-18). Этотже случай слишком прост, чтобы обращаться к Object Browser.
Значительная часть egтемной функциональ-ности в .NET предостав-ляется с помощьюнаследования. ,.Значительная часть egтемной функциональ-ности в .NET предостав-ляется с помощьюнаследования. ,.Namespace VS7DemoTimeService
Значительная часть egтемной функциональ-ности в .NET предостав-ляется с помощьюнаследования. ,.
Значительная часть egтемной функциональ-ности в .NET предостав-ляется с помощьюнаследования. ,.
Public Class WebServicelInherits System.Web.Services.WebService
♦. ТЙ»кИ*н>1 Xa.・.》u<»l!♦. ТЙ»кИ*н>1 Xa.・.》u<»l!•*№'•*№':"" Ze",j .MM,*^>— 6 ・•;::"" Ze",j .MM,*^>— 6 ・•;:■Л Л»ЖМКГП,5bM■Л Л»ЖМКГП,5bM• IT. :■T:Mh—,d-d 5яг— Л-G ・—,'"—2wd~ G —в * • Л■- a ”" мт• IT. :■T:Mh—,d-d 5яг— Л-G ・—,'"—2wd~ G —в * • Л■- a ”" мтCj—1*=^Cj—1*=^II tooBCrtu勺K—-,*J,mm*M1 HwMteГ Uip<art 4Й bweseF IrttefftaceS二弋 Cwtenwijintio1- 弋 StomNvC xitrII tooBCrtu勺K—-,*J,mm*M1 HwMteГ Uip<art 4Й bweseF IrttefftaceS二弋 Cwtenwijintio1- 弋 StomNvC xitr<z<*—Af Хйм^ытГЪ f\• Нм** <ф4«с Лж*,工}K><z<*—Af Хйм^ытГЪ f\• Нм** <ф4«с Лж*,工}K>-,「,》■*“,■“ :УрчТ^ЬК*. : •"-,「,》■*“,■“ :УрчТ^ЬК*. : •"Рис. 2-17. Явное объявление наследования.
♦. ТЙ»кИ*н>1 Xa.・.》u<»l!
♦. ТЙ»кИ*н>1 Xa.・.》u<»l!
•*№'
•*№'
:"" Ze",
j .MM,*^>— 6 ・•;:
:"" Ze",
j .MM,*^>— 6 ・•;:
■Л Л»ЖМКГП,5bM
■Л Л»ЖМКГП,5bM
• IT. :■T:Mh—,d
-d 5яг— Л
-G ・—,'"—2wd
~ G —в * • Л
■- a ”" мт
• IT. :■T:Mh—,d
-d 5яг— Л
-G ・—,'"—2wd
~ G —в * • Л
■- a ”" мт
Cj—1*=^
Cj—1*=^
II tooBCrtu
勺K—
-,*J,mm*M1 HwMte
Г Uip<art 4
Й bweseF IrttefftaceS
二弋 Cwtenwijintio1
- 弋 StomNvC xitr
II tooBCrtu
勺K—
-,*J,mm*M1 HwMte
Г Uip<art 4
Й bweseF IrttefftaceS
二弋 Cwtenwijintio1
- 弋 StomNvC xitr
<z<*—A
f Хйм^ытГЪ f\
• Нм** <ф4«с Лж*,工}K>
<z<*—A
f Хйм^ытГЪ f\
• Нм** <ф4«с Лж*,工}K>
-,「,》■*“,■
“ :УрчТ^ЬК*. : •"
-,「,》■*“,■
“ :УрчТ^ЬК*. : •"
"i* \u "—“"■ —tri.a>p*.;|e£» ― fintV): Db>atf
XTs M g”n
**wn«*Vf
SLT.Si «;*” "■• MT P ・ ~“S *<itav< « /*4!|>-4*.«лк4м« «ihlk'. aJvl«4r* Г>мАПе к>>И<:йя t,4itrawt'1 rf -|«*4 »■ »<T W*t*r.s«>: г <Ф»ИНД jt 'H»b4» •#■*•••>»
•、&I& л м а) и, imbdiKBs and. fw .-, 11 dlobicKX#fitl'«4-jotjjti :心.田M”,-• z J 巾,“и*,《!『*?,% J ",ч)т,轟15|珞.
hdunrw^6sd,tj^<^4SSu»&«&kes ДйЬепк!ЁЙЗ<ад" OttpW iA^IEiiJb®tM*';二卍"■: 1「 J-:e,
,,i,.tii»^i,'Ssi6cE 6(烟成HCzte - ЗД№ S 9w uieer i
IРис. 2-18. Object Browser из VisualStudio, NET показывает
дерево наследования.
Хорошо, пусть наш компонент time получил свою функциональность з наследство от Sy stem.Object, но как узнать, что же было з завещании? Это придется выяснять с помощью несколько старомодной технологии RTFM (Read The Funny Manual — почти буквально: «прочитайтеэто веселое руководство!») В результате мы найдем, что у нашего базового класса несколько открытых методов (табл. 2Т}. Это значит, что наш производный класс (ком- I понент time) знает, как выполнять эти действия, даже если мы сами их не запрограммировали.
Табл. 2-1.
Откры тые метод ь/ System.Object
Имя метода
Назначение
Equals
GetHashCode
Определяет, является ли этот обьекп тем же экземпляром, что и заданный обьект.
Быстро генерирует и возвращает целочисленное значение, с помощью которого можно идентифицировать этот объект в хэш-таблице или в другой схеме индексации.
GetTypeВозвращает системные метаданные этого объекта.
ToStringВозвращает строку, представляющую собственно
обьект.
Метод Equals определяет действительно ли две ссылки указывают на один и тот физический экземпляр объекта. Это было на удивление трудно выяснить в СОМ, и некорректно реализованный сервер мог легко нарушить это. Но в NETобъекты наследуют такую функциональность от базового класса «бесплатно». Я написал клиентское приложение, которое создает несколько экземпляров компонента time и, среди прочего, демонстрирует работу метода Equals (рис. 2-19).
Оепкгк&Ыюп d S."4m Dtqtc* Ециак
Zarr^t
lnU«snce1 I七 al
Compete 1
II s2
Oeate IConwaie 2 I
tmtance 2 I加 bell
Demonsliatfcin d SyitemObjedl.ToSbing
CallTcS^irig оn I obpci ihai J 03!С域 It I
Рис. 2-19. Клиентская программа, демонстрирующая функции Sy stem.Object, унаследованныекомпонентом time.
Подобно реальному наследнику, иногда вашему компоненту не нужно все, что он может унаследовать от базового класса. Возможно, вам нравится антикварный столик, который оставила вам
Изчастьфункциональностибазооого класса можно,Изчастьфункциональностибазооого класса можно,подменив его методыподменив его методытетушка Софи, но этого не скажешь про ее страдающего газами бульдога (или наоборот). Наследование в программах в общем случае
Изчасть
функциональностибазооого класса можно,
Изчасть
функциональностибазооого класса можно,
подменив его методы
подменив его методы
позволяет производному классу подменять методы, унаследованные от базового класса,
т. е, заменять их другими. Хороший пример — метод System.Object. ToString, который дает указание объекту вернуть строку программисту, занятому отладкой приложения. Реализация, унаследованная от System. Object, просто возвращает имя производного класса, что не очень информативно, Чтобы облегчить отладку
компонента, этот метод должен возвращать более подробную информацию. Так, обьект, представляющий открытый файл, может вернуть имя этого файла. Это делается подменой метода базового класса (рис. 2-20). В производный класс будет помещен метод с тем же именем и параметрами, что и у базового. Но дм него будет указано ключевое слово Overrides (в случае C# - override), которое заставляет компилятор заменить реализацию из базового класса на новую реализацию из производного класса,
Этот метод подменяет метод ToString универсального базового класса System.Object.
Public Overrides Function ToString( ) As String
'Вызвать метод базового класса ToString и
' попучить результат. Если не хотите, можете этого ' не делать. Я сделал это для наглядности.
Dim BaseResult as String BaseResult = MyBase . ToString
Построить строку результата из строки базового класса и добавленной мной информации. В итоге получается, что я частично использую базовый класс, а не заменяю его полностью.
Return "You have reached the overriding class. "+ "The base class says:" + BaseResult
End Function
Рис. 2-20. Подмена метолов базового класса.
П еняющий методможет обращаться кподменяемому имметоду базового класса.П еняющий методможет обращаться кподменяемому имметоду базового класса.Если производный класс хочет предоставить собственную функциональность в дополнение к функциональности базового класса, а не заменить ее, он может вызывать подменяемый метод базового класса в явном виде.
П еняющий методможет обращаться кподменяемому имметоду базового класса.
П еняющий методможет обращаться кподменяемому имметоду базового класса.
На Visual Basic базовый класс доступен через именованный объект MyBase (на C# это объект base). Компонент-пример вызывает базовый класс чтобы получить от него строку, а затем добавляет к строке базового класса собственную строку. В результате компонент использует функциональность базового класса вместе с производным классом, а не замещает ее полностью, Не все методы базового класса можно подменить. Чтобы разрешить подмену методов базового класса, нужно писать их с указанием ключевого слова Overridable на VB или virtual (на C#).
В .NET наследованиеработает перекрестномежду различнымиязыками.(скажем, на С#).В .NET наследованиеработает перекрестномежду различнымиязыками.(скажем, на С#).Большое значение придается способности .NET поддерживать перекрестное межьязы- ковое наследование. Иначе говоря, класс, написанный на одном языке (скажем, на Visual Basic) может быть производным базового класса, написанного на другом языке
В .NET наследованиеработает перекрестномежду различнымиязыками.
(скажем, на С#).
В .NET наследованиеработает перекрестномежду различнымиязыками.
(скажем, на С#).
В СОМ такая возможность не поддерживалась из-за слишком
больших различий в реализации языков, Однако, стандартизированная архитектура CLR на основе IL позволяет приложениям №1 использовать эту функцию. По правде говоря, компонент- пример time это и делает, причем без всяких усилий с моей стороны. Уверяю вас: класс System .Object написан на одном языке без привлечения других, но, несмотря на это, от него наследуют 1все без исключения объекты NET, невзирая на язык, на котором
они написаны.
Конструкторы объекта
Объектам необходим。стандартное место дмразмещения инициали-зирующего кодаОбъектам необходим。стандартное место дмразмещения инициали-зирующего кодаКак пели Good Rats много лет назад, «все мы как-то родились». Подобно тому, как рождение человеческих существ сопровождается различными ритуалами (религиозными обрядами, выпивкой в складчину), объектам тре-
Объектам необходим。стандартное место дмразмещения инициали-зирующего кода
Объектам необходим。стандартное место дмразмещения инициали-зирующего кода
буется место для размещения ритуального кода для рождения.
В ООП давно известен конструктор класса —— функция, вызыва-
емая при создании объекта. (В ООП также используется понятие деструктора класса ^н^^м— эта функция вызывается при уничтожении объекта. В NET на смену деструкторам пришел системный сборщик мусора, описанный ниже.) В различных языках конструкторы реализованы no-разному: на С + Ч с помощью имени класса, на Visual Basic — с помощью события Class Jnitialize. Как и в случае многочисленных функций, которые широко варьируют в различных языках, для корректной совместной работы нужно стандартизировать ритуалы создания объектов в программах на
различных языках.
В .МЕТдля этого служитконструкторВ .МЕТдля этого служитконструкторВ .NET из Visual Basic исчезло событие Class initialize теперь его модель во многом похожа на модель C + + , так как для поддержки
В .МЕТдля этого служитконструктор
В .МЕТдля этого служитконструктор
наследования требуются параметризованные конструкторы. V каждого класса NET может быть один или больше методов^кон структоров. Этот метод в Visual Basic.NET называется New, а в С# его имя совпадает с именем класса. Функция-конструктор вызывается, когда клиент создает объект оператором new. В этой функции можно разместить любой код, выполняющий инициализацию объекта (возможно, выделение ресурсов и перевод их в начальное состояние). Вот пример конструктора (рис. 2-21).
Конструкторы объектовмогут принимать разныенаборы параметров,позволяя создавать объ-екты в определенномвоссиянии.Конструкторы объектовмогут принимать разныенаборы параметров,позволяя создавать объ-екты в определенномвоссиянии.С конструктором можно сделать еще ◊дну интересную вещь — передать ему параметры, таким образом позволяя клиенту привести объект в определенное состояние сразу после создания. Так, конструктор объекта, представляющего точку на графике, должен
Конструкторы объектовмогут принимать разныенаборы параметров,позволяя создавать объ-екты в определенномвоссиянии.
Конструкторы объектовмогут принимать разныенаборы параметров,позволяя создавать объ-екты в определенномвоссиянии.
принимать два целочисленных параметра X и Y, задающие поло-
жение этой точки. V класса может быть несколько конструкторов
с разными наборами параметров. Скажем, один конструктор объекта «точка» может принимать два параметра, другой принимает одну имеющуюся точку, а третий, вовсе без параметров, инициализирует члены объекта «точка» нулевыми значениями (рис. 2-22). Такая гибкость особенно полезна, если вы хотите создать объект, который нужно инициализировать перед вызовом. Допустим, у вас есть объект для представления пациента больницы, поддерживающий методы типа Пациент. СодратьПоболь- шеДенег и Пациент.Ампутировать(какуюКонечность). Очевидно,
что жизненно важно знать, какого человека представляет каждый отдельный экземпляр этого класса. В противном случае na- циентов можно перепутать. Предоставив конструктор, требующий идентификатор паи.иента, а не пустой конструктор по умолчанию, можно гарантировать, что никто не сможет прооперировать неустановленного пациента или по ошибке изменить идентификатор пациента после того, как он создан.
Public Class ConstructorDemoComponent
Dim m^x, m_y As Integer
Public Overloads Sub New ()
MyBase.Maw ()
m_x = 0
П= 0
End Sub
Public Overloads Sub New (x as Integer, у as Integer)
HyBase.New ()
im_x = x
m_y 二 У
End Sub
End Class
Рис. 2-21. Примерконструктора.
Dim foo As New ConstructorDemoConponent ( )
Dim bar As New ConstructorDemoComponent (4, 5)
Рис. 2-22. Пример конструктора.
Управление памятью в .NET
Одним из главных источников неприятных, трудно обнаруживаемых ошибок в современных приложениях является некорректное использование ручного управления памятью. Старые языки, такие как C + + , требовали от программиста удалять созданные объекты вручную. Это вызывало две главные проблемы. Во-пер-
Управление памятьювручную веует к тодобнаружи ваемы мошибкам, которыедорого обходятся.Управление памятьювручную веует к тодобнаружи ваемы мошибкам, которыедорого обходятся.вых, создав объекп программисты забывали до удалить его по окончании использования.
Управление памятьювручную веует к тодобнаружи ваемы мошибкам, которыедорого обходятся.
Управление памятьювручную веует к тодобнаружи ваемы мошибкам, которыедорого обходятся.
Такие утечки в конечном счете полностью истощали память процесса и вызывали его крах. Во-вторых, удалив объект вручную, про-
граммист мог позже по ошибке попытаться
вновь обратиться к этому адресу памяти. Visual Basic сразу обнаруживает ссылку на недействительную область памяти, а С + + -
как правило,. нет. Иногда в той области памяти, где раньше был удаленный объект, все еще остаются какие-то внешне нормаль-
ные значения, поэтому программа продолжит работу с испорченными данными. Эти ошибки до боли знакомы всем. Конечно, проще всего сказать: «не ошибайтесь, и все». Но в реальных программах объекты часто создаются в одной части программы, удаляются — в другой, а между ними располагается сложная логика, которая в одних случаях удаляет объект, а в других ,,,— нет. Все эти ошибки дьявольски трудно предотвратить, и еще труд-' нее обнаружить. Дисциплина при программировании, конечно, помогает, но на самом деле хотелось бы как-то заставить программистов думать о прикладной логике, а не об управлении ресурсами. Могу побиться об заклад, что гранд-дама телевизионных поваров Джулия Чайлд нанимает кого-нибудь прибрать на кухне после того, как все дела там закончены, чтобы позволить себе сосредоточиться на тех аспектах кулинарии, которые необходимы для уникальной квалификации в ее прикладной области.
Автоматическое управ-ление памятью и дасста-новление ресурсов типаАвтоматическое управ-ление памятью и дасста-новление ресурсов типатоао, что встроено вVisual Basic и Java,—весьма полезная вр иць.тоао, что встроено вVisual Basic и Java,—весьма полезная вр иць.У современных языков, какими являются Visual Basic и Java, таких пробленет. В этих языках управление памятью осуществляется
Автоматическое управ-ление памятью и дасста-новление ресурсов типа
Автоматическое управ-ление памятью и дасста-новление ресурсов типа
тоао, что встроено вVisual Basic и Java,—весьма полезная вр иць.
тоао, что встроено вVisual Basic и Java,—весьма полезная вр иць.
автоматически по принципу «пальнул и забыл». Это стало одной из причин, по которой программисты выбирают их для разработки ПО. Программисту на Visual Basic 6.0, как
правило, не обязательно помнить об удалении созданных обь&к-
тов. Visual Basic 6.0 подсчитывает ссылки на каждый объект и,
когда счетчик ссылок упадет до 0, автоматически удаляет объект, а освободившуюся память утилизирует. Среда разработки работает, как автоматическая посудомойка, которая берет грязные ка-
стрюли и сковородки из раковины, и, вымыв, расставляет их
обратно по полкам. Эх, мне бы такую! Может, мое желание и сбудется, если вы посоветуете всем своим друзьям купить этукнигу... Microsoft ввела автоматическое управление памятью в •NETCLR, что делает его доступным для любого языка. Концептуально это просто (рис. 2-23).
Рис. 2-23. Автоматическое управление памятью со сборкой мусора,Рис. 2-23. Автоматическое управление памятью со сборкой мусора,
Рис. 2-23. Автоматическое управление памятью со сборкой мусора,
Рис. 2-23. Автоматическое управление памятью со сборкой мусора,
Сборщик мусора CLRделает автоматическоеуправление памятьюдсхттупным любомуприложению,куче, чтобы выяс-Сборщик мусора CLRделает автоматическоеуправление памятьюдсхттупным любомуприложению,куче, чтобы выяс-
Сборщик мусора CLRделает автоматическоеуправление памятьюдсхттупным любомуприложению,
куче, чтобы выяс-
Сборщик мусора CLRделает автоматическоеуправление памятьюдсхттупным любомуприложению,
куче, чтобы выяс-
Программист создает объект оператором new и получает ссылку на него. CLR выделяет для него память из управляемой кучи (managed heap) — части памяти процесса, зарезервированной CLR для этой надобности. С определенной частотой системный поток анализирует все обьекты в управляемой
нить, на какие из них программаудерживает ссылки. Объект, на который не осталось ни одной ссылки, называется мусором (garbage) и удалятся из управляемой кучи. После этого оставшиеся в управляемой куче объекты дефрагментируются а имеющиеся у программ ссылки устанавливаются на новые адреса объектов. Таким образом, вышеуказанные проблемы ручного управления памятью решаются без написания кода. Невозможно забыть удалить объект, так как система «убирает» самостоятельно. Невозможно и обратиться к удаленному объекту через недействи-
тельную ссылку, поскольку объект не будет удален, пока на него есть хоть одна ссылка. Очевидно, для сборщика мусора потребуется больше циклов процессора, чем для стандартного диспетчера кучи, даже если он написан так, чтобы не проверять один и тот же объект дважды и распознает циклические ссылки. Как сказано выше, я считаю, что это правильная нагрузка на процессор, поскольку при этом ускоряется разработка и уменьшается число ошибок.
Сборщик му 口中自рабо-тает лишь вудобное длянего вре^<яг но его мож-но заставить выпоАнитьссор мусора а нужнь*момент.Сборщик му 口中自рабо-тает лишь вудобное длянего вре^<яг но его мож-но заставить выпоАнитьссор мусора а нужнь*момент.до окончательногодо окончательногоМагический процесс сбора мусора имеет место, лишь когда сборщик наконец-то соберется это сделать. В отличие от алгоритма, позволяющего определить, что память управляемой кучи исчерпана, точного алгоритма запуска сборщика не знает никто. Более того,
Сборщик му 口中自рабо-тает лишь вудобное длянего вре^<яг но его мож-но заставить выпоАнитьссор мусора а нужнь*момент.
Сборщик му 口中自рабо-тает лишь вудобное длянего вре^<яг но его мож-но заставить выпоАнитьссор мусора а нужнь*момент.
до окончательного
до окончательного
я гарантирую, что он еще не раз изменится выпуска продукта. Возможно, он даже бу-
дет отличаться в разных версиях одного выпуска. Функция System. СС. Collect позволяет вручную инициировать сбор мусора. Возможно, понадобиться вызвать ее на определенных этапах, заданных логикой программы (скажем, чтобы собрать весь хлам после того, как пользователь сохранит файл, или чтобы отдраить палубу перед началом большой операции). В основном вы просто позволяете сборщику мусора делать свою работу тогда, ког-
да он этого захочет.
До сих пор автоматический сбор мусора по- инициацией
ра мусора обычно разме- : называл себя замечательно, но кое-что было щается код, выполняю- упущено. А как насчет освобождения ресур-
щий освобождениесов при освобождении объекта? Приложения
ресурсов. Обычно он на с+ + обычно выполняли освобождение
деструкторе объекта I I I т I R г и i деструктора объекта, а曜 методе Gciss_Teminate. Cb| Visual Basrc —внутри их метода C7d5s_ Ter
minate. Это удачное место для размещения
кода, выполняющего освобождение ресурсов, так как клиент не сможет забыть вызвать его. Но как сделать это во время автоматического сбора мусора? Поймше, во-первых^ что проблема стала значительно проще. Главной задачей освобождения ресурсов, выполняемой в деструкторах C + + , было удаление дополнительных объектов, на которые ссылался удаляемый объект. Те-
перь об этом позаботится сборщик мусора. Но время от времени приходится выполнять освобождение ресурсов без участия механизма локального сбора мусора, скажем, при освобождении соединения с БД или выходе из удаленной системы.
Сборщик мусора CLR поддерживает завершитель (tinalizer) - - метод объекта, вызываемый при удалении объекта сборщиком мусора. В силу определенных причин завершитель аналогичен деструктору классов С+ Т и методу Visual Basic Class_ Terminate, заменителем которых он является. Однако завершитель суице- ственно отличается от обоих этих механизмов, и некоторые отличия могут настораживать. Универсальнь1й базовый класс CLR System .Objectсодержит метод Finalize, который можно подменять (рис. 2-24).
Когда объект удаляется сборщиком мусора, поток сборщика обнаруживает наличие у объекта метода Finalize и вызывает его, исполняя, таким образом, код освобождения ресурсов.
Protected Overrides Sub Finalize ()
' Реализация необходимой логики завершения.
MessageBox. Show ("In Finalize, my number =+ _
MyObjectNumber. ToString ())
' Перенаправить вызов базовому классу.
MyBase. Finalize ()
End Sub
Рис. 2-24. Поддержка объектом функции Finalize.
Помимо прочего, у завершителей есть не-Использование заверь
сколько недостатков. Ясно, что этот меха-шителей может быть
низм потребляет процессорное время; не сложнее, чем кажется на стоит его использовать, если очистка не нуж-первый взгляд.
на. Невозможно дать гарантии относительно
порядка вызова сборщиком мусора завершителей удаляемых им объектов, поэтому старайтесь исключить всякую зависимость от этих действий в своих программах. Завершители вызываются в отдельном потоке сборщика мусора. Поэтому вы их никак не упо-
рядочите, чтобы навязать собственный порядок вызова этих методов. В противном случае вы разрушите всю систему сбора мусора своего процесса. Завершители не вызываются при завершении приложений, так как программа «понимает», что при завершении процесса нужно освободить все ее внутренние ресурсы, чего суетиться-то? В ранней версии №Т была функция, позволявшая заставить систему вызывать завершители при зак- рытии叩 UAO*6HU J но из рабочей версии ее убрали. При исполу зовании завершителей могут возникать и другие проблемы (см. статьи Дж. Рихтера).
ПРЕАУПРЕЖАЕНИЕ一
Несмотря на внешнюю простоту, поведение завершителей довольно сложно, и в нем легко запутаться. Если вы планируете их использовать, вам просто НЕОБХОДИМО прочитать описание сбора мусора в .NET в двух частях, написанное Дж. Рихтером и опубликованное в ноябрьском и декабрьском выпусках MSDN Magazine (сейчас они доступ- - ны по адресу http:^\^w.microsoft.com/msdnmag) Сам факт, что для описания механизма сбора мусора потребовалось две статьи, позволяет судить о сложности его внутреннего устройства, несмотря на сравнительную легкость его подключения к программе (а может, все дело как раз в этом).
Завершители идеально подходят для задач, при решении которых нам не важно, когда будет выполнена очистка, т. е. если вас устраивают обещания типа «как только это действительно потребуется, это обязательно будет сделано». Порой это хорошо, а порой не очень, если ресурсы, которые должен освободить завершитель, дефицитны и лимитируют работу процесса (например, при соединении с БД). Эвентуальное освобождение не вполне приемлемо, если объект должен быть уничтожен прямо СЕЙЧАС, чтобы освободить занятые им дорогостоящие ресурсы, о которых не знает сборщик мусора. Как сказано выше, можно инициировать немедленный сбор мусора, но для этого потребуется анализ всей управляемой кучи, что довольно расточительно, если не нужна очистка для других объектов. Поскольку объект, ш од лежащий разборке, известен, нужен способ очистить лишь
этот объект (подобно тому, как Дж. Чайлд не убирает всю кухню и не выносит мусор, лишь для того, чтобы был чистым ее любимый нож). Подобная операция имеет величественное имя: детерминированное завершение (deterministic finalization).
Объекты, которым требуется поддержка детерминированного
Объект^ которыйсоажсн предоставитьклиенту способдетерминированногоосвобождения ресурсов,поддерживает методDispose.Объект^ которыйсоажсн предоставитьклиенту способдетерминированногоосвобождения ресурсов,поддерживает методDispose.завершения, реализуют интерфейс /Disposable, содержащий единственный метод Dispose. В этом методе можно разместить любой код, освобождающий дефицитные ресурсы, Клиент, вызывая этот метод, дает объект 'q'катание немедленно освободить эти ресурсы. Примером может служить системный класс System. Windows. Forms.Data Grid.
Объект^ которыйсоажсн предоставитьклиенту способдетерминированногоосвобождения ресурсов,поддерживает методDispose.
Объект^ которыйсоажсн предоставитьклиенту способдетерминированногоосвобождения ресурсов,поддерживает методDispose.
Иногда имя метода детерминированного завершения, поддержи-
ваемоао объектом, может отличаться. Это позволяет определить
понятное разработчику имя. Так, при вызове метода Dispose для объекта «файл» можно подумать, что при этом файл будет уничтожен. Поэтому разработчик такого объекта может дать этому методу более логичное имя — Close.
Детерминированное завершение кажется удачным, но и оно не без недостатков. Нет гарантии, что клиент не забудет вызвать ваш метод Dispose, поэтому в завершитель также надо включить поддержку функциональности освобождения ресурсов. Но если клиент все-таки вызывает Dispose, вероятно, стоит сэкономить время сборщика мусора, которое он потратит на вызов завершителя объекта, так как Dispose уже выполнил освобождение ресурсов. Системная функция System.CC.SuppressFinalize позволяет дать сборщику мусора указание не беспокоиться о вызове завершителя, даже при наличии такового. Если базовый класс поддерживает метод Dispose, нужно, чтобы объект в явном виде перенаправлял вызов своего Dispose базовому классу. Иначе вызов не gougei до базового класса, и освободить занятые им ценные ресурсы будет невозможно. Пример метода Dispose показан ниже (рис. 2-25). Этот класс является производным класса System. ОЬ- ject, у которого нет метода Dispose, поэтому я опустил соответствующий код.
Public Class Classi
Implements System. IDisposable
Public Sub Dispose (} Implements System.工Disposable. Dispose ' Здесь будет любая логика, необходимая для немедленного ' освобождения ресурсов.
MessageBox.Show ("In Dispose (), my number = "+ _ MyObjectNumber.ToString <))
' Если у базового класса есть метод Dispose, ' перенаправим ему вызов, сняв знак комментария ' со следующей строки.
' MyBase. Dispose ()
' Пометить объект как более не требующий завершения.
System.GC.Suppress Finalize (He)
End Sub
End Class
Рис. 2-25. Пример метода Dispose, обеспе чиваюшего детерминированное завершение.
fi XXOQUMG-писатьпрограмму( учетом техслучаев, когда клиентпытается обратиться кобъекту после вызоваего метода Dispose.fi XXOQUMG-писатьпрограмму( учетом техслучаев, когда клиентпытается обратиться кобъекту после вызоваего метода Dispose.Я написал небольшую программу, иллюстрирующую понятие автоматического управления памятью и сбора мусора. Ее можно загрузить с Web-сайта этой книги. Вид клиентского приложения показан ниже (рис. 2-26). Заметьте: при вызове Dispose объект не превращается в мусор. На самом деле Dispose no
fi XXOQUMG-писатьпрограмму( учетом техслучаев, когда клиентпытается обратиться кобъекту после вызоваего метода Dispose.
fi XXOQUMG-писатьпрограмму( учетом техслучаев, когда клиентпытается обратиться кобъекту после вызоваего метода Dispose.
определению нельзя вызвать для объекта, который является му-
сором, поскольку в этом случае не будет нужной ссылки. И воб- ще объект не может стать мусором, пока на него есть ссылки. В этом случае я предлагаю организовать в объекте внутренний
флаг, сигнализирующии о завершении объекта и позволяющий реагировать генерацией исключения на обращения после завершения объекта.
Автоматическая сборка мусора упрощает программирование выделения и освобождения объектов, благодаря чему внести путаницу в этот процесс стало сложнее, чем при аналогичных one-
口 eqNffw Object口 eqNffw Object
口 eqNffw Object
口 eqNffw Object
CalDnposeonOheci
Рис, 2-26. Клиентскоеприложение, демонстрирующее управление памятью.
По, ению Microsoftуправление памятью спомощью сбора мусорасделано устойчивом кутечкам памяти ценойдетерминизма.По, ению Microsoftуправление памятью спомощью сбора мусорасделано устойчивом кутечкам памяти ценойдетерминизма.рацияхна Ch + . Но в резул ьтате п рогра мми- рование детерминированного завершения стало сложнее и запутаннее, чем в VisualBasic 6. Вероятно, программисты на e +斗 сочтут такой поворот событий за благо. Но их коллегам, работающим наVisual1 Basic• и привыкшим к его автоматическому детермин и рован-
По, ению Microsoftуправление памятью спомощью сбора мусорасделано устойчивом кутечкам памяти ценойдетерминизма.
По, ению Microsoftуправление памятью спомощью сбора мусорасделано устойчивом кутечкам памяти ценойдетерминизма.
I ному поведению, практически с «защитой от дурака», это может показаться шагом назад. Причина того, что Microsoft отдала приоритет сбору мусора, в следующем: алгоритм подсчета ссылок в Visual Basic неверно обрабатывал циклические ссылки на объект. Это случается, когда у дочернего объекта есть ссылка на родительский. Допустим, обьект А создает обьект В, В — объект С, а С получает и удерживает ссылку на обьект В. Когда А освобождает свою ссылку на объект В, последний не может быть разрушен, так как у С все еще имеется ссылка на В. Если до освобождения ссылки объектом А программист не поместит код, разрывающий циклическую ссылку, В и С становятся «забытыми объектами», у которых нет ссылок, кроме ссылок друг на друга. Алгоритм сбора мусора автоматически определяет и обрабаты вает такие случаи с циклическими ссылками, чего не может алгоритм подсчета ссылок. После долгих обсуждений, сломав немало копий, Microsoft приняла решение, что защищенное от неправильного использования автоматическое предотвращение утечек памяти в любом случае важнее, чем простота реализации детерминизма. Одни программисты с этим согласятся, другие — нет (у меня еще нет определенного мнени% или, как говорит мой
архитектор,. я решительный сторонник разных вариантов). Так или иначе, этот выбор — результат тщательного анализа, а не сиюминутного каприза.
Взаимодействие с СОМ
Критическими факторами коммерческого
Обратная совмести- 尸厂 <
мость имеет решающее успеха любой новой платформы являются ее значение при разработке интегрируемость с имеющимися платфор- любой но^ои системы, мами и одновременная поддержка новых
средств разработки лучших приложений. На
пример, Windows 3.0 поддерживала не только приложения DOS и обеспечивала их многозадачность лучше, чемлюбой другой продукт з то время но и предоставляла платформу для создания приложен ий Windows, которые были лучше, чем любое приложение для DOS. Но нам никогда не приходится разрабатывать что- либо «с нуля». Как только Господу Богу удалось создать мир всего за шесть дней? Дело в том, что у Него не было никакой базы. об обратной совместимости с которой Ему пришлось бы беспокоиться (мой редактор не преминул заметить, что Бог также поскупился на документацию).
С 1993 г. в области озаимореиствия между Поэтому -NETподпер-».:
живает взаимодействие приложениями Windows зависит от СОМ.
с СОМ.СОМ пронизывает практически весь код сре
ды Windows, и это надолго. .NET Framework приходится поддерживать СОМ, чтобы получить шанс на коммерческий успех. И это так: клиент .NE1 может использовать сервер СОМ, и наоборот. Поскольку более вероятно, что новым программам №】 придется взаимоде иство вать с уже имеющимися программами СОМ, а не наоборот, я опишу этот случай первым.
Использование объектов СОМ из программ .NET
Клиент NET можетобращаться к объектуСОМ через вызывае/иуюоболочку периодавыполнения.Клиент NET можетобращаться к объектуСОМ через вызывае/иуюоболочку периодавыполнения.Клиент NE1 обращается к серверу СОМ через вызываемую оболочку периода выполнение (runtime callable wrapper, RCW) (рис. 2-27).
Клиент NET можетобращаться к объектуСОМ через вызывае/иуюоболочку периодавыполнения.
Клиент NET можетобращаться к объектуСОМ через вызывае/иуюоболочку периодавыполнения.
RCW является оболочкой объекта СОМ и работает как посредник между ним и средой CLR, позволяя клиентам .NET воспринимать
обьект СОМ просто как встроенный объект .NET а клиент .NET
при этом рассматривается объектом СОМ просто как стандартный клиент СОМ.
Интерфейсы J Unknown. IDispatch, IFooИнтерфейсы J Unknown. IDispatch, IFooРис. 2-27. В за имодействие между клиентом .NETи объектом СОМ через вызываемую оболочку периода выполнения.Рис. 2-27. В за имодействие между клиентом .NETи объектом СОМ через вызываемую оболочку периода выполнения.V разработчика клиента .NETесть несколько способов генерации RCW. Если Bbl пользуетесь Visual Studio.NET, щелкните правой кноп- IKOU раздел проекта References и выберите из контекстного меню Add Reference. При этомV разработчика клиента .NETесть несколько способов генерации RCW. Если Bbl пользуетесь Visual Studio.NET, щелкните правой кноп- IKOU раздел проекта References и выберите из контекстного меню Add Reference. При этомГенерировать RCWкоз валяют различныеинструментальныесредства.Генерировать RCWкоз валяют различныеинструментальныесредства.вы увидите диалоговое окно (рис. 2-28), в котором предложены на выбор все зарегистрированные объекты COM, найденные в системе, Выберите объект COM, для которого нужно генериро-вы увидите диалоговое окно (рис. 2-28), в котором предложены на выбор все зарегистрированные объекты COM, найденные в системе, Выберите объект COM, для которого нужно генериро-MdRcfrrvrKrMdRcfrrvrKr
Интерфейсы J Unknown. IDispatch, IFoo
Интерфейсы J Unknown. IDispatch, IFoo
Рис. 2-27. В за имодействие между клиентом .NETи объектом СОМ через вызываемую оболочку периода выполнения.
Рис. 2-27. В за имодействие между клиентом .NETи объектом СОМ через вызываемую оболочку периода выполнения.
V разработчика клиента .NETесть несколько способов генерации RCW. Если Bbl пользуетесь Visual Studio.NET, щелкните правой кноп- IKOU раздел проекта References и выберите из контекстного меню Add Reference. При этом
V разработчика клиента .NETесть несколько способов генерации RCW. Если Bbl пользуетесь Visual Studio.NET, щелкните правой кноп- IKOU раздел проекта References и выберите из контекстного меню Add Reference. При этом
Генерировать RCWкоз валяют различныеинструментальныесредства.
Генерировать RCWкоз валяют различныеинструментальныесредства.
вы увидите диалоговое окно (рис. 2-28), в котором предложены на выбор все зарегистрированные объекты COM, найденные в системе, Выберите объект COM, для которого нужно генериро-
вы увидите диалоговое окно (рис. 2-28), в котором предложены на выбор все зарегистрированные объекты COM, найденные в системе, Выберите объект COM, для которого нужно генериро-
MdRcfrrvrKr
MdRcfrrvrKr
ЧП COMЧП COM|₽1огей51|₽1огей51Cor^xr<rt МлтеCor^xr<rt МлтеCcrrmon LanguagePjntmeLi... COMMSlGen 1.0Type LibraryCcrrmon LanguagePjntmeLi... COMMSlGen 1.0Type LibraryComPlus 1.0 Catalog ReplicatLComPlus 1.0 Catalog ReplicatL「511—.."■♦■,£ ♦■■•■•.「511—.."■♦■,£ ♦■■•■•.]TypeLbVer. . | Pa•]TypeLbVer. . | Pa•1,01.01,01.0日MRWTW批后融限METf C iwINNT5V\Sy5tem32\catsr.., C:\WfNNT5V\5ysfrm32icorif日MRWTW批后融限METf C iwINNT5V\Sy5tem32\catsr.., C:\WfNNT5V\5ysfrm32icorif^rcwse..^rcwse..CgniSnep ; J Type Library 匚 OMWin 1.0 Type ufarary CarrtroWizard LOType Library cookdoc 1,0 Type Library g 淞ext 1,0 Type Library Crystal (Analysis CommonCon..- Crystal Query Engin® 1,0 •■•/•гХ^гггваЛАг—яХ.CgniSnep ; J Type Library 匚 OMWin 1.0 Type ufarary CarrtroWizard LOType Library cookdoc 1,0 Type Library g 淞ext 1,0 Type Library Crystal (Analysis CommonCon..- Crystal Query Engin® 1,0 •■•/•гХ^гггваЛАг—яХ.LG1.0LG1.0S33BBIS33BBIS^tectetl Components:S^tectetl Components:Comwxw* HameComwxw* HameI CcmSer rwUs«£ rl?otfce<I CcmSer rwUs«£ rl?otfce<l.C1.0 1,0 1,0 1.0 ? nl.C1.0 1,0 1,0 1.0 ? nCOMCOM二 IMPJ—1s/ГвтЗ》—.C:\Program FdesMcrcGt 5r C;\Prograni Files \Mucsoft <.,二 IMPJ—1s/ГвтЗ》—.C:\Program FdesMcrcGt 5r C;\Prograni Files \Mucsoft <.,'-:"тодгатн*":—сс‘ ,.匚心TNWTSV^Ee—力т,,.С \Prografi RlesVZummch Fl , С:\Ргодгзт Files^Commari Fil. ( Г 'Ргппглт Fih^rnMnwin Fil.」'-:"тодгатн*":—сс‘ ,.匚心TNWTSV^Ee—力т,,.С \Prografi RlesVZummch Fl , С:\Ргодгзт Files^Commari Fil. ( Г 'Ргппглт Fih^rnMnwin Fil.」UWE7 KwlCoiet^Mpter^CUWE7 KwlCoiet^Mpter^CRen 毋sRen 毋sC*I CanodL—-■—— ”,,■:■ ■,.,.C*I CanodL—-■—— ”,,■:■ ■,.,.
ЧП COM
ЧП COM
|₽1огей51
|₽1огей51
Cor^xr<rt Млте
Cor^xr<rt Млте
Ccrrmon LanguagePjntmeLi... COMMSlGen 1.0Type Library
Ccrrmon LanguagePjntmeLi... COMMSlGen 1.0Type Library
ComPlus 1.0 Catalog ReplicatL
ComPlus 1.0 Catalog ReplicatL
「511—.."■♦■,£ ♦■■•■•.
「511—.."■♦■,£ ♦■■•■•.
]TypeLbVer. . | Pa•
]TypeLbVer. . | Pa•
1,0
1.0
1,0
1.0
日MRWTW批后融限METf C iwINNT5V\Sy5tem32\catsr.., C:\WfNNT5V\5ysfrm32icorif
日MRWTW批后融限METf C iwINNT5V\Sy5tem32\catsr.., C:\WfNNT5V\5ysfrm32icorif
^rcwse..
^rcwse..
CgniSnep ; J Type Library 匚 OMWin 1.0 Type ufarary CarrtroWizard LOType Library cookdoc 1,0 Type Library g 淞ext 1,0 Type Library Crystal (Analysis CommonCon..- Crystal Query Engin® 1,0 •■•/•гХ^гггваЛАг—яХ.
CgniSnep ; J Type Library 匚 OMWin 1.0 Type ufarary CarrtroWizard LOType Library cookdoc 1,0 Type Library g 淞ext 1,0 Type Library Crystal (Analysis CommonCon..- Crystal Query Engin® 1,0 •■•/•гХ^гггваЛАг—яХ.
LG
1.0
LG
1.0
S33BBI
S33BBI
S^tectetl Components:
S^tectetl Components:
Comwxw* Hame
Comwxw* Hame
I CcmSer rwUs«£ rl?otfce<
I CcmSer rwUs«£ rl?otfce<
l.C
1.0 1,0 1,0 1.0 ? n
l.C
1.0 1,0 1,0 1.0 ? n
COM
COM
二 IMPJ—1s/ГвтЗ》—.
C:\Program FdesMcrcGt 5r C;\Prograni Files \Mucsoft <.,
二 IMPJ—1s/ГвтЗ》—.
C:\Program FdesMcrcGt 5r C;\Prograni Files \Mucsoft <.,
'-:"тодгатн*":—сс‘ ,.
匚心TNWTSV^Ee—力т,,.
С \Prografi RlesVZummch Fl , С:\Ргодгзт Files^Commari Fil. ( Г 'Ргппглт Fih^rnMnwin Fil.」
'-:"тодгатн*":—сс‘ ,.
匚心TNWTSV^Ee—力т,,.
С \Prografi RlesVZummch Fl , С:\Ргодгзт Files^Commari Fil. ( Г 'Ргппглт Fih^rnMnwin Fil.」
UWE7 KwlCoiet^Mpter^C
UWE7 KwlCoiet^Mpter^C
Ren 毋s
Ren 毋s
C*I Canod
L—-■—— ”,,■:■ ■,.,.
C*I Canod
L—-■—— ”,,■:■ ■,.,.
Рис, 2-28. Поиск объекта COM для генерации RCW.
вать RCW( u Visual Studio.NEl выдаст ее вам. БезVisual Studio.NET аналогичную задачу позволяет выполнить Tlblmp.exe (средство импорта библиотек типов) — инструмент командной строки из .NET SDK. Алгоритм, который читает библиотеку типов и генерирует код RCW, на самом деле находится в классе периода выполНения .NET под названием iysrem .Run time. In teropServices. TypeLib- Сопуе^ег, Как Visual Studio, NET, так и Tlblmp.exe используют этот класс. Если вы создаете инструмент разработки или являетесь мазохистом, то также можете использовать этот класс.
Вот пример клиентской программы NET, использующей объект- сервер СОМ (рис. 2-29). Эти примеры можно загрузить с Web- сайта книги и разбирать их по ходу изложения. В этом примере находятся сервер и клиент СОМ, а также клиент • NET, так что клиенты можно сравнить. Исходный текст показан дальше (рис. 2-30).
Рис. 2-29. Пример клиента NET, использующего сервер COM.Рис. 2-29. Пример клиента NET, использующего сервер COM.
Рис. 2-29. Пример клиента NET, использующего сервер COM.
Рис. 2-29. Пример клиента NET, использующего сервер COM.
RCW чудесным образомпреобразует гзызовыNET в СОМ,а результата СОМ —соответственно в №ТRCW чудесным образомпреобразует гзызовыNET в СОМ,а результата СОМ —соответственно в №Тпросто операторомпросто оператором
RCW чудесным образомпреобразует гзызовыNET в СОМ,а результата СОМ —соответственно в №Т
RCW чудесным образомпреобразует гзызовыNET в СОМ,а результата СОМ —соответственно в №Т
просто оператором
просто оператором
Сгенерировав RCW, следуя описанию в предыдущем абзаце, ВЬ1/ возможно, пожелаете импортировать его пространство имен в клиентскую программу оператором Imports. Это позволит ссылаться на объекты по их сокращенному имени. Объект RCW можно создать
new, как и любой другой объект .NET. При
создании RCW вызывает встроенную функцию COM CoCreate- Instance. Таким образом, создается объект СОМ, для которого
генерируется оболочка. После этого клиентская программа .NET
может вызывать методы RCW так, как если бы она была встро-
енным объектом .NET. RCW автоматически приводит каждый вызов в соответствие с правилами вызовов СОМ, например, конвертирует строки NET в строки BSTR, необходимые СОМ, и направляет их объекту. Прежде чем передать клиенту результат, который вернул объект COM, RCW конвертирует его во встроенные типы СОМ. Такая архитектура может показаться знакомой Iпользователям поддержки СОМ в Visual J + + .
IProtected Sub Button1_Cllck (ByVai sender As Object, ByVai e As System. EventArgs)
Создать экземпляр RCW - оболочку для нашего объекта COM object.
Dim RuntlmeCallableWrapper As New ComUsedByDotNet. Classi ()
Вызвать метод, получающий значение времени,
Labell. Text = RuntimeCallableWrapper.GetTimeFromCom( 一
CheckBoxI. Checked)
' При выходе из области действия объект становится мусором, но реально освобождается только во время следующего сбора мусора,
End Sub
Рис. 2-30. Листинг клиента .NET, использующего RCW.
НА самом аеле(д?ъйкгыСОМ разрушаются,НА самом аеле(д?ъйкгыСОМ разрушаются,Запустив программу' -пример клиента СОМ, вы заметите (по диалоговым окнам, BbiBog
НА самом аеле(д?ъйкгыСОМ разрушаются,
НА самом аеле(д?ъйкгыСОМ разрушаются,
I которых я разместил в программе), что притолько когда сборщик
щелчке кнопки создается объект, который мусора удаляет их RCW. сразу разрушается. При запуске программы- примера клиента №1 вы увидите, что объект создается, когда пользователь щелкает кнопку Get Time, но его немедленного разрушения не происходит. Можно подумать, что так и должно быть, если объект-оболочка выходит из области действия, но это не так, даже если вы явно сделали ссылки на объект пустыми. Так работает реализованный в .NET способ отложенного освобождения ресурсов. Он описан выше в разделе, посвященном сбору мусора. После выхода из области действия RCW больше недоступна программе. Но на самом деле объект, оболочкой которого явля-
ется RCW, не освобождается до тех пор, пока RCW не будет удалена и разрушена сборщиком мусора. Это может стать проблемой, так как большинство объектов СОМ создавалось без учета этого жизненного цикла, и поэтому могут удерживать ценные ресурсы, которые надо освободить сразу по завершении клиента. Есть два способа решения этой проблемы. Очевидно, первый из них — инициировать немедленный сбор мусора функцией System .CC.Collect. При ее вызове все системные ресурсы; кото- Iрые в данное время не используются (включая RCW вне текущей области действия), будут собраны и реутилизированы. Недостатком этого подхода являются издержки, связанные с полным циклом сбора мусора (а они могут быть велики). Возможно, из-за Iразрушения всего лишь одного объекта такие расходы не имеют смысла. Если требуется избавиться от одного конкретного объекта СОМ, не трогая осталь ные, это можно сделать функцией System,Runtime.InteropServices.Marshal.ReleaseComObject. Для механизма RCW, описанного в предыдущих абзацах, нужен объект, который подвергнется раннему связыванию. Здесь я имею в виду, что во время разработки программист должен обладать глубокими знаниями объекта, чтобы создать для него класс-оболочку. Но так работают не все объекты. Например, ситуации, возникающие при работе со сценариями, требуют позднего связывания, когда клиент читает ProgID объекта и имя метода, который нужно вызвать, из кода сценария в период выполнения. Большинство объектов СОМ поддерживают интерфейс IDispatch, чтобы дать возможность получить к ним доступ через позднее связывание. В таких ситуациях создать RCW заранее невозможно. Справится ли с этим .NET?
• .NET также без особыхпроблем поддерживаетпозднее связывание.• .NET также без особыхпроблем поддерживаетпозднее связывание.К счастью, qa. №1 Framework поддерживает позднее связывание с интерфейсом IDispatch, который поддерживается большинством объектов СОМ. Программа-пример,
• .NET также без особыхпроблем поддерживаетпозднее связывание.
• .NET также без особыхпроблем поддерживаетпозднее связывание.
использующая позднее связывание (рис. 2-31), и ее исходный текст (рис. 2-32) показаны ниже. Системный тип на основе ProgID объекта создается статическим методом Type,CetTypeFromProg!D. Если вместо ProgID имеется CLSID, то же самое делает статичес- IKULI метод Type.CetTypeFromCLSID(не показан). Объект СОМ
создается методом Д ctiva tor. Crea telnstance, а вызывает метод функция Type.lnvokeMember.Здесь, конечно, придется потрудиться — это обычное дело при позднем связывании — но все это вполне осуществимо.
Рис. 2-31. Пример программы, использующей позднее связывание.
Protected Sub Button1_Click (ByVai sender As Object! _ ByVal e As System. EventArgs)
Получить имя системного типа на основе prog ID.
IDim MyType As System.Type
MyType = Type. GetTypeFromProgID (textBoxI().Text)
' Создать объект этого типа с помощью активатора.
Dim MyObj As Object
MyObj =
' Собрать параметры объекта COM в массиве.
Dim prrns () As Object = {checkBoxI().Checked}
' Вызвать метод объекта по имени.
label2 O.Text = Reflection.BindingFIags.InvokeMethod, Nothing, MyObj, prrns).ToStrlng ()
End Sub
Рис. 2-32. Листингпрограммы, использующей позднее связывание.
Клиент СОМобращается к объекту№1 через вьвываемуюоСюдочку СОМ" (СОМcallable wrapper", CCW).СОМ в мире .NETКлиент СОМобращается к объекту№1 через вьвываемуюоСюдочку СОМ" (СОМcallable wrapper", CCW).СОМ в мире .NETИнтерфейсы / Unknown, IDispatch, IFooИнтерфейсы / Unknown, IDispatch, IFooРис. 2-33. Вызываемая оболочка СОМ.Рис. 2-33. Вызываемая оболочка СОМ.
Клиент СОМобращается к объекту№1 через вьвываемуюоСюдочку СОМ" (СОМcallable wrapper", CCW).
СОМ в мире .NET
Клиент СОМобращается к объекту№1 через вьвываемуюоСюдочку СОМ" (СОМcallable wrapper", CCW).
СОМ в мире .NET
Интерфейсы / Unknown, IDispatch, IFoo
Интерфейсы / Unknown, IDispatch, IFoo
Рис. 2-33. Вызываемая оболочка СОМ.
Рис. 2-33. Вызываемая оболочка СОМ.
Использование объектов •NET из СОМ
Допустим, у нас есть клиент, уже «говорящий на языке СОМ», который надо заставить использовать объект ,NE1 В силу некоторых причин это менее распространенный сценарий чем обратный (см выше), так как он предполагает разработку новых объектов Но нетрудно предвидеть ситуацию, когдау вас
есть клиент, использующий 10 объектов СОМ, при этом вам требуется добавить 11-й набор функциональности, который существует только в виде объекта .NET. При этом клиент должен их все воспринимать одинаково из соображений единообразия. Посредством COM callable wrapper (CCW) ,NE1 Framework может
справиться и с этой ситуацией (рис. 2-33). CCW служит оболочкой объекта .Net и играет роль посредника между ним и средой CLR заставляя клиент СОМ воспринимать объект .NET так, как если бы это бы объект СОМ.
Компонент ,NET долженбыть подписан, обитатьsGACи предоставлятьконструктор по умол-чанию для работыс клиентов СОМ.Компонент ,NET долженбыть подписан, обитатьsGACи предоставлятьконструктор по умол-чанию для работыс клиентов СОМ.
Компонент ,NET долженбыть подписан, обитатьsGACи предоставлятьконструктор по умол-чанию для работыс клиентов СОМ.
Компонент ,NET долженбыть подписан, обитатьsGACи предоставлятьконструктор по умол-чанию для работыс клиентов СОМ.
Для работы с CCW сборка компонента .NET должна быть подписана строгим именем. В противном случае исполняющая среда CLR не сможем однозначно идентифицировать ее. Кроме того, сборка должна находится в GAC или, что менее характерно, в дереве ка-
талогов клиентского приложения. Однако, как было ранее в слу-
чае компоновки клиента совместно используемого компонента, при регистрации компонент должен находиться в стандартном каталоге вне САС. Любой класс -NET, который должен быть создан СОМ, должен предоставлять конструктор по умолчанию, т. е. конструктор, не требующий параметров. Функции СОМ для создания объектов не обладают сведениями о передаче парамет-
ров объектам. которые они создают. Поэтому нужно быть уверенным, что вашему классу это не потребуется. V вашего класса может быть столько конструкторов с параметрами сколько нужно для использования клиентами .NET но при этом должен быть хотя бы один, которому не требуютсл параметры (для использования клиентами СОМ).
Утилита RegAsm^exe из NET SDK создает Б реестрезаписи, указывающие COM местонахожден не сервера класса .NET.Ниже показаныУтилита RegAsm^exe из NET SDK создает Б реестрезаписи, указывающие COM местонахожден не сервера класса .NET.Ниже показаныЧтобы клиент СОМ нашел объект • NET, в реестре нужно создать записи для СОМ. Это позволяет сделать утилита RegAsm.exe из .NETSDK. Эта программа читает метаданные класса .NET и создает в реестре записи, которые указывают клиентам СОМ на объект .NET. Программа-пример предоставляе! пакетный файл, который выполняет эти действия.
Утилита RegAsm^exe из NET SDK создает Б реестрезаписи, указывающие COM местонахожден не сервера класса .NET.
Ниже показаны
Утилита RegAsm^exe из NET SDK создает Б реестрезаписи, указывающие COM местонахожден не сервера класса .NET.
Ниже показаны
--■ 稲 FEfe&4EBBT5e„胃小史39 盟 C <£П2ШВВ■ 稲 FEfe&4EBBT5e„胃小史39 盟 C <£П2ШВВ:,;_J (W *> . «< <лЬ 1 •> fff.LO OOCJHFlHWfft—29-*Mi ci—,〃》”*/:,;_J (W *> . «< <лЬ 1 •> fff.LO OOCJHFlHWfft—29-*Mi ci—,〃》”*/Рис. 2-34. Элементыреестра, созданные программой REGASM.EXE.Рис. 2-34. Элементыреестра, созданные программой REGASM.EXE.созданные им записи реестра (рис. 2-34). Заметьте: сервером СОМ в этом случае является библиотека-посредник Mscoree.dll, Параметр Class в разделе lnProcServer32указывает этой библиотеке, какой класс .NETдолжен быть создан и заключен в оболочку, а элемент Assembly — сборку, в которой находится этот класс.
-
-
■ 稲 FEfe&4EBBT5e„胃小史39 盟 C <£П2ШВВ
■ 稲 FEfe&4EBBT5e„胃小史39 盟 C <£П2ШВВ
:,;_J (W *> . «< <лЬ 1 •> fff.LO OOCJHFlHWfft
—29-*Mi ci—,〃》”*/
:,;_J (W *> . «< <лЬ 1 •> fff.LO OOCJHFlHWfft
—29-*Mi ci—,〃》”*/
Рис. 2-34. Элементыреестра, созданные программой REGASM.EXE.
Рис. 2-34. Элементыреестра, созданные программой REGASM.EXE.
_J3jtv~,,S ■• II «И, S •.
_J IWЧЛ ЬЛ'М-llb'-J/.'A fHfttC7K*£B •
* _J,'JU)—A“・1t— • • 1l«^l;
_J r«** ГВ Ildl-AifctOWnBWr- I
■■ ••'» *, *— ♦•• —
□ lX^feJCO«4 III.. :: ио. V -4E:H
I 5A35—58 A5c-9C€4-6f *F IF7A<«80t 卜
Исхоаный текст клиентаСОМ использующегообъект .NET, находитсясреди примеров к этойглаве/Исхоаный текст клиентаСОМ использующегообъект .NET, находитсясреди примеров к этойглаве/Клиент СОМ обращается к объекту .NET так, как если бы он был встроенным объектом СОМ. Когда клиент вызывает для создания объекта функцию CoCreatelnstance, реестр направляет запрос зарегистрированному серверу, Mscoree.dll Эта DLL проверяет за-
Исхоаный текст клиентаСОМ использующегообъект .NET, находитсясреди примеров к этойглаве/
Исхоаный текст клиентаСОМ использующегообъект .NET, находитсясреди примеров к этойглаве/
•njjotueHHbiu CLS1D, читает реестр в поисках класса .NET. который должен быть создан, и на основе этого класса .NE1 создает CCW. CCW преобразует встроенные типы СОМ в их эквиваленты из .NET(например, строки BSTR — в объекты String, характерные для
..NET). а полняет включая вы есть..NET). а полняет включая вы естьзатем перенаправляет их объекту .NET. Она также вы- обратное преобразование результатов из .NET в СОМ, любые ошибки. Среди программ-примеров из этой гла- клиент СОМ, который обращается к совместно исполь-
..NET). а полняет включая вы есть
..NET). а полняет включая вы есть
зуемой сборке компонента time, созданной ранее в этой главе.
Доступность частейфункционал!>ности .NETдля клиентов СОМ мп*но задать через мета-данные, а именно —в атриоуте ^.omvnuDie.Доступность частейфункционал!>ности .NETдля клиентов СОМ мп*но задать через мета-данные, а именно —в атриоуте ^.omvnuDie.Разработчик программ для .NETможет захо- тетьсделать какие-то методbiy интерфейсыи классы доступными клиентам СОМ, а какие- то нет. Поэтому среди прочих метаданных №1 поддерживает атр ибут System .Runtime. - InteropServices. Com Visible. Его можно использовать для сборки, класса или интерфейса, а
Доступность частейфункционал!>ности .NETдля клиентов СОМ мп*но задать через мета-данные, а именно —в атриоуте ^.omvnuDie.
Доступность частейфункционал!>ности .NETдля клиентов СОМ мп*но задать через мета-данные, а именно —в атриоуте ^.omvnuDie.
также для отдельных методов. Элементы, у которых этот атрибут установлен в False, будут невидимыми для COM. CLR по умолчанию устанавливает его в True, поэтому в отсутствие этого атрибута элемент будет видимым для СОМ. Но поведение Visual Studio.NEL заданное по умолчанию для сборок, подразумевает установку этого атрибута в файле Assem biylnfo.vb равным False. Параметры, заданные на более низких уровнях иерархии, заменяют таковые на более высоком уровне иерархии. В программе- примере я установил этот атрибут для своего класса в True, сделав его, таким образом, видимым COM, как показано в следующем фрагменте. Если бы я хотел, чтобы все содержимое сборки было видимо для СОМ, я изменил бы его значение в файле Assembiylnfo.vb.
<System.Runtime.InteropServlces.ComVislble (True) >
Public Class Classi
Транзакции в .NET
Транзакции нужны для защиты целостности данных в распределенных системах. Допустим, мы пишем приложение, которое принимает оплату счетов в диалоговом режиме. Для оплаты телефонного счета нужно снять некую сумму с моего счета, который находится в некоторой БД, и перевести ее на счет телефонной ком-
Транзакции гарантируютцелостность баз данныхво время сложныхопераций-Транзакции гарантируютцелостность баз данныхво время сложныхопераций-пании, который, возможно, расположен в другой БД на другой машине. Если операция списания со счета проходит успешно, но по какой-то причине зачисление на счет оканчивается неудачей, надо отменить списание со
Транзакции гарантируютцелостность баз данныхво время сложныхопераций-
Транзакции гарантируютцелостность баз данныхво время сложныхопераций-
счета, иначе деньги будут потеряны, а целостность данных в системе — нарушена. Требуется уверенность в успехе или неудаче обеих операций. Именно этого можно достичь, объединив выполнение обеих операций в одной транзакции. Если обе операции завершаются успешно, транзакция фиксируется, и новые значения счетов сохраняются. Если хоть одна операция терпит неудачу, транзакция отменяется, и суммы на всех счетах откатываются к исходным значениям [о транзакциях вообще настоятельно рекомендую прочитать книгу Филиппа А. Бернштейна и Эрика Ньюкамвра «Принципы обработки тра нззкций》 (Philip A. Bernstein, Eric Newcomer. Principles of Transaction Processing. Morgan Kaufmann, 1997)].
в COM4- хорошореализована автома-тическая поддержкатранзакций.в COM4- хорошореализована автома-тическая поддержкатранзакций.V COM+ и его предка, Microsoft Transaction Server, была автоматическая поддержка, которая облегчала написание объектов участвующих в обработке транзакций. Про-
в COM4- хорошореализована автома-тическая поддержкатранзакций.
в COM4- хорошореализована автома-тическая поддержкатранзакций.
.граммист в административном порядке поме
чает CGOU объекты как требующие участия в транзакции. Затем, при активизации объекта, СОМ+ автоматически использовала транзакцию.
Объекты пользовались менеджером ресурсов COM4- Resource Managers, с помощью которого такие программы, как Microsoft SQ! Server, поддерживающие обработку транзакций в стиле COM4 вносили изменения в БД. После этого объект сообщал СОМ+, удовлетворен ли он полученными результатами. Если все объекты, участвующие в транзакции, оказывались удовлетворены, СОМ+ подтверждала транзакцию и давала Resource Managers указание сохранить все внесенные изменения. В противном слу~ чае СОМ+ отменяла транзакцию, приказывая Resource Managers отменить результаты всех операций над объектами и откатывая систему в исходное состояние. Подробнее о реализации обработки транзакций в СОМ + см. мою книгу Understanding СОМ+ (Microsoft Press, 1999).
Встроенные объекты .NET тоже могут принимать участие в транзакциях. Поскольку имеющаяся система обработки транзакций, разработанная Microsoft, основана на СОМ, объекты .NET могут делать это благодаря своей способности к взаимодействию с СОМ, описанной в предыдущем разделе. Необходимо зарегистрировать объект .NET как сервер СОМ. После этого через СОМ+ Explorer нужно установить этот компонент в приложение СОМ+ и настроить его требования к транзакциям точно так, как если это был встроенный объект СОМ. А инструментом командной строки Regsvcs.exe можно одновременно выполнить регистрацию объекта и настройку приложения СОМ+. Есть альтернативный путь: подобно встроенным объектам СОМ, которые иногда указывают свои требования к транзакциям в их библиотеках типов, можно задать требования объектов .NET к транзакциям через метаданные этих объектов. Следующий фрагмент демонстрирует написанный на Visual Basic объект .NET с атрибутом, указывающим, нужны ли объекту транзакции.
Public Class < TransactionAttribute _
(ТransactionOption. Required) > Classi
Если бы вы писали этот объект на С#, все было бы точно так же, кроме того, что вместо угловых скобок были бы использованы квадратные. Страница ASP.NET (см. главу 3) указываеттребования размещенного на ней кода к транзакциям через такой атрибут:
<х@ раде Transaction=rtRequired1' Х>
Web-службы (см. главу 4) указывают свои требования к транзакциям, помечая атрибутами отдельные методы:
Public Function <WebMethod (),
ТransactionAttribute(TransactionOptlon.Required) >_
HelloWorld( ) As String
Объекты .NET могутучаствовать втранзакциях СОМ+.Объекты .NET могутучаствовать втранзакциях СОМ+.Объект NET, принимающий участие в транзакции, должен «проголосовать» за тот или иной ее итог. Естъ два способа сделать это.
Объекты .NET могутучаствовать втранзакциях СОМ+.
Объекты .NET могутучаствовать втранзакциях СОМ+.
В СОМ+ и MTS объект получает свой кон-
текст, вызывая функцию API GetObjectContext, а затем вызывает в этом контексте метод, чтобы определить свой голос за тот или иной итог транзакции. Контекст объекта .NET находится в
Компонент «голосует» затот или иной итог тран-.закции посредствомсистемного объектаMicrosoft.Com-^ervicvb^oniexi UtiLКомпонент «голосует» затот или иной итог тран-.закции посредствомсистемного объектаMicrosoft.Com-^ervicvb^oniexi UtiLобъекте System,EnterpriseServices.ContextUtil, поддерживаемом системой. Этот □бьек! предоставляет методы SetAbort и SetComplete, которые используются наиболее часто, а также их менее распространенные равноценные методы EnableCommit и DisableCommit. Эти методы устанавливают биты, показывающие,
Компонент «голосует» затот или иной итог тран-.закции посредствомсистемного объекта
Microsoft.Com-
^ervicvb^oniexi UtiL
Компонент «голосует» затот или иной итог тран-.закции посредствомсистемного объекта
Microsoft.Com-
^ervicvb^oniexi UtiL
что объект завершил транзакцию и «доволен» ее итогами, точно так же, как они делают это в СОМ+. Контекст также содержит свойства DeactivateOn Return и MyTransaction Vb?■巳которые позволяют читать и устанавливать эти биты по отдельности. Кроме того, через атрибут AutoComplete можно заставить объект .NET
автоматически голосовать за итог транзакции по принципу «пальнул и забыл». В этом случае, если объект вернет управление штатным образом, автоматически вызывается метод SetComplete. Но если объект завершается из-за возникновения исключения, будет вызван метод SetAbort.
Структурная обработка исключений
В nepuoq выполнения любых программ воз-
亠二Noban программа
никаюз ошибки. Различные действия, кото-требует обработки
рые пытается выполнить программа, напри- ошибок/ возникающих в мер, открытие файла или создание объекта, I период выполнения. могут заканчиваться неудачей. Как же про
грамме узнать, удачно или нет закончилась операция, и как написать код, чтобы справиться с последней ситуацией?
Инаикация неудачногозавершения функциис помощью возвратакода ошибки работаетнелучшим образом.Инаикация неудачногозавершения функциис помощью возвратакода ошибки работаетнелучшим образом.В случае классического подхода функция, вызов которой заканчивается неудачей, возвращает специальное значение, свидетельствующее о сбое? например, Nothing (или NULL в случае С+ +)• V этого подхода три недостатка: во-первых, программист должен написать
Инаикация неудачногозавершения функциис помощью возвратакода ошибки работаетнелучшим образом.
Инаикация неудачногозавершения функциис помощью возвратакода ошибки работаетнелучшим образом.
код для проверки значения, возвращенного функцией, а на это при современных темпах разработки ПО часто нет времени. Подобно ремням безопасности или контрацептивам, коды ошибок работают, только когда их используют. Ошибки не перехватываются на уровне их источника, а распространяются на более высокие уровни программы, где их намного труднее раскрыть, и они
часто остаются замаскированными до начала продажи программы. Во-вторых, вы могли заметить, что коды ошибок широко варьируются в зависимости от функций; что повышает риск ошибок при программировании. Например, функция CreateWindow при ошибке возвращает 0, CreateFile — (—I), a Load Library в 16- разряднойWindows — любое значение меньше 32. На самом деле разнобой даже больше, поскольку при успешном вызове все функции, имеющие отношение к СОМ, возвращают 0, а при ошибках различных типов — ненулевые значения. В-третьих, при вызове функция может вернуть только одно значение, а оно несет очень мало сведений для отладчика (человека или машиныь которые могли бы быть полезными для понимания источника ошибки и ее устранения.
Ни OQна д ругая мето-дика не дает хорошихрезультатов при работес различными языками.Ни OQна д ругая мето-дика не дает хорошихрезультатов при работес различными языками.В разных языках были попытки использовать 卯 угие подходы для обработки ошибок периода выполнения. В Visual Basic применялся механизм On Error Go To, который был и OL тается жутким ляпом. Для Go To нет места в
Ни OQна д ругая мето-дика не дает хорошихрезультатов при работес различными языками.
Ни OQна д ругая мето-дика не дает хорошихрезультатов при работес различными языками.
современном ПО в течение по крайней мере последнего десятилетия. В C + + и Java был более удачный механизм — структурная обработкаисключений (structured exception handling), где сведения об ошибке содержит объект, который обрабатывается специальным блоком кода — обработчиком. К сожалению, подобно многим другим функциям языков, созданных до эпохи CLR структурная обработка исключений работала лишь со «своим» языком. В СОМ была попытка предоставить богатый набор функций межъязыковой обработки исключений через интерфейсы ISup- portErrorlnfo и lErrorlnfo, но такой подход оказалось трудно реализовать при программировании, и никто не мог дать гарантии, что остальные следовали тем же правилам, что и вы.
. .NET лоддерживает структурную обработку исключений какФунда- ментальную возможность* доступную в любом языке крометого^ функции SEH оаного язы- кадоступны из другого.. .NET лоддерживает структурную обработку исключений какФунда- ментальную возможность* доступную в любом языке крометого^ функции SEH оаного язы- кадоступны из другого.CLR №Т поддерживает структурную обработку исключений, похожую на таковую G • C++ и Java, как фундаментальную функцию, доступную всем языкам. Такая архитектура решает многие проблемы, преследовавшие обработкуошибок 13 прошлом. Необработанное исключение приведет к аварийному завершению работы приложения, поэтому при
. .NET лоддерживает структурную обработку исключений какФунда- ментальную возможность* доступную в любом языке крометого^ функции SEH оаного язы- кадоступны из другого.
. .NET лоддерживает структурную обработку исключений какФунда- ментальную возможность* доступную в любом языке крометого^ функции SEH оаного язы- кадоступны из другого.
C'fluse Private Single-tevel ExcepOonC'fluse Private Single-tevel ExcepOonСашеjСашеjразработке их нельзя игнорировать. Функция, сообщающая об ошибке, помещает описание сбоя в объект NET который, таким образом, может содержать столько информации, сколько нужно сообщить. Так как эта инфраструктура встроена в CLR, чтобы задействовать ее преимущества, нужно написать совсем небольшой код. Как и остальная функциональность CLR( структурная обработка исключений .NETхорошо работает во всех языках, Я написал небольшую программу, демонстрирующую некоторые возможности структурной обработки исключений CLR (рис. 2-35). Можно загрузить исходный текст этой программы с Web-сайта этой книги и работать вместе со мной.
C'fluse Private Single-tevel ExcepOon
C'fluse Private Single-tevel ExcepOon
Сашеj
Сашеj
Causef向*MulHevtlE*cep'<r
Рис. 2-35. Пример, демонстрирующий структурную обработку исключений.
Клиентская программа, прежде чем выполнить действие, которое, по ее мнению, может закончиться неудачей, готовит в программе блок обработки исключения (exception handler block) с использованием ключевых слов Try и Catch, как показано в листинге программы на Visual Basic. N El (рис. 2-36). Точный синтаксис структурной обработки исключений варьируется в зависимости от языка, но все, что я до сих пор видел, очень похожи на этот.
Блок Try-Catch позво-адет задать в клиентскойпрограмме код д“побработки исключений.Блок Try-Catch позво-адет задать в клиентскойпрограмме код д“побработки исключений.Когда программа при исполнении sxogui в блок Try, CLR записывает обработчик исключения в стек (рис. 2-37). Если вызванная функция, расположенная ниже в стеке, генерирует исключение, механизм обработки исклю-
Блок Try-Catch позво-адет задать в клиентскойпрограмме код д“побработки исключений.
Блок Try-Catch позво-адет задать в клиентскойпрограмме код д“побработки исключений.
снизу вверх до техснизу вверх до техчений CLR анализирует стек в направлении
снизу вверх до тех
снизу вверх до тех
пор, пока не найдет обработчик исключения. После этого стек
4—1 760
сжимается (все объекты удаляются из стека), и управление переходит к обработчику исключений. Исключение может зозникнуть Iна любом уровне стека вызовов. В программе-примере я преднамеренно открыл файл, которого нет. Системный метод File. Open генерирует исключение, которое мой клиент перехватывает и выводит пользователю информацию об имевших место событиях.
Protected Sub btnHandled_CIick (ByVai sender As Object. 一
By Vai e As System. EventArgs)
' При входе в этот блок кода р стек записывается ' обработчик исключения.
у
' Выполнить операцию, которая заведомо приведет ' к возникновению исключения.
Dim f。。 As System.10.FileStream foo = System.10.File.0pen( _
"Non-existent file".10.FileMode,Open)
' При возникновении исключения на нижнем уровне ' программы, этот блок обработки перехватывает его.
Catch x As System. Exception
' Выполнить любую необходимую очистку в ответ ' на перехваченное исключение.
MessageBox. Show (х.Message)
End Try
End Sub
Рис. 2-36. Клиентское приложение, демонстрирующее структурную обработку исключений,
Исключение может быть сгенерировано любой программой. Как показано выше, CLR для всех сообщений об ошибках использует SEH. Вероятно, для согласования у вас возникнет желание через SEH уведомлять одну часть приложения об ошибках, возникших в другой. Фрагмент программы, которому требуется сгенерировать исключение, создает новый объект типа System. Exception.
Можно устанавливать свойства этого объекта таким образом, чтобы они служили для любых заинтересованных в ней перехватчиков поставщиками информации о ситуации, в которой возникло исключение. CLR автоматически производит трассировку стека, что позволяет обработчику исключений точно определить место возникновения исключе-
Программа, котораясоби рается сгенериро-вать исключение;создает объектSystem. Exception,заполняет его поля ивызываетсистемнуюфункцию Throw,Программа, котораясоби рается сгенериро-вать исключение;создает объектSystem. Exception,заполняет его поля ивызываетсистемнуюфункцию Throw,ния. Затем с помощью ключевого слова Throw можно сгенери-
Программа, котораясоби рается сгенериро-вать исключение;создает объектSystem. Exception,заполняет его поля ивызываетсистемнуюфункцию Throw,
Программа, котораясоби рается сгенериро-вать исключение;создает объектSystem. Exception,заполняет его поля ивызываетсистемнуюфункцию Throw,
ровать исключение, как показано ниже (рис. 2-38). Вызов этой
на котором возниклона котором возниклолюбом уровне стека вызовов выше уровня,любом уровне стека вызовов выше уровня,исключение.исключение.Рис. 2-37. Схема структурнойобработки исключений.Рис. 2-37. Схема структурнойобработки исключений.функции служит для системы сигналом к началу анализа стека для поиска обработчиков. Обработчик исключения может жить на
на котором возникло
на котором возникло
любом уровне стека вызовов выше уровня,
любом уровне стека вызовов выше уровня,
исключение.
исключение.
Рис. 2-37. Схема структурнойобработки исключений.
Рис. 2-37. Схема структурнойобработки исключений.
Когда CLR передает управление обработчику исключения, содержимое стека программы между обработчиком и функцией, сгенерировавшей исключение, удаляется (рис. 2-37). При этом уничтожается любой объект или ссылка на объект. Автоматический
Блок Try-Finallvr\o330-ляет освсбодить pecyp-св после исключения.Блок Try-Finallvr\o330-ляет освсбодить pecyp-св после исключения.сбор мусора в .NET позволяет н беспокоиться об утечках памяти, занятой объектами, что было большой проблемой при использовании встроенной обработки исклю-
Блок Try-Finallvr\o330-ляет освсбодить pecyp-св после исключения.
Блок Try-Finallvr\o330-ляет освсбодить pecyp-св после исключения.
чений C+ + . Однако такое уничтожение объекта означает, что для объектов, которым требуется детерминированное завершение, у вас не будет шанса вызвать метод Dispose, Их завершители все- таки будут вызваны при следующем сборе мусора, но это может случиться слишком поздно. С подобной ситуацией поможет справиться обработчик Try-Finally (рис. 2-39). Команда из блока Finally исполняется по мере сжатия стека, поэтому в этот блок можно поместить код, необходимый для освобождения ресурсов. При желании можно объединить блоки Catch и Finally в одном и том же блоке Try.
Public Function BottomFunct ion () As String
' Создать новый объект исключение, установить
' его свойство "Message".
' Эти действия можно выполнить только в конструкторе.
Dim MyException As New
Exception("Exception thrown by BottomFunction")
' Установить свойство Source нового объекта Exception
' Это можно сделать где угодно.
MyException. Source =
"Understanding Microsoft.NET Chapter 2 Exceptioncomponent"
Сгенерировать исключение.
Throw MyException
End Function
Рис. 2-38. Генерация исключения с помощью SEH.
Можно генерироватьи перехватыватьмножество различныхтипов исключений.Можно генерироватьи перехватыватьмножество различныхтипов исключений.Мощность SHE даже еще больше в тех случаях, когда возникают различные типы исключений, свидетельствующие о различных типах сбоев в программах. Для этого нужно создать собственный класс, производный от
Можно генерироватьи перехватыватьмножество различныхтипов исключений.
Можно генерироватьи перехватыватьмножество различныхтипов исключений.
универсального базового класса System. Exception. К производно-
му классу «исключение» можно добавить любые дополнительные методы или свойства, которые, по вашему мнению, смогут прояснить ситуацию потенциальным перехватчикам. Даже если к этому классу ничего не добавлять сверх того, что уже имеется, простое наличие такого исключения позваляе! определить его тип, В примере, который показан в начале раздела, при попытке открытия н есуществу ю щего файла система сгенерировала исключение типа FileNotFoundException. Я написал обработчик, который перехватывает исключения любого типа (рис. 2-35). Если бы я хотел, чтобы обработчик перехватывал лишь исключения типа FileNotFoundException, то заменил бы Catch x As Exception на Catch x As FileNotFoundException. При анализе стека CLR сравнивает тип сгенерированного исключения с типом, заданным в блоке Catch t и передает управление блоку, только если тип сгенерированного исключения точно совпадает с заданным для перехвата или является его производным. К блоку Try можно прикрепить любое число обработчиков Catch. CLR просматривает их по порядку, поэтому сначала лучше поместить самые конкретные.
Public Function MiddleFunction () As String
' При входе в этот блок в стек записывается ' обработчик исключения.
Try
IBottomFunction ()
, Код из блока-обработчика Finally исполняется при выходе программы из блока T ry независимо ' от причины. Больше всего нас беспокоит случай, ' в котором после того, как функция BottomFunction ' генерирует исключение, происходит
' сжатие стека. В отсутствие обработчика Finally ' у нас не было бы шанса выполнить освобождение ' ресурсов для этого исключения.
Finally
HessageBox. ShowC'FinaLly handler in MiddleFunction") End Try
End Function
Рис. 2-39. Использование блока Finally.
Безопасность доступа к коду
В начале эры ПКлишь немногие пользовате- Как прави/\о, клиенты
считают безопаснымли устанавливали программы., купленные не
ПО, купленноев магазине. Тот факт, что продукция какого-
в магазине.либо производителя попала на полки Comp-
USA или позднее, Egghead Software, убеждал покупателя в том, что ПО из коробки не содержит вирусов, поскольку ни один мерзкий мошенник не мог позволить себе такие издержки на маркетинг. А пленочная упаковка, как на коробках с тайленолом, служила для клиента гарантией неприкосновенности продукта с момента отгрузки его производителем. Хотя в программах могли быть и, вероятно, были ошибки, которые время от времени служили причинами всяких проблем, вы чувствовали себя вполне комфортно и не опасались, что они разрушат данные на жестком диске (для которого вы еще не сделали резервную копию) просто из вредности.
Такая модель безопасности сегодня работа- • Однако в настоящее .•
время основная часть .ПО теперь
ПО поступает из Webпоступает не из магазинов. Самые большие
пакеты вроде Microsoft Office или Visual Studio устанавливаются с CD, хотя мне не ясно, как долго еще просуществует такая практика при распространении скоростных соединений с Интернетом. А как насчет обновлений, скажем, для Internet Explorer? Или новой игрушки типа тетриса? Производители любят распространять ПО через Web, поскольку это дешевле и легче, чем торговля через розничную сеть, а потребителям этот способ нравится из-за удобства и низких цен. Но мир программ Web не ограничен только тем, что традиционно считается прикладным ПО. Web-страницы могут содержать разные сценарии, и порой небезобидные. Даже в документах Офиса, пересылаемых по электронной почте, могут быть макросы. Вероятно, число загруженных из Web программ на вашем компьютере больше, чем установленных с купленных CD (не считая ОС), и это соотношение будет только расти,
Хотя, с точки зрения производителя, распространять ПО через Web замечательно, это ведет к возникновению проблем безопасности, с которыми мы раньше не сталкивались. Теперь злоумыш-
Для пользователя практически невозможно уз-二 нать, безопасен ли код, - загружаемый изWeb- ,,Для пользователя практически невозможно уз-二 нать, безопасен ли код, - загружаемый изWeb- ,,леннику намного проще сеять зло с помощью вирусов. Не проходит и месяца, чтобы по CNN не передавали предупреждение о новом вирусе, так что проблема достаточно остра, чтобы регулярно привлекать внимание попу-
Для пользователя практически невозможно уз-二 нать, безопасен ли код, - загружаемый изWeb- ,,
Для пользователя практически невозможно уз-二 нать, безопасен ли код, - загружаемый изWeb- ,,
дярных СМИ. Эксперты в области безопасности советуют рабо-
тать лишь с программами, присланными лишь хорошо известными вам людьми, но через кого же еще будут распространяться почтовые вирусы, как не через них? И как опробовать ПО, полученное от компаний, о которых мы никогда раньше не слышали? Пользователю практически невозможно узнать, когда загруженный из Web код безопасен, а когда — нет. Даже посвященные могут повредить систему, запуская вредоносное или сбойное ПО. Можно запретить своим пользователям работу со всеми програм-
мами, кроме тех, которые установлены лично сотрудниками отдела ИТ. Но попробуйте использовать такую политику хотя бы в течение одного рабочего дня, и вы увидите, как упадет производительность труда. Мы стали настолько зависимы от программ, загружаемых из Web, что поверить в это можно, лишь попытавшись жить без них. Единственное, что удерживает общество в том виде, в каком оно существует, от разрушения — это то, что люди, сочетающие в себе деструктивные наклонности и технические навыки для их реализации встречаются сравнительно редко.
CucTeMaAuthenticodeне защищаетот apeqo-ноеных действий, а арос-то позволяет идентифи^qupQisaTbAmg нанес-шее вам ущерб.CucTeMaAuthenticodeне защищаетот apeqo-ноеных действий, а арос-то позволяет идентифи^qupQisaTbAmg нанес-шее вам ущерб.Первой попыткой Microsoft обезопасить код в Web была системаAuthenticode, вошедшая в жизнь вместе с ActiveX SDK в 1996 г. С помощью Authenticode производители могли прикреплять к загружаемым элементам управления цифровые подписи. Это давало
CucTeMaAuthenticodeне защищаетот apeqo-ноеных действий, а арос-то позволяет идентифи^qupQisaTbAmg нанес-шее вам ущерб.
CucTeMaAuthenticodeне защищаетот apeqo-ноеных действий, а арос-то позволяет идентифи^qupQisaTbAmg нанес-шее вам ущерб.
пользователям некоторую уверенность, что
этот элемент управления действительно был прислан лицом, ука-
занным как его отправитель, и целостность его не нарушена с момента подписания. Система Authenticode неплохо работала, гарантируя, что последние обновления для Internet Explorer действи - тельно идут от Microsoft, а не от какого-нибудь злобного шутника. Но в этой системе Microsoft пыталась воспроизвести меры безопасности розничного магазина, не отдавая себе отчета в том,
что их уже недостаточно в мире Интернета. Поверхностная проверка лиц, получающих цифровые сертификаты, не дает уверенности в отсутствии у производителей злых намерений (Verisign, как идиоты, продали мне сертификат всего за 20 долларов), которую з большей или меньшей степени давал факт наличия товара на полках магазина или в каталоге «товары — почтой». Что хуже всезо, система Authenticode работала по принципу «все или ничего». Она позволяла более или менее определенно идентифи- циронать отправителя программы, но давала пользователю лишь единственный выбор; устанавливать программу или нет. После того, как программа попадала в систему, защититься от ее вредоносных действий было нельзя. Authenticode нельзя назвать системой безопасности — скорее это система отчетности. Она не защищает от вредительства, а лишь позволяет выяснить вредителя.
Нам действительно нужен способ ограниче- Не^о?^<|имо задавать_厂
уровень привилегий для ни,】 действий, которые может выполнить ' отдельных программ,программа, основанный на уровне доверия,
как для людей вВ жизни разным людям вы назначаете раз-
реальной жизни.личные уровни доступа к вашим ресурсам в
соответствии с уровнями доверия к ним: (текущая) супруга может позаимствовать у вас кредитную карточку, друг — старую машину, сосед — шланг для поливки газона. Хотелось бы, чтобы ОС поддерживала аналогичные различия. Например, ОС должна реализовывать ограничения, позволяющие загруженному из Интернета элементу управления обращаться к пользовательскому интерфейсу, но запрещающие доступ к дисковым файлам, если только он не прислан одним из немногих производителей, которым мы привыкли доверять. ОС Win32 не поддерживают функциональность такого типа, так как это изначально не входило в задачи их разработки. Но теперь у нас есть С. LR/ которая ее поддерживает.
NETCLR поддерживает безопасность доступа к коду (code access security), позволяющую администратору задать привилегии для каждой сборки управляемого кода в зависимости от уровня доверия (если оно вообще есть).
.ШCLR поддерживаетбезопасность доступа ккоду в период выпол-нениядля отдельныхсборок..ШCLR поддерживаетбезопасность доступа ккоду в период выпол-нениядля отдельныхсборок.Когда управляемый код вызывает CLR для обращения к защищенному ресурсу, скажем, чтобы открыть файл или получить доступ к Active Directory, CLR проверяет; предоставил ли администратор этой сборке соответствующую привилегию (рис. 2-40). При выполне-
.ШCLR поддерживаетбезопасность доступа ккоду в период выпол-нениядля отдельныхсборок.
.ШCLR поддерживаетбезопасность доступа ккоду в период выпол-нениядля отдельныхсборок.
нии вызова CLR просматривает весь стек до верха, что не позволяет недоверяемой сборке, находящейся на верхнем уровне, обмануть систему безопасности через доверяемого «приспешника»,
расположенного в стеке ниже (даже если за вашей дочерью в школу придет монахиня, вы бы все равно хотели, чтобы учитель проверил, что она прислана вами, не так ли?). Хотя такая провер-
ка снижает скорость доступа к защищенному ресурсу, другого приемлемого способа, который позволил бы избежать дыр в защите, нет. Когда CLR не может проконтролировать действия неуправляемого кода (например, объекта СОМ, который имеет дело непосредственно с ОС Win32, а не с CLR), предоставить или отнять привилегию доступа к неуправляемому коду может администратор.
У каждой сборки есть набор соответствующих прав доступа
Стек вызовов(сверху вниз)Стек вызовов(сверху вниз)Метод в сборке А4 требует наличия права доступа РМетод в сборке А4 требует наличия права доступа Рww9@®9@®Р сравнивается с набором прав доступа 1^1-вы- ваюших сборок, расположенных в стеке над А4Р сравнивается с набором прав доступа 1^1-вы- ваюших сборок, расположенных в стеке над А4
Стек вызовов
(сверху вниз)
Стек вызовов
(сверху вниз)
Метод в сборке А4 требует наличия права доступа Р
Метод в сборке А4 требует наличия права доступа Р
w
w
9@®
9@®
Р сравнивается с набором прав доступа 1^1-вы- ваюших сборок, расположенных в стеке над А4
Р сравнивается с набором прав доступа 1^1-вы- ваюших сборок, расположенных в стеке над А4
Рис. 2-40. Проверка прав доступа к коду в CLR.
Администратор устанавливает политику безопасности (security policy)— настраиваемый набор правил, определяющий, какие типы действий разрешены, а какие — запрещены и для каких сборок. Права доступа можно устанавливать на трех уровнях: предприятия, машины и пользователя. На более низком уровне можно ввести более строгие ограничения, чем на более высоком, но не наоборот. Так, если права доступа, заданные на уровне машины, разрешают сборке открывать файл, права доступа на уровне пользователя могут запрещать это, но не наоборот.
Администратор устанав-ливает политику без*опасностидоступакеду путем редактиро-вания ХМ1.-фаОловконфигурации,Администратор устанав-ливает политику без*опасностидоступакеду путем редактиро-вания ХМ1.-фаОловконфигурации,Администратор устанавливает политикубезо- пасности, редактируя XML-файлы конфигурации, хранящиеся на диске машины. Точ- ньЮ адрес и внутренняя схема размещения этих файлов почти наверняка изменятся в конечном выпуске NET Framework. Но в на-
Администратор устанав-ливает политику без*опасностидоступакеду путем редактиро-вания ХМ1.-фаОловконфигурации,
Администратор устанав-ливает политику без*опасностидоступакеду путем редактиро-вания ХМ1.-фаОловконфигурации,
стоящее время параметры уровня машины
хранятся в файле \W1 NNT\ Microsoft.NET\Framework\[текущая Bepcufl]\machine.config. Пока предполагается, что администратор будет манипулировать этими файлами, используя программу
командной строки caspol.exe. Она показалась мне очень сложной в использовании, даже по ужасным стандартам этой отрасли. Если Microsoft не будет поставлять утилиту с графическим интерфейсом, с которой будет легче работать, пользователь будет практи-
чески ограничен параметрами по умолчанию, так как никто и никогда не сможет их изменить. Тратить все усилия на разработку инструментов вроде IntelliSense для помощи программистам в ускорении создания приложений, заявлять об этом во всеуслы- 山ание, чтобы потом обложить их такими вот отвратительными «утилитами», — это в лучшем случае признак шизофрении. Увидев 2 года назад СОМ+ Explorer, я подумал, что наконец-то Microsoft усвоила мысль о необходимости полезных инструментов для администрирования. Наверное, эта мысль снова забыта. Администратор задает права доступа, п редоста вляемые сборкам, в терминах наборов прав доступа (permission sets). Их смысл (хоть Iраз!) точно соответствует названию: это списки привилегий, которые могут быть предоставлены или отозваны как единое целое. Конфигурация безопасности по умолчанию состоит из нескольких наборов прав доступа (табл. 2-2).
Табл. 2-2.
Права доступа в конфигурации по умолчанию.
Именованный набор
прав доступа
1 Право
Everything
Local Intranet
Internet
Nothing
Dns
Все встроен、
. ;ез
一
—
Permission
ные права доступа без ограничении, кроме Security- 1 Permission (чтобы пропустить проверь;.
ограничений
Environment
USERNAME
TEMP ТМР
FileDialog
Без ограниче-
Без ограни-
—
ний (доступ
чений (дос-
только для
туп только
чтения)
для чтения)
FilelO
—
Usolated
Assem blylsola
Domainlsola-
я^,
Storage
tionByUser,
tionByUser,
квота без
7024。байт,
ограничений
365 дней
Reflection
без
ограничений
—
—
Registry
—
—
—
Security
Execution, Assertion
Execution
Socket
Connectte( ept^
—
Permission
caui происхо
ждения
UI
Без
SafeWinSub-
-—
ограничений
dows OwnClipboard
Web
Connect, сайт
—
—
1Permission
происхождения
Зона
Local
Intranet
Trusted
Restricted All'
(My Computer)
Internet Sites
Sites Code*
Учитываются все соответствующие группы кода,
При желании можно модифицировать эти или создавать собственные наборы прав доступа. Каждый набор состоит из одного или нескольких прав доступа (permissions). Право доступа — это право на выполнение одного конкретного действия, например, на открытие файлов, выбранных пользователем в системном диалоговом окне Open File; возможно, с оговоркой, что файлы будут открыты только для чтения. Пример XML-файла с описанием одного права доступа показан ниже (рис. 2-41).
Неограниченные права доступа ко всем переменным окружения
< Permission class=
"System.Security.Permissions.EnvironmentPermission">
<Unrestricted/>
</Permission>
Доступ только для чтения к переменным USERNAME. TEMP и ТМР
"System, Security. Permissions. EnvironmentPermission">"System, Security. Permissions. EnvironmentPermission"><Permission class=
"System, Security. Permissions. EnvironmentPermission">
"System, Security. Permissions. EnvironmentPermission">
<Read>USERNAME; TEMP; TMP</Read>
</Permission>
Рис. 2-41. Выдержка из XML-файла, описывающего одно право доступа.
В наборе Everything (раздел А на рис. 2-41) Администратор конст-尸* '尸尸В наборе Everything (раздел А на рис. 2-41) Администратор конст-尸* '尸尸руирует наборы правправо на использование переменных окруже-доступа — списки прав, нип предоставляется без ограничений, но вкоторые п редоста вля-наборе Localintranet (раздел В на рис. 2-41 Iются и отбываютсяоноограничено правами на чтение перемен-руирует наборы правправо на использование переменных окруже-доступа — списки прав, нип предоставляется без ограничений, но вкоторые п редоста вля-наборе Localintranet (раздел В на рис. 2-41 Iются и отбываютсяоноограничено правами на чтение перемен-одновременно какHb)x USERNAME,TEMP и ТМР. Имейте в видуРСННКЯ ппмппк. •одновременно какHb)x USERNAME,TEMP и ТМР. Имейте в видуРСННКЯ ппмппк. •единая группа. •единая группа. •что именно состав наборов прав доступа и их внутренняя XML-структура скорее всего под-что именно состав наборов прав доступа и их внутренняя XML-структура скорее всего под-
В наборе Everything (раздел А на рис. 2-41) Администратор конст-尸* '尸尸
В наборе Everything (раздел А на рис. 2-41) Администратор конст-尸* '尸尸
руирует наборы правправо на использование переменных окруже-
доступа — списки прав, нип предоставляется без ограничений, но вкоторые п редоста вля-наборе Localintranet (раздел В на рис. 2-41 I
ются и отбываютсяоноограничено правами на чтение перемен-
руирует наборы правправо на использование переменных окруже-
доступа — списки прав, нип предоставляется без ограничений, но вкоторые п редоста вля-наборе Localintranet (раздел В на рис. 2-41 I
ются и отбываютсяоноограничено правами на чтение перемен-
одновременно какHb)x USERNAME,TEMP и ТМР. Имейте в виду
РСННКЯ ппмппк. •
одновременно какHb)x USERNAME,TEMP и ТМР. Имейте в виду
РСННКЯ ппмппк. •
единая группа. •
единая группа. •
что именно состав наборов прав доступа и их внутренняя XML-структура скорее всего под-
что именно состав наборов прав доступа и их внутренняя XML-структура скорее всего под-
вергнутся изменениям за время, которое пройдет между написанием этой книги и выходом окончательной версии этого ПО.
Теперь вы знаете, какими наборами прав доступа может манипулировать администратор. Рассмотрим способ присвоения набора прав доступа сборке. Администратор привилегий программ может присвоить набор прав доступа определенной сборке так же, как администратор регистрации пользователей назначает
отдельным пользователям определенные Администратор叩uc騒" привилегии при регистрации. Однако обеивает группам программ
методики очень быстро стали громоздкими.наборы прав доступа.
Большинство администраторов регистрации
создают группы пользователей (рабочие, служащие и т. д.), ЧА4 ны которых имеют привилегии одного уровня, и перемещают отдельных пользователей между этими группами. Аналогично большинство администраторов привилегий программ будет создавать группы сборок — группы программ (code groups) — и назначать им наборы прав доступа. Основное различие между задачами администраторов регистрации и привилегий программ в том, что первые определяют принадлежность к группе каждого пользова' теля вручную, так как новые пользователи появляются в системе не так часто.
Администраторустанавливает правилапринадлежности сборкик группе программ,Администраторустанавливает правилапринадлежности сборкик группе программ,Способ загрузки программ из Web не позволяет положиться на человека при принятии решения о доверии всякий раз, когда браузер встречает новую сборку. Поэтому администратор привилегий программ устанавли-
Администраторустанавливает правилапринадлежности сборкик группе программ,
Администраторустанавливает правилапринадлежности сборкик группе программ,
ваетуслозия членства (membership conditions), определяющие, каким образом сборка будет приписана к той или иной группе программ. В условиях членства обычно указана зона, откуда получена сборка, например, My Computer, Internet, Intranet и т. д. В условия членства входят строгое имя сборки (например, «эта сборка написана нашими разработчиками») и открытый ключ, которым она подписана («сборка создана Microsoft»). Загружая сборку в период выполнения, CLR определяет группу программ, к которой принадлежит сборка, путем проверки ее условий членства и присваивает ей набор прав доступа, заданный для этой группы программ. Ниже показана сокращенная версия сложного XML-файла, согласно которому сборкам из зоны My Computer присваивается набор прав доступа FullTrust (рис. 2-42). Теперь ясно, что я имел в виду, говоря о хороших инструментах для администрирования?
Хотя основная часть работы с безопасностью доступа к программам достается системным администраторам, программистам тоже время от времени приходится писать программы, которые
CLR поддерживает многофункции и объектов дляпрограммного взаимО'действия с системойбезопасности доступак npudpdMMazCLR поддерживает многофункции и объектов дляпрограммного взаимО'действия с системойбезопасности доступак npudpdMMazимеют аело с системой безопасности дост' па кпрограммам. Например.у программиста может возникнуть желание добавить к сборке атрибуты, которые задают наборы прав доступа^ необходимые для ее работы. Эти атрибуты не влияют на уровень прав доступа, предоставляемых сборке, так как на-
CLR поддерживает многофункции и объектов дляпрограммного взаимО'действия с системойбезопасности доступа
к npudpdMMaz
CLR поддерживает многофункции и объектов дляпрограммного взаимО'действия с системойбезопасности доступа
к npudpdMMaz
ходятся под контролем вышеописанных административных настроек. Однако они позволяют CLR сразу запретить загрузку сборки, а не ждать, когда сборка попытается выполнить запрещенную ей операцию. С другой стороны, при одних способах использования сборки надо выполнять запрещенные операции, а при других это не требуются. В последнем случае эти операции можно запретить. Программисту также может потребоваться прочитать уровень прав доступа, который был реально предоставлен сборке, чтобы проинформировать пользователя или администратора о том, чего не хватает. В CLR много функций и объектов, которые позволяют программисту писать программы, взаимодействующие с системой безопасности доступа к программам. Даже поверхностное рассмотрение этих функций выходит далеко за рамки этой книги. Но об их существовании все же следует знать, так как при желании с ними можно работать; но скорее всего такого желания у вас никогда не возникнет. Если установить ад-
министративные права доступа, как здесь описано, то «хорошие» сборки смогут выполнять полезные действия, а «плохие» — не смогут нанести вреда.
<ICddeGroup olass=,,Systern. Security, Policy. UnionCodeGroup">
<IMembershipCondition class=
"System. Security. Policy. ZoneMembershipCondition'^
<Zone>MyComput0r</Zone>
</I MetftbershipCon<iitio(i>
<Permi$sionSet class=,,System Security, NamedPermissionSet">
<Name>FullT rust</Name>
</PermissionSet>
</ICodeGroup>
Рис. 2-42. Выдержка из XML-файла, описывающего группу программ и права членства для предоставления набора прав FullTrust.
Примечание
Когда я вычитывал гранки книги за неделю go ее сдачи в печать, Microsoft объявила, что под сильным давлением Visual Ba$i 匚^разработчиков пришлось снова изменить принципы работы массивов. Массивы все равно будут начинаться с нулевого элемента, но при этом Visual Basic.NETбудет автоматически выделять дополнительный элемент наверху массива, что избавит вас от необходимости переписывать имеющиеся программы. Объявляя массив оператором Dim Х(5) As Integer, вы на самом деле получите массив из 6 эле* ментов, пронумерованных от 0 до 5. Это значит, что менять имеющиеся программы на Visual Basic вовсе не обязательно. Теперь проблема в том, что при совместном использовании программ, написанных на Visual Basic, с языками, в которых массивы начинаются с нулевого элемента (такими как C# и Java),другой разработчик будет знать, что нулевой элемент на самом деле есть, но не будет знать, пуст он или нет. Похоже, что проблема взаимозаменяемости программ, в которых массивы начинаются с 0 или 1 элемента, конца которой я ждал такдолго, по чьей-то воле получила новую жизнь. По- моему, намного лучше было бы покончить с ней раз и навсегда. Возможно, Microsoft вновь корчит из себя мудреца в надежде, что разработчики, использующие массивьь ко* торые начинаются с нулевого элемента^ падут на колени с криком: «О, нет! Что угодно, только не эта путаница! Мы сдаемся, пусть все они начинаются с 1 !» Надеюсь, эти изменения будут отвергнуты.
Глава 3
ASP.NET
И голоса наперебой — и все понятны мне — Звучат на скорости любой и при любой волне. От крышки люка до котла — единое стремленье. Как зорька ясная, светла их Песнь Благодаренья.
Р. Киплинго взаимодействии и масштабируемости. {^Молитва МакЭндрю», 1894г.)
Сначала Webиспользовали длппросмотра статическихстраниц, которые былоотносительно легкопрограммировать.Сначала Webиспользовали длппросмотра статическихстраниц, которые былоотносительно легкопрограммировать.Суть проблемы
Сначала Webиспользовали длппросмотра статическихстраниц, которые былоотносительно легкопрограммировать.
Сначала Webиспользовали длппросмотра статическихстраниц, которые былоотносительно легкопрограммировать.
Изначально Web служила 9АЯ передачи статических страниц с текстом и изображениями. Запрограммировать сервер для этого было относительно просто — нужно просто принять URL, идентифицирующий файл, взять этот файл с диска сервера и передать этот файл клиенту(рис. 3-1).Даже такая про-
стая архитектура позволяет многое. Например, наш местный
кинотеатр имеет небольшой Web-сайт, на котором я могу посмотреть, что идет сегодня (чаще всего «Счастливо, Техас!», в КОТО' ром двух беглых зэков облапошивают красотки в небольшом те-
хасском городке), что будет скоро, и по ссылкам просмотреть анонсы и отзывы. Они используют Web как бумажную рекламную брошюрку, правда с более привлекательным содержанием,
быстрой доставкой и меньшими затратами — словом (ну, может, двумя), более адекватно.
Рис. 3-1. Сервер передает статические Web-страницы.Рис. 3-1. Сервер передает статические Web-страницы.
Рис. 3-1. Сервер передает статические Web-страницы.
Рис. 3-1. Сервер передает статические Web-страницы.
СегодняWeb-програм-мистыдодж-ньг уметьдинамически создаватьHTML-страницы в ответна данные, получен нь*е• от пользойзтеля, чтопорождает новые• проблемы.СегодняWeb-програм-мистыдодж-ньг уметьдинамически создаватьHTML-страницы в ответна данные, получен нь*е• от пользойзтеля, чтопорождает новые• проблемы.Этот подход был приемлем в доисторические времена, когда все данные в Web были статическими (отображая только созданное азтором содержание без программной логики и возможности вмешательства со стороны пользователя) и открытыми (доступными всем, кто знал или мог найти адрес). Но со временем потребители стали спрашивать:
СегодняWeb-програм-мистыдодж-ньг уметьдинамически создаватьHTML-страницы в ответна данные, получен нь*е• от пользойзтеля, чтопорождает новые
• проблемы.
СегодняWeb-програм-мистыдодж-ньг уметьдинамически создаватьHTML-страницы в ответна данные, получен нь*е• от пользойзтеля, чтопорождает новые
• проблемы.
«Если я могу узнать, какой сегодня фильм, почему я не могу посмотреть текущее состояние своего банковского счета?» Но при статическом подходе это неосуществимо. Банк не может каждый день создавать новую страницу для любого возможного представления каждого счета — страниц окажется слишком много. Вместо этого пользователю нужно ввести некоторую информацию, такую как номер счета, а банковский компьютер должен по запросу создать HTML-страницу, отображающую баланс клиентского счета (рис. 3-2). Такие данные не являются ни статическими, ни открытыми, а это порождает новые проблемы.
V^febcepsepHbiMприложениям нужнапрограммная логика длягенерации страниц.V^febcepsepHbiMприложениям нужнапрограммная логика длягенерации страниц.Web-серверному приложению; динамически генерирующему страницы для клиента, требуется несколько вещей. Во-первых, ему нужен способ увязки программнойлогики с запросом страницы. Когда пользователь за-
V^febcepsepHbiMприложениям нужнапрограммная логика длягенерации страниц.
V^febcepsepHbiMприложениям нужнапрограммная логика длягенерации страниц.
прашивает страницу, сервер не может просто извлечь ее с диска — до этого запроса ее просто нет. Вместо этого сервер должен выполнить некий алгоритм для генерации страницы. В при-
мере с банком нам, вероятно, потребуется просмотреть банковскую БД и найти текущий баланс пользовательского счета и последние транзакции. Нам бы хотелось реализовать этот алгоритм легко и быстро, с применением уже знакомых языков и инструментов. И хотелось бы, чтобы это работало настолько быстро и эффективно, насколько это возможно в реальной жизни.
Клиентский браузерL Пользователь вводитв браузере запрос: «Дай мне страницу, отображающую транзакции по моему банковскому счету № 12345*.4、 Браузер обрабатывает*страницу для отображения клиенту,Клиентский браузерL Пользователь вводитв браузере запрос: «Дай мне страницу, отображающую транзакции по моему банковскому счету № 12345*.4、 Браузер обрабатывает*страницу для отображения клиенту,2. Браузер посылает запрос серверу,2. Браузер посылает запрос серверу,Сервер3. Сервер осуществляет доступ к информации по счету и создает страницу, содержащую запрошенную сервером информацию.Сервер3. Сервер осуществляет доступ к информации по счету и создает страницу, содержащую запрошенную сервером информацию.
Клиентский браузер
L Пользователь вводит
в браузере запрос: «Дай мне страницу, отображающую транзакции по моему банковскому счету № 12345*.
4、 Браузер обрабатывает*
страницу для отображения клиенту,
Клиентский браузер
L Пользователь вводит
в браузере запрос: «Дай мне страницу, отображающую транзакции по моему банковскому счету № 12345*.
4、 Браузер обрабатывает*
страницу для отображения клиенту,
2. Браузер посылает запрос серверу,
2. Браузер посылает запрос серверу,
Сервер
3. Сервер осуществляет доступ к информации по счету и создает страницу, содержащую запрошенную сервером информацию.
Сервер
3. Сервер осуществляет доступ к информации по счету и создает страницу, содержащую запрошенную сервером информацию.
Рис. 3-2. Сервер динамически генерирует Web-страницы на основе полученной от клиента информации.
Нашему Web серверунужен удобный способполучения вводимойпользователем инфор-мации и перадачивыходных данных набраузер пользователя.Нашему Web серверунужен удобный способполучения вводимойпользователем инфор-мации и перадачивыходных данных набраузер пользователя.Кроме того, нашему Web-cepsepy нужен способ передачи вводимой информации серверному алгоритму и возврата выходной информации от этого алгоритма пользователю. Пользовательский браузер передает серверу HTML-форму, содержащую элементы управления для вводаданных, которые определяют интересующую его информацию, напри-
Нашему Web серверунужен удобный способполучения вводимойпользователем инфор-мации и перадачивыходных данных набраузер пользователя.
Нашему Web серверунужен удобный способполучения вводимойпользователем инфор-мации и перадачивыходных данных набраузер пользователя.
мер, номер счета и период времени, за который он хочет просмот-
реть транзакции. Извлечение данных с этой HTML-страницы — процесс нудный, поэтому нам бы хотелось иметь готовый способ запрограммировать это быстро и просто. Подумайте, насколько проще текстовое окно (для фанов С+ 4 — управляющий элемент редактирования) позволяет читать введенные символы в сравнении с самостоятельной сборкой строки из отдельных символов.
I Нам хотелось бы иметь примерно такой же уровень готового сервиса для сборки HTML-страницы, передаваемой пользователю. Просто на HTML писать утомительно. Насколько проще иметь
готовый элемент управления для текстового поля в пользовательском интерфейсе Windows, чем писать CDI-вызовы для установ-
цвета, текста и т. д. Что-то подобное нам нужно для создания HTML,браузеру.
HaujeMyWeb-cepBepy нужныT9, мтоб田 неавт*оризо~ванныеневидеть или делать то, что им не положено.HaujeMyWeb-cepBepy нужныT9, мтоб田 неавт*оризо~ванныеневидеть или делать то, что им не положено.бывшая жена илибывшая жена илиВ-третьих, поскольку по крайней мере данные теперь
HaujeMyWeb-cepBepy нужны
T9, мтоб田 неавт*оризо~ванныене
видеть или делать то, что им не положено.
HaujeMyWeb-cepBepy нужны
T9, мтоб田 неавт*оризо~ванныене
видеть или делать то, что им не положено.
бывшая жена или
бывшая жена или
наш Web-сервер должен знать, кем являет- пользователь, чтобыему про
сматривать и делать только то, что ему раз- Вам бы хотелосьсвой счет,
но не хотелось бы, чтобы его увидела злюка тем более сняла с него деньги. Написание
такого кода — дело сложное и и убедить недоверчивых заказчиков з его пуленепробиваемости ничем не легче и не дешевле. Нам нужна инфраструктура с готовыми средствами
Нашему Web-серверуHV*Hbi средстваулраодения сеансами.Нашему Web-серверуHV*Hbi средстваулраодения сеансами.I И, наконец, нашему Web-серверу
Нашему Web-серверуHV*Hbi средстваулраодения сеансами.
Нашему Web-серверуHV*Hbi средстваулраодения сеансами.
ханизм управления пользовательскими сеансами. Длявзаимодействие с
•— это не последовательность
но диалог, «сеанс». Он ожидает, что Web-сайт может запоминать, что ему было сказано пару минут назад.на
сайте электронного магазина он хочет складывать товары в тележку так, чтобы они хранились там до расчета. Чтобы этого добиться, нужен соответствующий код — запрос к отдельной странице не способен поддержать такую функциональность. Это опять же неотъемлемая часть большинстватак
что хотелось бы иметь готовую, простую в использовании реализацию. В идеале это должно работать в многосерверной среде и бытьк сбоям.
Короче, нашему серверу нужна
Нам нужна законченная
готовые решения
проблем, которые возникают при программировании всех Web-серверов. Хотелось бы, чтобы она упрощала программирование, администрирование и развертывание. Нужно чтобы ее можно было распространять хотя бы на несколько, а лучше — на множество серверов. И тить за это много не хочется. А больше нам ничего не нужно?
Архитектура решения
ASP была исполняющейсредой, которую можнобыло легко применятьдля простых задач,ASP была исполняющейсредой, которую можнобыло легко применятьдля простых задач,В конце 1997 г. Microsoft реализовала относительно простую среду периода выполнения для Web — Active Server Pages (ASP) как часть сервера Internet Information Server (IIS), включенного в Windows NT 4 Option Pack. IIS об-
ASP была исполняющейсредой, которую можнобыло легко применятьдля простых задач,
ASP была исполняющейсредой, которую можнобыло легко применятьдля простых задач,
служивает Web-страницы, запрашиваемые пользователем. ASP
позволяет программистам реализовывать алгоритмы динамического создания страниц на IIS, состоящих из статического HTML и кода сценариев (рис. 3~3). Когда пользователь запрашивает ASP- страницу, IIS должен ее найти и активизировать ASP-процессор. ASP-процессор должен прочитать страницу и один к одному скопировать содержащиеся на ней HTML-элементы в выходную страницу. В нашем примере атрибут style устанавливает голубой цвет текста. При этом также интерпретируются элементы сценариев, расположенные между ограничителями <% %>. Этот код должен выполнять алгоритм, выдающий в качестве результата HTML-строки, которые ASP-процессор должен скопировать в выходную страницу в те места, где были элементы сценария. Результирующая страница, собранная из статических HTML-элементов и HTML, динамически сгенерированного сценарием, должна быть передана клиенту (рис. 3-4). Для простых задач ASP применять относительно легко, что является признаком качества этой
технологии.
<htM style="color:#0000FF;">
The time is: <Х =time %> on <Х =date %>
</html>
дер NFT — ПОЛНОСТЬЮпеределанная ASP,сохранившая ее лучшиеконцепции.дер NFT — ПОЛНОСТЬЮпеределанная ASP,сохранившая ее лучшиеконцепции.Рис. 3-3. Смешение кода и HTML в ASP.
дер NFT — ПОЛНОСТЬЮпеределанная ASP,сохранившая ее лучшиеконцепции.
дер NFT — ПОЛНОСТЬЮпеределанная ASP,сохранившая ее лучшиеконцепции.
По мере расширения Web и увеличения потребностей пользователей Web-разработчикам потребовались совершенствование двух ключевых свойств исполняющей среды: простоты программирования и качества выпол-
нения. ASP.NET и явилось таким усовершенствованием. ASP.NET
похожа на оригинальную ASP и большая часть кода может быть переведена на нее практически без изменений. Но внутренняя
реализация ASP.NET полностью переделана с тем, чтобы задействовать возможности .NET Framework. Вы обнаружите, что работает она лучше, рушится меньше и в ней проще программировать. И это приятно.
Рис. 3-4. Web-страница, созданная ASP после обработки смеси код/HTML, показанной на рис. 3-3.
Смесь HTML-элементов и сценарного кода может казаться логич- I ной, но ее чертовски трудно реализовывать и сопровождать, кроме простейших случаев. Поскольку код и данные должны и появляются в любом месте страницы, развитые средства разработки, подобные Visual Basic, не могут этого переварить, так что I никому не удастся создать среду разработки, полноценно поддерживающую ASP. Это значит, что писать ASP-код сложнее, чем другие виды кода, например приложения с пользовательским интерфейсом на базе форм Visual Basic. Я знаю, что я на этом I помешан.
ASP.NET отделяет HTML от алгоритмов, со- ваш,
коп от HTMLздавая фоновый код (code-behind). Вместо
того чтобы перемешивать HTML с кодом, вы
I пишете код в отдельном файле, на который есть ссылка на ASP- странице. Вы будете потрясены, насколько проще понять код, если убрать из него отвлекающий внимание HTML. Это все равно, как если ваше трехлетнее чадо вдруг перестанет орать, когда вы обсуждаете по телефону проблемы своих налогов. В результате такого разделения Microsoft смогла усовершенствовать среду разработки и отладки Visual Studio.NET, так что вы можете использовать ее при разработке Web-приложений.
В оригинальной ASP реализация ввода и вывода представляла сложности из-за невозможности отвлечься от HTML. Я имею в виду, что программист часто вынужден бороться с довольно не- шриглядными языковыми конструкциями HTML, вместо того чтобы думать о логике своей программы, а это не лучшее использование ресурсов. Скажем, получение данных из HTML-форм требует больше усилий, чем в настольных приложениях. Генерация выходной информации требует, чтобы программист собирал отдельные фрагменты HTML, а это опять же не то, на что программист должен тратить время. Чтобы написать код, показанный ниже (рис. 3-3), программисту нужно знать синтаксис HTML, позволяющий задать голубой цвет текста.
ASP.NET поддерживает Web Forms — архитектуру Web-страниц, делающую их программирование похожим на программирование форм настольных приложений. Вы добавляете на страницу управляющий элемент и пишете для него обработчик событий так же, как при написании настольного приложения на Visual Basic. Простота использования, сделавшая Visual Basic столь популярным, теперь доступна при построении Web-приложений. Как раз перед сдачей этой книги в печать я проводил занятия по первой бета- версии ASP-NET в группе бывалых ASP'ewhukob, и эта возможность заставила их буквально встать и зааплодировать.
В А5РМЕТ есть готовыеэлементы управлений,применяющиеся дляHTML-страниц так же,как элементы управле-ния Windows в наст оль-ных приложениях.В А5РМЕТ есть готовыеэлементы управлений,применяющиеся дляHTML-страниц так же,как элементы управле-ния Windows в наст оль-ных приложениях.Так же, как Visual Basic зависит от элементов управления Windows и элементов ActiveX сторонних производителей, Web Forms зависит от нового типа элементов управления — серверных элементов управления Web Forms (Web Forms Server Controls). В этой главе я буду для простоты называть их элементы управления Web. Это готовые фрагменты алгоритмов для реализации ввода и вывода, которые разработчик Iпомещает на ASP.N ЕТ-стра н и цы так же, как он поступал с формами для Windows-приложений. Эти элементы позволяют абстрагироваться от деталей работы с HTML, как Windows-элементы позволяли абстраг и роваться от GDI. Например, вам больше не нужно помнить синтаксис HTML для установки основного цвета и цвета фона для строки текста. Вместо этого вы будете использовать элемент управления «надпись» и писать код для работы с
В А5РМЕТ есть готовыеэлементы управлений,применяющиеся дляHTML-страниц так же,как элементы управле-ния Windows в наст оль-ных приложениях.
В А5РМЕТ есть готовыеэлементы управлений,применяющиеся дляHTML-страниц так же,как элементы управле-ния Windows в наст оль-ных приложениях.
его свойствами, как вы этона любом языке
насколько легче стало программировать
настольные приложения наBasic. Элементы управления
Web делаютWeb делаютASP,NET имеет еотовыесречства защитыприложений.ASP,NET имеет еотовыесречства защитыприложений.и для
Web делают
Web делают
ASP,NET имеет еотовыесречства защитыприложений.
ASP,NET имеет еотовыесречства защитыприложений.
Изначально ASP слабо
реализовать защиту гораздо проще. Работая в «чистой» Windows-среде, вы можете
ля что он тот, за кого себя выдает) автоматически, используя встроенные средства аутентификации Windows. Для большинства конфигураций, содержащих не только Windows- приложения, имеет готовые средства для создания собственных схем аутентификации. Кроме того, она поддерживает инициативу Microsoft Passport, если решите идти этим путем.
имеет новые функции управА©料ust ■ сеансами, лриеоднвс для многомашмн н ых^9-имеет новые функции управА©料ust ■ сеансами, лриеоднвс для многомашмн н ых^9-ASP поддерживала управление сеансами с помощью простого Главными
имеет новые функции управА©料ust ■ сеансами, лриеоднвс для многомашмн н ых
^9-
имеет новые функции управА©料ust ■ сеансами, лриеоднвс для многомашмн н ых
^9-
были невозможность распространить управление сеансами на более чем одну машину и прерывание при перезапуске процесса. расширяет
выполнять обе функции автоматически. Вы можете настроить для автоматического и последующего восстановления состояния сеанса или на машине (если вы хотите использовать более машины, но вас не интересует постоянное хранение этой или на Microsoft SQL Sewer.
имеет также много новых много
функции, облегчающихпериода выполнения. Первоначальная ASP
работу иинист-выполнялась медленнее, так как код сцена,интерпретировался во время выполнения.автоматически компилирует
страницы при их первоначальной установке или при первом обращении, чтоускоряет работу. Поскольку она
ет компиляцию по требованию, принятую вFramework, вам
не нужно останавливать сервер для замены компонента или страницы. Она такжеутилизацию процессов. Вместо
того чтобы оставлять процесс работающим бесконечно, ASP.NET можно настроить на автоматическое прекращение и повторный запуск серверного процесса после определенного периода времени или числа сбоев (эти значения настраиваются). Это снимает большинство проблем с утечкой памяти в пользовательском коде. Потенциально ASP.NET проще администрировать, так как все параметры хранятся в читабельном виде в самой иерархии каталогов ASP. К сожалению во время написания этой книги административные утилиты, облегчающие эту работу, находились в стадии разработки.
Простейший пример: создание простой страницы ASP.NET
Началодемоястра ционнойпрограммыASP.NET.Началодемоястра ционнойпрограммыASP.NET.Рассмотрим простейший пример ASP.NET (рис. 3-5). Он показывает текущее время на сервере (с секундами или без) и пользователь может выбрать цвет текста. Вы можете ска-
Началодемоястра ционнойпрограммыASP.NET.
Началодемоястра ционнойпрограммыASP.NET.
The шпе из l>w 14 33 00The шпе из l>w 14 33 00чать код с Web-сайта www.introducingmicrosoft.net и использовать его при обсуждении. На этом же сайте вы найдете и саму эту страницу и сможете исследовать ее поведение по мере того, как я буду рассказывать, что и как работает. Эту страницу вы легко установите на собственный ASP.NET-сёрвер.
The шпе из l>w 14 33 00
The шпе из l>w 14 33 00
ARE ♦ J』G 復5»小 _j' -r»tK »JM ‘
二”一 g) №tt»J—joKf53M“хо—г >1"ГЙ,■ 一出山、
P Shew Seconds ? GsrtFme i
;x3fnU5Bt;x3fnU5BtText См |0'w> *J
;x3fnU5Bt
;x3fnU5Bt
Рис. 3-5. Простейший пример ASP.NET.
Я слепил этот пример в Visual Studio.NET. Пытаясь написать примеры, не используя возможности среды разработки, я обнаружил, что Visual Stuclio.NET имеет столь мощную встроенную поддержку ASP.NET, что не задействовать ее — все равно, что писать в Блокноте настольные Win dows-n риложения на Visual Basic (хотя, конечно,, вы можете это делать, если ОЧЕНЬ этого хотите).
Ключ к пониманию этого примера — рассматривать вашу Web- страницу как форму Visual Basic. Я использую эту аналогию, так как предполагаю, что мои читатели с ним знакомы, но вы можете написать тот же код на любом другом языке Visual Studio.NET: С#, C + —или JScript. Я начал с создания проекта Web Application з Visual Studio.NET (рис. 3-6.) При этом, помимо всего прочего/ была создана ASP.NET-страиица WebForml .aspx. Затем с инструментальной панели я перенес на форму элементы управления Web (рис. 3-7), добавив флажок, кнопку, выпадающий список и несколько надписей. Затем установил свойства этих элементов управления, используя окно Properties в правом нижнем углу экрана Visual Studio.NET, указав текст для каждого элемента, размер шрифта для надписей и элементы в выпадающем списке. Я установил свойство AutoPostBdck выпадающего списка в True, чтобы форма автоматически пересылалась серверу, когда пользо- патеАь выберет новое значение в этом списке.
Nr« projectNr« projectК*трЫе»:К*трЫе»:&Х^0« Types:&Х^0« Types:
Nr« project
Nr« project
К*трЫе»:
К*трЫе»:
&Х^0« Types:
&Х^0« Types:
_J ”一 itesr k/G」/isud C# 3-oiect$宅」Visual 二 J Pr/ects_1 Setup 4ГЖ1 Depkiyment Pf o)ert$•」Otbgf A-OTWti口 ,№j. 53. 50Mxfq_J ”一 itesr k/G」/isud C# 3-oiect$宅」Visual 二 J Pr/ects_1 Setup 4ГЖ1 Depkiyment Pf o)ert$•」Otbgf A-OTWti口 ,№j. 53. 50MxfqWIci^owkApplicationWIci^owkApplicationWeb ServiceWeb ServiceW&b ControlLibraryW&b ControlLibraryЙ pr0jw:tfor d«ME:峭却屁#映!з Web us^lnterfvt?Й pr0jw:tfor d«ME:峭却屁#映!з Web us^lnterfvt?Raffle: :fWeSppikation7J*jBrowse-.,Raffle: :fWeSppikation7J*jBrowse-.,
_J ”一 itesr k/G
」/isud C# 3-oiect$
宅」Visual 二 J Pr/ects
_1 Setup 4ГЖ1 Depkiyment Pf o)ert$
•」Otbgf A-OTWti
口 ,№j. 53. 50Mxfq
_J ”一 itesr k/G
」/isud C# 3-oiect$
宅」Visual 二 J Pr/ects
_1 Setup 4ГЖ1 Depkiyment Pf o)ert$
•」Otbgf A-OTWti
口 ,№j. 53. 50Mxfq
WIci^owk
Application
WIci^owk
Application
Web Service
Web Service
W&b Control
Library
W&b Control
Library
Й pr0jw:tfor d«ME:峭却屁#映!з Web us^lnterfvt?
Й pr0jw:tfor d«ME:峭却屁#映!з Web us^lnterfvt?
Raffle: :fWeSppikation7
J*jBrowse-.,
Raffle: :fWeSppikation7
J*jBrowse-.,
牝 Bcawitt be created athgH/PEDKQOKESB^WiAfitjk^mf牝 Bcawitt be created athgH/PEDKQOKESB^WiAfitjk^mfРис. 3-6. Выбор Web Application в VisualStudio.NET.Рис. 3-6. Выбор Web Application в VisualStudio.NET.<X J ] CancelJ fcjeb<X J ] CancelJ fcjeb
牝 Bcawitt be created athgH/PEDKQOKESB^WiAfitjk^mf
牝 Bcawitt be created athgH/PEDKQOKESB^WiAfitjk^mf
Рис. 3-6. Выбор Web Application в VisualStudio.NET.
Рис. 3-6. Выбор Web Application в VisualStudio.NET.
<X J ] CancelJ fcjeb
<X J ] CancelJ fcjeb
WcMppbi ■ ■ I Ммто«Ы|,Ы|,(МЯГ.ЧГ ■*■«•»[ ■*•»**>!WcMppbi ■ ■ I Ммто«Ы|,Ы|,(МЯГ.ЧГ ■*■«•»[ ■*•»**>!&■ _ 魁》Buwu »<й 5м» !*«▼*•« : шк A*w* Fters [cdr Ek” 2&■ _ 魁》Buwu »<й 5м» !*«▼*•« : шк A*w* Fters [cdr Ek” 2I 疝 u - c?r Я 6? 丫 n 余• •I 疝 u - c?r Я 6? 丫 n 余• •• •<•■ WeliFumi 1 -aapa*• •<•■ WeliFumi 1 -aapa*A U卜.Tattj・A U卜.Tattj・WrbA0pi*C4ChinlWrbA0pi*C4Chinl嚇 “Afiu=5 q tae^t/iw勺 УИк№ПМ T L*ifio« ТЗГмЬ^И后wВ ChetMnvВ: С*«1еег»1л»:£ ЯЮЬПЛ^пЛЛ6 РосхвлпъCccisor^rcsМ^йм* 片《■嚇 “Afiu=5 q tae^t/iw勺 УИк№ПМ T L*ifio« ТЗГмЬ^И后wВ ChetMnvВ: С*«1еег»1л»:£ ЯЮЬПЛ^пЛЛ6 РосхвлпъCccisor^rcsМ^йм* 片《■VllttnnVllttnnfj1-:-- оfj1-:-- оУЛ(^1Н>*^УЛ(^1Н>*^I Hutton I tv t Att лп»к. • '•I Hutton I tv t Att лп»к. • '•
WcMppbi ■ ■ I Ммто«Ы|,Ы|,(МЯГ.ЧГ ■*■«•»[ ■*•»**>!
WcMppbi ■ ■ I Ммто«Ы|,Ы|,(МЯГ.ЧГ ■*■«•»[ ■*•»**>!
&■ _ 魁》Buwu »<й 5м» !*«▼*•« : шк A*w* Fters [cdr Ek” 2
&■ _ 魁》Buwu »<й 5м» !*«▼*•« : шк A*w* Fters [cdr Ek” 2
I 疝 u - c?r Я 6? 丫 n 余• •
I 疝 u - c?r Я 6? 丫 n 余• •
• •<•■ WeliFumi 1 -aapa*
• •<•■ WeliFumi 1 -aapa*
A U
卜.Tattj・
A U
卜.Tattj・
WrbA0pi*C4Chinl
WrbA0pi*C4Chinl
嚇 “Afiu=5 q tae^t/iw
勺 УИк№ПМ T L*ifio« ТЗГмЬ^И
后w
В ChetMnv
В: С*«1еег»1л»
:£ ЯЮЬПЛ^пЛЛ
6 Росхвлпъ
Cccisor^rcs
М^йм* 片《■
嚇 “Afiu=5 q tae^t/iw
勺 УИк№ПМ T L*ifio« ТЗГмЬ^И
后w
В ChetMnv
В: С*«1еег»1л»
:£ ЯЮЬПЛ^пЛЛ
6 Росхвлпъ
Cccisor^rcs
М^йм* 片《■
Vllttnn
Vllttnn
fj1-:-- о
fj1-:-- о
УЛ(^1Н>*^
УЛ(^1Н>*^
I Hutton I tv t Att лп»к. • '•
I Hutton I tv t Att лп»к. • '•
Рис. 3-7. Использование пан ел и инструментов
для перетаскивания элемента управления Web на форму.
Вы помещаете элементыуправления Web на свои.А$РХ*страницы, как на, форму Visual Basic.Вы помещаете элементыуправления Web на свои.А$РХ*страницы, как на, форму Visual Basic.и выбрав в контек-и выбрав в контек-Расположив свои элементы управления, мне нужно написать код, который их свяжет все вместе. При создании проекта Visual Studio.NE1 создала также класс для кода моейASP.NET-страниць/. Вы можете его увидеть, щелкнув правой кнопкой страницу
Вы помещаете элементыуправления Web на свои.А$РХ*страницы, как на, форму Visual Basic.
Вы помещаете элементыуправления Web на свои.А$РХ*страницы, как на, форму Visual Basic.
и выбрав в контек-
и выбрав в контек-
стном меню View Code, так же как вы это делаете сегодня с фор-
мами Visual Basic 6.0. Элементы управления Web инициирут события для своих форм, опять же аналогично с Visual Basic, так что мне нужно написать для них обработчики событий. Я могу добавить обработчик события, выбрав элемент упраеления в раскрывающемся списке в левом верхнем углу и событие в раскрывающемся списке в верхнем правом углу. Ниже приведен фрагмент
моего Visual Basic-класса (рис. 3-8), а весь код можно загрузить с сайта этой книги. В этом простом примере, когда кнопка инициирует событие Click, я изменяю свойство текста надписи, показывающей текущее время. Я также добавил обработчик для события SelectedlndexChanged выпадающего списка. Когда пользе-
ватель вьгбирае! цвет из выпадающего списка, я устанавливаю свойство цвета надписи разным значению, выбранному пользователю. При построении проекта Visual Studio.NET автоматически располагает его в корневом каталоге Web на моей машине,
Public Class WebForml
Inherits System.Web.UI.Page
' Пользователь нажал кнопку. Получаем время и отображаем ' его в элементе управления "надпись".
Public Sub Butto1l^Click(ByVal sender As Object,— ByVai e As System.EventArgs)
If CheckBoxI,Checked = Then
Labell.Text "The time is now “ +
now.ToLongTimeString
Else
Labell.Text"The time is now " + _
now.ToShortTimeString End If
End Sub
Пользователь выбрал другой цвет из списка.
' Изменяем цвет надписи в соответствии ' с выбором пользователя.
Protected Sub Drop0ownList1„Select6dIndexChanged(8yVal _ sender As System.Object, _
ByVal e As System.EventArgs) _
Handles DropDownListl.Selectedlndexchanged Label1(=
Color.FromName(DropDownListl( ).Selectedltern.Text) End Sub
End Class
Рис. 3-8. Фрагмент кода для страницы WebForm 1.ASPX.
Обработчики событийэлементовуправленияпишутся так *е, какдляформ Visual Basic.Обработчики событийэлементовуправленияпишутся так *е, какдляформ Visual Basic.ется окно браузера.ется окно браузера.Теперь, закончив писать код, я хочу увидеть его в действии Простейший способ это сделать — щелкнуть правой кнопкой страницу и выбрать в контекстном меню Build and Browse. В результате в среде Visual Studio.NET откро- Когда браузер (или любой другой клиент) зап-
Обработчики событийэлементовуправленияпишутся так *е, какдляформ Visual Basic.
Обработчики событийэлементовуправленияпишутся так *е, какдляформ Visual Basic.
ется окно браузера.
ется окно браузера.
рашивает .ASРХ-страницу, IIS загружает ее в исполняющее ядро
Исполняющее ядровызываетсУ генерируетHTML из ее элементовуправления и кода.Исполняющее ядровызываетсУ генерируетHTML из ее элементовуправления и кода.котороеанализирует страницу.раз встретив страницу, ядро ком
Исполняющее ядровызывает
с
У генерирует
HTML из ее элементов
управления и кода.
Исполняющее ядровызывает
с
У генерирует
HTML из ее элементов
управления и кода.
пилирует ее код. Последующие запросы же страницы приведут к загрузке и
нию этого скомпилированного кода. Затем ядроскомпилированный код класса, создавая элементы управленияко-
торые я поместил на форму. Элементы управления работают только на сервере, создавая HTML, отображающий их текущее
состояние, которыйв страницу, передаваемую
енту. Ядро также исполняет код обработчиков событий и
ет соответствующий HTML. Результирующий HTML передается
клиенту, в результате чего получается показанная выше ца (рис. 3-5).
Вот и все. Гораздо проще, чем соА5Р.
Ещеоб управляющих
элементах Web
Элементы управления Web — детище той же философии, что легла в основу создания пользовательского интерфейса Windows лет назад. Та архитектура сделала Билласамым бога
тым человеком в мире (на момент написания этой книги, хотя сейчас это, может быть, уже и неесли на фондовом рынке
произошли перемены). Это и есть мое определение успешной архитектуры — насчет вас не знаю.
Управляющее элементаслужат для инкапсуляциимногократно примени-мой программнойимеющей делос пользовательскиминтерфейсом.Управляющее элементаслужат для инкапсуляциимногократно примени-мой программнойимеющей делос пользовательскиминтерфейсом.Операции повторяются часто.
Управляющее элементаслужат для инкапсуляциимногократно примени-мой программнойимеющей делос пользовательскиминтерфейсом.
Управляющее элементаслужат для инкапсуляциимногократно примени-мой программнойимеющей делос пользовательскиминтерфейсом.
Сделать их готовыми обернуть в оболочку, которую сможет использовать любой программист, — прекрасная идея. Вы, ребятки, не знаете, какие вы счастливчики, что вам не надо беспокоиться о например, собственной кнопки и по пикселю ее разри-
совывать, чтобы отличить нажатую от отжа-
той. Это не только экономит колоссальное количество дорогого
но и делает пользовательский интерфейс каждой программы более согласованным и, более понятным. Помните (л хорошо помню) Windows 3.0, в которой не было стан-
дартиого диалогового окна для открытия файла? Каждый прикладной программист должен был придумывать свое собственное. Это дорого стоило, и все прикладные реализации немного (или значительно) отличались. В Windows 3.1 диалоговое окно открытия файла стало частью ОС, что облегчило жизнь программистов и пользователей. В ASP.NET элемент управления Web — это любой алгоритм, связанный с пользовательским интерфейсом, который способен: а) показывать свою программную модель среде разработке, такой как Visual Studio.NET, и 6) переводить свое представление в HTML для отображения в любом стандартном браузере (примерно так же, как элемент управления Windows переводит свое представление в последовательность вызовов Windows GDI).
/; Элементы управленияWeb богаче, многочис-леннее и п(х)1це дляпрограммирование/ чемстандартней© элементыуправления n i ml./; Элементы управленияWeb богаче, многочис-леннее и п(х)1це дляпрограммирование/ чемстандартней© элементыуправления n i ml.«Но в HTML ужеесть элементы управления, - скажете вы. — Кнопки, флажки и ссылки. Я их все время использую. Зачем мне изучать новые?» HTML поддерживает несколько элементов управления, которые являются частью языка, но здесь есть жесткие ограничения. Во-первых, они не столь многочисленны,
/; Элементы управленияWeb богаче, многочис-
леннее и п(х)1це дляпрограммирование/ чемстандартней© элементы
управления n i ml.
/; Элементы управленияWeb богаче, многочис-
леннее и п(х)1це дляпрограммирование/ чемстандартней© элементы
управления n i ml.
и возможности их не так богаты. Пока дело не пошло чуть дальше редактируемого поля и выпадающего списка. Сравните их количество с тем, что рекламируется в Visual Basic Programmers journal, или их функциональность с сеткой, привязанной к данным в Visual Basic. Хотелось бы иметь гораздо больше функцио-
нальности, чем предоставлено этими несчастными элементами управления HTML. Во-вторых, для них трудно писать код. Возможность взаимодействия с ними в период выполнения ограничена. Среда Web Forms, в которой существуют элементы, имеет управляемую событиями программную модель, подобную Visual Basic. Их гораздо проще программировать, они лучше поддерживаются средами разработки и позволяют абстрагироваться от многих различий между разными браузерами. Web-элементы делают больше и программируются проще. Для меня это главное.
ASP.NE1 поставляется с набором основных следующих элементов (табл. 1). Я предполагаю, что после реализации программной модели сторонние поставщики разработают и представят на рын-
Элементы управленияVVeb имеются для мно-гих различных функций.Элементы управленияVVeb имеются для мно-гих различных функций.ке Web-элементы для всех мыслимых задач, как это произошло с элементами управления ActiveX, Вы можете написать их и сами, это не очень сложно (к сожалению, в этой редакции книги речь об этом не пойдет).
Элементы управленияVVeb имеются для мно-гих различных функций.
Элементы управленияVVeb имеются для мно-гих различных функций.
Табх 3・1. Функции элементов управления Web.
Функция
Элемент
Описание
Отображение текста
(толькочтение)
Label
Отображает текст, который пользователь не может редактировать.
Редактирование текста
TextBox
Отображает текст, введенный в период разработки, который может быть отредактирован пользователем в период выполнения или изменен программно.
Примечание: хотя некоторые другие элементы тоже позволяют пользователям редактировать текст (например, DropDownList), обычно их основное назначение — не редактирование текста.
Выбор из списка
DropDownList
ListBox
Позволяет пользователю выбрать значение из списка или ввести текст.
Отображает список вариантов выбора. Может позволять выбирать несколько значений.
Отображение
Image
Выводит изображение.
графики
Ad Rotate г
Выводит последовательность (предопределенную или случайную) изображении.
Установка значения
CheckBox
RadioButton
Отображает окошко, щелкнув которое, пользователь устанавливает или сбрасывает значение. Кнопка-переключатель, может быть установлена/сброшена.
Установка даты
Calendar
Отображает календарь, позволяя пользователю выбрать дату.
(см. след. стр.)
Табл. 31 (продолжение)
Функция
Элемент
Описание
Команды
Button
Применяется для выполнения той или иной задачи.
LinkButton
Работает как Button, но выглядит как гиперссылка.
ImageButton
Работает как Button, но вместо текста содержит изображение.
Управление навигацией
HyperLink
Создает навигационную Web-ссылку.
Таблицы
Table
Создает таблицу.
TableCell
Создает отдельную ячейку в строке таблицы.
Table Row
Создает строку в таблице.
Группирование других элементов
CheckBoxList
Создает набор элементов CheckBox.
Panel
Создает на форме панель без рам-
ки, применяемую в качестве контейнера для других элементов управления.
RadioButtonList Создает группу кнопок-переключателей. Внутри этой группы может быть выбран только один переключатель.
СпискиСпискиRepeaterRepeaterDataListDataListDataGridDataGridОтображает информацию из набора данных, используя набор указанных HTML-элементов и элементов управления для каждой записи из набора данных.Подобен Repeater, но с большими возможностями форматирования и позиционирования, включая возможность отображения информации в таблице. Позволяет также определить возможности редактирования,Отображает информацию в табличной форме. Обычно имеет привязку к данным.Отображает информацию из набора данных, используя набор указанных HTML-элементов и элементов управления для каждой записи из набора данных.Подобен Repeater, но с большими возможностями форматирования и позиционирования, включая возможность отображения информации в таблице. Позволяет также определить возможности редактирования,Отображает информацию в табличной форме. Обычно имеет привязку к данным.
Списки
Списки
Repeater
Repeater
DataList
DataList
DataGrid
DataGrid
Отображает информацию из набора данных, используя набор указанных HTML-элементов и элементов управления для каждой записи из набора данных.
Подобен Repeater, но с большими возможностями форматирования и позиционирования, включая возможность отображения информации в таблице. Позволяет также определить возможности редактирования,
Отображает информацию в табличной форме. Обычно имеет привязку к данным.
Отображает информацию из набора данных, используя набор указанных HTML-элементов и элементов управления для каждой записи из набора данных.
Подобен Repeater, но с большими возможностями форматирования и позиционирования, включая возможность отображения информации в таблице. Позволяет также определить возможности редактирования,
Отображает информацию в табличной форме. Обычно имеет привязку к данным.
Исполняющее ядроиэлементынаИсполняющее ядроиэлементыная расположил элементына
Исполняющее ядрои
элементы
на
Исполняющее ядрои
элементы
на
форме, Visualсгенерировала наоператоры (рис. 3-9).
Каждый оператор, начинающийся с
это синтаксическому анализатору
ASP.NET создать элемент управления указанного когда он будет генерировать файл класса для в ответ на оператор анализатор создает в классе элемент
Элементыформиру ют собствен- для клиента.Элементыформиру ют собствен- для клиента.При выполнении страницы испол- ASP.NET исполняет код обра- событий, который взаимодействует с элементом (устанавливая время и цвет тек-
Элементы
формиру ют собствен- для клиента.
Элементы
формиру ют собствен- для клиента.
Page
"WebForml*aspx,vb" Inherits="WebApplication1.WebForml"X>
<html>
<body>
<form id=”WebFo「m1” method=”post” runat'"server">
<asp:Label id=Label1 runat="server" forecolor="Black"> будет отображаться здесь)
</asp: Labelx/p>
id=CheckBox1
Seconds
Time" />
<asp: DropDownList id=DropDownList1 runat=T,server" autopostback=,rT rue">
Item
</asp: Listltein>
<asp:Listitem Value="Red">Red</asp:Listltem>
<asp:Listltem Value="Green">Green</asp:Listltem>
<asp: Listltem Value="Blus,,>Blue</asps Listltem>
</asp:
</form>
</body>
</html>
Рис. 3-9. Фрагмент
Visualс операторами элементов управления.
5—1760
ста) (рис. 3-8). В завершение ядро указывает каждому элементу, чтобы он сформировал для себя HTML в соответствии с текущими свойствами, так же как элемент управления Windows формирует для себя вызовы GDI в соответствии со своими текущими свойствами. Затем ядро передает результирующий HTML на клиентский браузер. Ниже представлена схема процесса (рис. 3-10), а затем — фрагмент реального HTML, посылаемого клиенту (рис. 3-11).
1 ,Клиен1 запрашивает2. Запрос переправляется1 ,Клиен1 запрашивает2. Запрос переправляетсяРис. 3-10. Последовательность обработки ASPX-страницы ядром.Рис. 3-10. Последовательность обработки ASPX-страницы ядром.
1 ,Клиен1 запрашивает2. Запрос переправляется
1 ,Клиен1 запрашивает2. Запрос переправляется
Рис. 3-10. Последовательность обработки ASPX-страницы ядром.
Рис. 3-10. Последовательность обработки ASPX-страницы ядром.
Элементы управленийдля воода могут управ-лять своим содержимыми состоянием междупередачами.Элементы управленийдля воода могут управ-лять своим содержимыми состоянием междупередачами.Другая прекрасная возможность элементов управления для ввода (списков, полей редактирования, флажков, кнопок-переключателей и т. д.) — это их способность автоматически запоминать состояние, в котором они были до передачи на сервер. Microsoft называет
Элементы управленийдля воода могут управ-лять своим содержимыми состоянием междупередачами.
Элементы управленийдля воода могут управ-лять своим содержимыми состоянием междупередачами.
эту возможность регистрацией ответныхданных fpostback data), Допустим, сервер посылает браузеру страницу, содержащую сброшенный флажок. Затем человек, работающий с браузером,
устанавливает этот флажок и отправляет форму серверу. Если сервер обрабатывает форму и ее же отправляет клиенту, флажок автоматически не запомнит свое состояние. Разработчику сервера придется писать код, который будет обеспечивать соответ-
ствие состояния флажка тому, что было при передаче от клиента. Элементы управления для ввода не требуют написания такого кода — они автоматически запоминают свое предыдущее состояние в пределах сеанса (подробнее об этом я расскажу ниже). На самом деле данные хранятся в выделенном поле заголовка HTTP. Это автоматическая функция, которую вы не можете отключить.
<span id=”LabeIT style=,,color: Black;">
(время отображается здесь)
</span>
<span>
<input type'''checkbox" id="CheckBox1" nam®=”CheekBox1” />
<label for="CheckBox1">Show Seconds ?</label>
</span>
<input type="submit" name="Button1" value="Get Time" id="Buttonr' />
<p>Text Color:
<select name="DropDownList1" id=" D ropDown Listl *'
onchange=”]avascnpt:—doPostBack(" DropDownListl',' ' )">
<option selected уа1ие="Black">BLack</optlon>
<option value="Red">Red</option>
<option value="Green">Green</option>
〈option value="Blue''>Blue</option>
</select>
Рис. 3-11. Фрагмент HTML, сгенерированного
элементом управления.
Отображающие элементы управления Web, такие как надписи, списки и сетки данных поддерживают собственную версию фиксации своих свойств — состояние отображения
Отображающие элементь! управления также поддерживают свое состояние от
[view state). Хотя пользователи и не могут ус- , передачу к передаче, тановить их параметры, они все равно запо-
Iминают состояние, в котором их оставила программа при преды-
Iдущей передаче. Среда ASPX-страниц автоматически помещает скрытый элемент для ввода—VIEWSTATE на каждую страницу. Элементы Web автоматически сохраняют свое состояние в этом
скрытом элементе при уничтожении страницы и восстанавливают его при последующем создании страницы, а это то, что вам чаще всего и нужно. Можно отключить эту возможность, установив свойство MaintainState элемента управления в False.
Зачем Microsoft использует два разных механизма управления состоянием элементов для ввода и отображающих элементов? Наверное, чтобы облегчить программистам возможность реали- зации Принципа Минимизации Шока, который гласит, что шокировать пользователя — нехорошо, так что делать это нужно как можно реже. Вводя что-то в поле, пользователь рассчитывает, что это останется у него перед глазами, пока он сам что-то не изменит. Если элемент управления для ввода не будет автоматически поддерживать свое состояние, соответствующий алгоритм叩и дется реализовывать разработчику, иначе пользователь будет в шоке. Поскольку делать это нужно всегда, Microsoft встроила эту функциональность в элемент управления для ввода и не предоставила возможности ее отключения. С другой стороны, отображающие элементы показывают не то, что ввел пользователь. Обычно они отображают результаты вычислительных операций. Иногда вы захотите, чтобы отображающий элемент запоминал свое состояние между операциями, а иногда — нет. Отсюда дополнительный механизм — с возможностью отключения.
Элементы Web могут также определять конкретный браузер, на котором пользователь будет смотреть страницу, что позволяет им формировать HTML, использующий преимущества различных браузеров. Хороший пример — проверка попадания в диапазон (рис. 3-12). Проверять, находится ли введенное пользователем значение между некоторыми минимальным и максимальным значениями приходится так часто, что Microsoft создала для этих целей элемент управления Web. Вы помещаете его на форму и устанавливаете свойства, указывающие, откуда брать проверяемое. а также минимальное и максимальное значения. Формируя свой HTML, элемент управления проверяет версию браузера, на который будет передаваться страница, Если это новый браузер, поддерживающий DHTML (если точнее — MSDOM 4.0 или более позднюю версию и EcmaScript версии 1.2), элемент формирует HTML, включающий клиентский сценарий, который будет прове-
Элементы управленияWeb могут аетома*тически определятьцелевойбраузериформировать для негооптимадьньш код.Элементы управленияWeb могут аетома*тически определятьцелевойбраузериформировать для негооптимадьньш код.Рис.3-12, Элементуправления АЛЯ проверки вхождения в диапазон.Рис.3-12, Элементуправления АЛЯ проверки вхождения в диапазон.
Элементы управленияWeb могут аетома*тически определятьцелевойбраузериформировать для негооптимадьньш код.
Элементы управленияWeb могут аетома*тически определятьцелевойбраузериформировать для негооптимадьньш код.
Рис.3-12, Элементуправления АЛЯ проверки вхождения в диапазон.
Рис.3-12, Элементуправления АЛЯ проверки вхождения в диапазон.
рять, что пользователь вводит только цифры, прежде чем форма будет отослана серверу. Это предотвращает лишние передачи по сети, в случае ввода пользователем неверных данных. Если данные проходят проверку на клиенте, форма передается на сервер. Затем та же операция проверки повторяется на сервере, хотя она уже прошла на клиенте. Таким образом гарантируется, что эта проверка всегда будет осуществлена перед запуском серверного кода, даже если клиентский сценарий искорежится на каком- нибудь чокнутом браузере. Если же элемент обнаруживает старый браузер, не поддерживающий DHTML, он автоматически генерирует HTML-код без клиентского сценария.
Вы без особых хлопотможете написатьсобственные элементыуправления Web.Вы без особых хлопотможете написатьсобственные элементыуправления Web.
Вы без особых хлопотможете написатьсобственные элементыуправления Web.
Вы без особых хлопотможете написатьсобственные элементыуправления Web.
Написать свои элементы управления Web несложно, поскольку .NET Framework содержит готовые базовые классы, от которых вы можете унаследовать нужную элементу инфраструктуру (типа MFC на анаболиках). При-
мер, к сожалению, в этой книге не рассматривается.
Управление и настройка проектов
Web-приложений: файлWeb.config
Мощная 1К:П<)ДНЯЮШЛЯсреда гкх^бшя АЗР NETтребует превосходнь!хсредств настройки.Мощная 1К:П<)ДНЯЮШЛЯсреда гкх^бшя АЗР NETтребует превосходнь!хсредств настройки.Мощная исполняющая среда, подобная ASP NET, содержит массу готовых служб. Как вы догадываетесь, любое отдельное приложение имеет уйму параметров. Механизмы
Мощная 1К:П<)ДНЯЮШЛЯсреда гкх^бшя АЗР NETтребует превосходнь!хсредств настройки.
Мощная 1К:П<)ДНЯЮШЛЯсреда гкх^бшя АЗР NETтребует превосходнь!хсредств настройки.
настройки среды важны не меньше самих алгоритмов, лежащих в ее основе. Пользы от крутых функций, которые вы не можете настроить или не понимаете как настрочи тьу столько же, сколько от венчальных клятв Билла Клинтона,
ПРЕДУПРЕЖДЕНИЕ: подробности, описываемые в данном разделе, подвержены влиянию изменений при последующих выпусках продукта.
ASP.NET держи: конфи-Существовавшие до сих пор исполняющие
гурационную информа- cpegbi использовали для хранения конфигу- цию в отдельных файлах рационной информации централизованные : именами web. config.хранилища. Так, классическая СОМ использо
вала системный реестр, а СОМ+ — соответствующий каталог. В ASP,NET применяется децентрализованный подход. Каждое приложение хранит управляющую конфигурационную информацию ASP.NET в файле web.config в собственном каталоге приложения. Каждый файл содержит конфигурационную информацию в виде XML. Ниже вы видите фрагмент файла web.config для нашего примера (рис. 3-13), который показывает параметры компиляции и обработки пользовательских ошибок. Другие параметры мы обсудим далее в этой главе.
Файлы web.config могут также располагаться в разных подкаталогах приложения. Каждый файл web.config управляет операциями со страницами в данном каталоге и нижних подкаталогах, если там он не переопределяется. Записи, сделанные в web.config нижнего уровня переопределяют записи на предыдущем уровне. Кому-то это кажется противоестественным, кому-то — нет. Главный файл, определяющий умолчания для всей системы ASP.NET называется machine.config и лежит в каталоге [система, например, WINNT ]\Microsoft.N ET\Framework\| версия]. Записи, сделанные в файлах web.config в корневых каталогах отдельных Web-прило-
жений переопределяютзаписи, сделанные з главном файле. Записи файловweb.config в подкаталогах приложения переопределяют записи в корневом каталоге {рис. 3-14). При желании администратор может пометить записи как непереопределяемые.
<?xml version="1.О'* encoding=wutf-8" ?>
<configuration>
<system.web>
<!- DYNAMIC DEBUG COMPILATION
Set compilation debug-"true,r to enable ASPX debugging. Otherwise, setting this value to false will improve runtime performance of this application.
->
<compilation defaultLanguage="vb" debugs,'true" />
<!- CUSTOM ERROR MESSAGES
Set customErrors mode="0n” or "RemoteOnly" to enable custom error messages, "Off" to disable. Add <error> tags for each of the errors you want to handle.
->
<customErrors mode=,,RelтlOte0nly,^ />
“system web>
</canfiguration>
Рис. 3-13. Фрагмент файла web.config для программы-примера.
Все разделы файла web.config настраиваемы на всех уровнях подкаталогов. Так, раздел <sessionstate> может отсутствовать везде, кроме корневого каталога. Вам нужно будет проверить все отдельные разделы, чтобы определить степень детализации каждого.
у eадминистративныеутилиты go cux порв провесе разработки.у eадминистративныеутилиты go cux порв провесе разработки.На момент написания книги эту схему конфигурирования использовать трудно. Простои XML-файл можно редактировать любым редактором или с помощью Visual Studio. NETZ где есть утилита чуть получше (puc. 3-15). Но
у e
административныеутилиты go cux порв провесе разработки.
у e
административныеутилиты go cux порв провесе разработки.
eCi далеко до других административных утилит Windows 2000, таких как СОМ+ Explorer. Команда разработчиков ASP.NET под-
тверждает необходимость разработки лучшей утилиты, но они считают, что должны сначала закончить функциональную часть
продукта, а потом писать административные утилиты, даже если их придется поставлять с задержкой после выхода самого продукта. Хотя я и возражаю против этого (вежливо, но твердо), могу вас заверить, что проблема будет решена. Я видел некоторые прототипы, над которыми работают в Microsoft, и они очень даже ничего. Хотя основные решения еще обсуждаются и график выпуска не представлен, я убежден, что команда ASP.NET осознала, что хорошие средства администрирования критически важны для успеха продукта на рынке. Надеюсь, их выпуск не задержится после выхода .NET Framework. Я гарантирую, что к тому времени, когда начнутся поставки административных утилит, сама платформа еще не исчезнет.
Рис.3-14. Иерархическая природа файлов web.config.
生融 View proiect Jpkl QebuQ 照 Hook 4!^r>dow Xc生融 View proiect Jpkl QebuQ 照 Hook 4!^r>dow XcD«ta Tabes;D«ta Tabes;—;—;■卄—A* ♦.5■卄—A* ♦.5]autbiorGation j trace se<sion5tate :IbttpHandterf add hiobalizatlOR]autbiorGation j trace se<sion5tate :IbttpHandterf add hiobalizatlORWeb.confHj 'Web.confHj '[Kat. lor authentkatMMi[Kat. lor authentkatMMisy$tem.web_tdsy$tem.web_td
生融 View proiect Jpkl QebuQ 照 Hook 4!^r>dow Xc
生融 View proiect Jpkl QebuQ 照 Hook 4!^r>dow Xc
D«ta Tabes;
D«ta Tabes;
—;
—;
■卄—A* ♦.5
■卄—A* ♦.5
]autbiorGation j trace se<sion5tate :IbttpHandterf add hiobalizatlOR
]autbiorGation j trace se<sion5tate :IbttpHandterf add hiobalizatlOR
Web.confHj '
Web.confHj '
[Kat. lor authentkatMMi
[Kat. lor authentkatMMi
sy$tem.web_td
sy$tem.web_td
РисЗ-15,Утилитаредактирования конфигурационных файлов
в Visual Studio.NETеще сырая.
Управление состоянием в ASENET
Запросы, выдаваемыеодним 门 а人 ьзоЕатепам,могут быть не связаныдруг с другом. Иногдаэто хорошо.Запросы, выдаваемыеодним 门 а人 ьзоЕатепам,могут быть не связаныдруг с другом. Иногдаэто хорошо.По умолчанию запросы Web-страниц не зависят друг от друга. Если я запрашиваю с сервера страницу Б, содержимому этой страницы неизвестно, просматривал ли я перед этим страницу А. Такой механизм хорошо работает для простых запросов только на
Запросы, выдаваемыеодним 门 а人 ьзоЕатепам,могут быть не связаныдруг с другом. Иногдаэто хорошо.
Запросы, выдаваемыеодним 门 а人 ьзоЕатепам,могут быть не связаныдруг с другом. Иногдаэто хорошо.
чтение, как в примере с кинотеатром, который я приводил в начале главы. Сервер, реализующий такой механизм, легко напи-
сать, так как не нужно хранить данные от запроса к запросу.
Но при более развитомвзаимодействии этоможет быть плохо, ,Но при более развитомвзаимодействии этоможет быть плохо, ,Однако по мере усложнения взаимодействия в Web такая конструкция перестает удовлетворять потребности пользователей. Мои дей- стви” на странице А должны оказывать воз-
Но при более развитомвзаимодействии этоможет быть плохо, ,
Но при более развитомвзаимодействии этоможет быть плохо, ,
я хочу заказатья хочу заказатьдействие на содержимое страницы Б. Скажем,
я хочу заказать
я хочу заказать
билеты на самолет прямо на Web-сайте авиакомпании, так как они предоставляют скидки постоянным клиентам. Для меня неприемлемо искать прямой рейс, выписывать его на бумажке, затем искать обратный, выписывать его тоже, а затем вручную вводить
номера обоих рейсов на совсем другой странице, чтобы купить билет. Я хочу, чтобы caui авиакомпании автоматически запоминал, какой прямой рейс я выбрал, когда я выбираю обратный и 1помнил оба, когда я покупаю билет.
Web-программистызачастую должны управ-ля 『甘 отдельными даннььми для многих пользо-вателей одновре^нно.Web-программистызачастую должны управ-ля 『甘 отдельными даннььми для многих пользо-вателей одновре^нно.Запоминание данных при переходе от одной формы к другойникогда не было проблемой для настольных приложений, рассчитанных на одного пользователя. Программисту НуЖ' нопросто хранить входные данные во внутренней памяти программы, не заботясь о том,
Web-программистызачастую должны управ-ля 『甘 отдельными даннььми для многих пользо-вателей одновре^нно.
Web-программистызачастую должны управ-ля 『甘 отдельными даннььми для многих пользо-вателей одновре^нно.
какому пользователю они принадлежат, так как в каждый отдель- Iный момент программу использует один человек. Но отслеживать пользовательские действия на многих страницах Web-приложе- Iния, к которому одновременно обращаются (как вам бы хотелось) многие, гораздо сложнее. Web-программист должен отделять мои данные от данных других пользователей, чтобы не перепутать наши рейсы (правда, если я неожиданно улечу на Гавайи в феврале, это будет здорово!). Мы называем это управлением сеан- COMf и Web-программисту нужны для этого эффективные и про-
стые средства.
ASP МЕТ позволяетхранить данные, привя-занные к конкретномупользозателю в объектеSession.ASP МЕТ позволяетхранить данные, привя-занные к конкретномупользозателю в объектеSession.Старая ASP обеспечивает простой механизм управления сеансами, который поддержан и расширен в ASP.NET. При каждом обращении к .AS РХ -стра н и це AS Р, N ЕТ создает внутренний объектSession (сеанс). Это набор данных, который живет на сервере и привязан
ASP МЕТ позволяетхранить данные, привя-занные к конкретномупользозателю в объектеSession.
ASP МЕТ позволяетхранить данные, привя-занные к конкретномупользозателю в объектеSession.
к конкретному активному пользователю. Web-программист может хранить в объекте Session любые интересующие его типы данных. Этот объект автоматически запоминает (помещая уникальный идентификатор в cookie-файл браузера или добавляя его в URL),
I к какому пользователю относятся данные, так что программисту не нужно писать для этого код. Скажем, когда я передаю форму с выбранным рейсом, программист страницы .ASPX может сохранить сведения о нем в объекте Session. Исполняющая среда ASPX знает, кто является пользователем (я), так что программа автоматически выдаст мой рейс, а не чей-то еще (рис. 3-16). Объект Session может хранить произвольное число строк для каждого
пользователя, но поскольку все они используют серверную па-
мять, советую ограничить объем хранимых данных, связанных с сеансом минимально необходимым.
.Клиентский браузер1. Клиент запрашивает , первую страницу..Клиентский браузер1. Клиент запрашивает , первую страницу.Cookie-файлус идентификатором сеансаCookie-файлус идентификатором сеансаКлиент запрашивает вторую страницу, передавая cookie-файл,Клиент получает вторую. страницу, информация < на которой соответствует FOMy, что 6еа。на первой.Клиент запрашивает вторую страницу, передавая cookie-файл,Клиент получает вторую. страницу, информация < на которой соответствует FOMy, что 6еа。на первой.СерверСервер получает запрос, создает объект SessionИ сохраняет cookie-файл на клиенте.Программист сохраняет данные в объекте Session.Сервер выбирает объект Session, на основании cookie-файла.Программист выбирает— данные из обт»екта Session. Чудесным образом они являются данными нужного пользователя.СерверСервер получает запрос, создает объект SessionИ сохраняет cookie-файл на клиенте.Программист сохраняет данные в объекте Session.Сервер выбирает объект Session, на основании cookie-файла.Программист выбирает— данные из обт»екта Session. Чудесным образом они являются данными нужного пользователя.СеансыСеансы
.Клиентский браузер
1. Клиент запрашивает , первую страницу.
.Клиентский браузер
1. Клиент запрашивает , первую страницу.
Cookie-файлу
с идентификатором сеанса
Cookie-файлу
с идентификатором сеанса
Клиент запрашивает вторую страницу, передавая cookie-файл,
Клиент получает вторую
. страницу, информация < на которой соответствует FOMy, что 6еа。на первой.
Клиент запрашивает вторую страницу, передавая cookie-файл,
Клиент получает вторую
. страницу, информация < на которой соответствует FOMy, что 6еа。на первой.
Сервер
Сервер получает запрос, создает объект Session
И сохраняет cookie-файл на клиенте.
Программист сохраняет данные в объекте Session.
Сервер выбирает объект Session, на основании cookie-файла.
Программист выбирает
— данные из обт»екта Session. Чудесным образом они являются данными нужного пользователя.
Сервер
Сервер получает запрос, создает объект Session
И сохраняет cookie-файл на клиенте.
Программист сохраняет данные в объекте Session.
Сервер выбирает объект Session, на основании cookie-файла.
Программист выбирает
— данные из обт»екта Session. Чудесным образом они являются данными нужного пользователя.
Сеансы
Сеансы
ДанныепользователяАДанныепользователяАДанныепользователяБДанныепользователяБ
ДанныепользователяА
ДанныепользователяА
ДанныепользователяБ
ДанныепользователяБ
Другие пользователи...
Рис. 3-16. Управление сеансом.
ASP-NET предоставляетпростой API дляустановки и получениясеансовых переменно*ASP-NET предоставляетпростой API дляустановки и получениясеансовых переменно*Это легко реализуемые и потому популярные функции. Каждая ASPX-страница имеет свойство с именем Session, которое дает доступ к объекту Session текущего пользователя. Вы храните данные в этом объекте в виде строк
ASP-NET предоставляетпростой API дляустановки и получениясеансовых переменно*
ASP-NET предоставляетпростой API дляустановки и получениясеансовых переменно*
и соответствующим образом их выбираете. Взгляните на пример кода, который это делает (рис. 3^17). Этот пример вы также найдете на Web-сайте книги. Эти страницы также показаны ниже (рис. 3-18).
ASP.NET автоматическиудаляет сеансы послезаданного интервалавремени.ASP.NET автоматическиудаляет сеансы послезаданного интервалавремени.Естественно, если сервер поддерживал бы непрерывный сеанс для каждого пользователя, даже если бы тот смотрел всего одну стра- ни 4% ресурсы памяти быстро бы истощились. Механизм сеансов разработан для уп*
ASP.NET автоматическиудаляет сеансы послезаданного интервалавремени.
ASP.NET автоматическиудаляет сеансы послезаданного интервалавремени.
равления состоянием только активных пользователей, т. е. тех,
кому требуется, чтобы сервер управлял их состоянием. ASP.NET автоматически удаляет объект Session пользователя, сбрасывая его содержимое, если пользователь не проявляет активности в течение некоторого времени. Этот интервал устанавливается в разделе < sessionstate > файла web.config (рис. 3-19). Вы можете также сами сбросить сеанс, вызвав метод SessionAbandon.
Код для сохранения данных сеанса.
Protected Sub Button1_Click(ByVai sender As System.Object, 一 ByVai e As System.EventArgs) _ Handles Buttonl.Click
' Сохраняем текущую текстовую строку.
SessionC"DemoString") =
' Перенаправляем пользователя на другую страницу.
ResponseC).RedirectCWebForm2. aspx")
End Sub
Код, получающий данные о сеансе.
Protected Sub Page_Init(ByVal Sender As System.Object» - ByVal e As System.EventArgs) _ Handles MyBase.Init
'CODEGEN: This method call is required by the Web Form Designer.
'Do not modify it using the code editor.
InitializeComponent( )
Выбираем строку для сеанса и отображаем как надпись.
Try
Label2( ).Text =
Ссылка на несуществующую строку приведет к исключению. Корректно его обрабатываем.
Catch ex As Exception
Label2( ).Text = "(session string is empty)"
End Try
End Sub
Рис. 3" Код АЛЯ управления сеансом.
ihttp:,】—ю・1.'Чемйт.аЬ?.'...ол.«н>х -ihttp:,】—ю・1.'Чемйт.аЬ?.'...ол.«н>х -⑥g«©b 8 七駅*» F■时хКгlook &t⑥g«©b 8 七駅*» F■时хКгlook &t
ihttp:,】—ю・1.'Чемйт.аЬ?.'...ол.«н>х -
ihttp:,】—ю・1.'Чемйт.аЬ?.'...ол.«н>х -
⑥g«©b 8 七駅*» F■时хКгlook &t
⑥g«©b 8 七駅*» F■时хКгlook &t
物旧$ |& H^/Sxl:s5s0“—aM~aw:二J >8 L* >
The string currently stored 2!1 your session state 砌ectis.
aaaaaaaaaa
交 Owi»交 Owi»3^x^V*,/
交 Owi»
交 Owi»
Рис. 3-18. Пример приложения АЛЯ управления сеансом.
<sessionState
mode="inprocn
stateConnectionString="tcpip=127l0,0.1:42424"
:sqlConnectionStrlng=,xdata source=T27. 0.0,1;
user id=sa; password="
cookiele$s=,'false" timeout=,'2"
Рис. 3-19. Записи ЛАЯ управления сеансом в файле web.config.
В простой ASP механизм сеансов имеет не- • Для большей
устойчивости сеансомкоторые недостатки, препятствующие его
можно управлять 野 I распространению з крупномасштабных cue- отдельном прт^ссе. темах. Во-первых, информация о сеансе сохраняется в рабочем процессе, который выполняет страничные сценарии и обращается к коду пользовательских объектов. Объекты с неадекватным поведением могут (и зачастую это происходит) разрушать этот процесс, уничтожая сеансы всех обслуживаемых в данный момент пользователей, а не только тех, кто вызвал разрушение. В ASP.NET эта проблема решена благодаря управлению сеансом в отдельном процессе, работающем как системная служба (рис, 3-20), так что неадекватный пользо вательскиО код уничтожить его не может. Это значит, что рабочие процессы не нарушают состояния сеанса. При этом доступ к сеансовым значениям замедляется, так как приложениям для получения сеансовых значений надо преодолевать границы процесса, но надежность того стоит. Для включения этого режима установите атрибут mode в файле web.config равным stateserver и убедитесь, что процесс работает на серверной машине.
窗至日D- ?窗至日D- ?gJkyctrM*gJkyctrM*■MUM■MUMq.wq.wIxaGntmiInriArfmЦ'СбIxaGntmiInriArfmЦ'Сб♦•I^H(“166 ■ Wd Yiftw〕vnrn,…,8g k t •Mar上~—<.—Г/^!5v**r*b hiH«*.*»^' ♦ЫжЛг- -' t>VUt6LAtrState,MsfhailiTBt/c Mvcfct^rte^i t- ^tb: a«t»Wet<)r*u,vj9nym.i...iUrtfdMtw♦•I^H(“166 ■ Wd Yiftw〕vnrn,…,8g k t •Mar上~—<.—Г/^!5v**r*b hiH«*.*»^' ♦ЫжЛг- -' t>VUt6LAtrState,MsfhailiTBt/c Mvcfct^rte^i t- ^tb: a«t»Wet<)r*u,vj9nym.i...iUrtfdMtw■J 1*U”:- QHrrg—QELi■J 1*U”:- QHrrg—QELiMi«*mvr мгф_Ы,л*«wwvite .. QtHfrf *.x»w-。人*. msMt.XX Rx1!»- '-»>• i-»#siW«vi s«r>vef *.<Ьм Ami**»«•*Mi«*mvr мгф_Ы,л*«wwvite .. QtHfrf *.x»w-。人*. msMt.XX Rx1!»- '-»>• i-»#siW«vi s«r>vef *.<Ьм Ami**»«•*Рис. 3-20. Процесс управления сеансамиASPNET, работающий как системная служба.Рис. 3-20. Процесс управления сеансамиASPNET, работающий как системная служба.MtbremMtbrem
窗至日D- ?
窗至日D- ?
gJkyctrM*
gJkyctrM*
■MUM
■MUM
q.w
q.w
IxaGntmi
InriArfm
Ц'Сб
IxaGntmi
InriArfm
Ц'Сб
♦•I^H(“166 ■ Wd Yiftw〕vnrn,…,8g k t •Mar上~
—<.—Г/^!5v**r*b hiH«*.*»^' ♦ЫжЛг- -' t>VUt6LAtrState,Msfhail
iTBt/c Mvcfct^rte^i t- ^tb: a«t»Wet<)r*u,vj9nym.i...iUrtfdMtw
♦•I^H(“166 ■ Wd Yiftw〕vnrn,…,8g k t •Mar上~
—<.—Г/^!5v**r*b hiH«*.*»^' ♦ЫжЛг- -' t>VUt6LAtrState,Msfhail
iTBt/c Mvcfct^rte^i t- ^tb: a«t»Wet<)r*u,vj9nym.i...iUrtfdMtw
■J 1*U”:
- QHrrg—QELi
■J 1*U”:
- QHrrg—QELi
Mi«*mvr мгф_Ы,л*«wwvite .. QtHfrf *.x»w-
。人*. msMt.XX Rx1!»- '-»>• i-»#siW«vi s«r>vef *.<Ьм Ami**»«•*
Mi«*mvr мгф_Ы,л*«wwvite .. QtHfrf *.x»w-
。人*. msMt.XX Rx1!»- '-»>• i-»#siW«vi s«r>vef *.<Ьм Ami**»«•*
Рис. 3-20. Процесс управления сеансамиASPNET, работающий как системная служба.
Рис. 3-20. Процесс управления сеансамиASPNET, работающий как системная служба.
Mtbrem
Mtbrem
Сеанс можно хранитьна [^азличнь1х машинах>Сеанс можно хранитьна [^азличнь1х машинах>•• В старой ASP сеансвсегдахранился на серверной машине, на которой он был создан. Такая архитектура плохо масштабируется на
Сеанс можно хранитьна [^азличнь1х машинах>
Сеанс можно хранитьна [^азличнь1х машинах>
многосерверные комплексы, в которых запросы потенциально могут обрабатываться разными серверами. ASP.NE1 позволяет каждому приложению определить машину, на которой будет храниться сеанс. Это делается установкой атрибута stateConnection- SsTig в файле web.config. В этой ситуации любая машина, обра-
батывающал последующий запрос может иметь доступ к сеансовым значениям, сохраненным при предыдущем запросе, выполнявшемся другой машиной. Очевидно, что при этом растет нагрузка на сеть, так что может быть лучше направлять последовательные запросы одной и той же машине.
Сеансовые значенияможно также хранитьв БД SQL-cepsepa.Сеансовые значенияможно также хранитьв БД SQL-cepsepa.Для лучшего управления большими наборами данных вы можете хранить сеанс на SQL- сервере: установите атрибут mode в sq/semer и укажите строку для соединения с SQL-сер
Сеансовые значенияможно также хранитьв БД SQL-cepsepa.
Сеансовые значенияможно также хранитьв БД SQL-cepsepa.
вером в атрибуте SqlConnectionstring. Используемый по умолчанию сценарий создает временную БД для хранения сеанса. Это обеспечивает более быстрый доступ, так как данные не записываются на медленный железный диск, но это также означает, что сеанс не выживет при сбое. Если вам нужна надежность и вас не волнует, что за нее вы заплатите производительностью, можете сами изменить атрибуты БД, чтобы использовалась постоянная таблица.
ASP.NET помогает также управлять состояни-
'у一ASP.NET также
ем приложения, представляющего собой. с^еспечивает
виртуальный каталог верхнего уровня IIS и управление данными на все его подкаталоги. Состояние уровня при-уровне приложения,
ложен ия время от времени меняется, так что
жестко указывать какие-то его значения в своих программах не стоит, но эти значения относятся ко всем пользователям, а не к какому-то отдельному. Примером может служить рекламное объявление/ которое должно отображаться на каждой странице. Каждое приложение имеет один объект Application, который применяется подобно Session за исключением того, что он содержит данные для всех пользователей.
Безопасность в ASP
Безопасность жизненноважна для любойраспределеннойсистемыБезопасность жизненноважна для любойраспределеннойсистемыБезопасность жизненно важна при программировании распределенной системы любого вида. Я попытаюсь обрисовать возникающие в этой области проблемы и рассказать, как ASP.NET предоставляет вашим Web-прило-
Безопасность жизненноважна для любойраспределеннойсистемы
Безопасность жизненноважна для любойраспределеннойсистемы
жениям готовую функциональность, обеспечивающую нужный уровень безопасности без высоких затрат на программирование.
Различным уровнямприложения требуетсяразличный уровеньбезопасности.Различным уровнямприложения требуетсяразличный уровеньбезопасности.Требования к безопасности Web-приложений чем-то напоминают таковые для мэрии. Много неизвестных людей посещают общедоступные места, такие как туристический офис, е котором раздают карты. Поскольку такие
Различным уровнямприложения требуетсяразличный уровеньбезопасности.
Различным уровнямприложения требуетсяразличный уровеньбезопасности.
места не являются критическими, не хочется терять время и раздражать посетителей досмотром. Но в другие места той же мэрии, такие как этаж с кабинетом мэра, нельзя пускать тех, кто не может подтвердить свою личность (пройти аутентификацию) и кому здесь делать нечего (не прошедших авторизацию). Может потребоваться пропустить их через металло искатель, чтобы убедить-
ся, что они никого не покалечат.
Аутентификация
Первая проблема безопасности — аутенти- Точная идентификации 一_
пользователя в целях中 икав® Кто ты такой и откуда я знаю, что
безопасности назыеа- ™действительно тот, за кого себя выдаешь? ется аутентификацией. Аутентификация пользователя обычно представляет собой проверку удостоверения личности, предъявляемого пользователем, иногда согласованного между двумя сторонами (PIN-код или пароль), а иногда выданного третьей стороной, вызывающей доверие (паспорт или водительское удостоверение). Если удостоверение удовлетворяет сервер, он знает, кем является пользователь и может определить, какие действия может выполнять этот пользователь. Неаутенти- фицированный пользователь называется анонимным. Это не значит, что у него вообще не будет доступа к Web-сайту. Это лишь означает, что у него будет доступ только к тем функциям, к которым разработчик предоставил доступ анонимным пользователям, например^ он сможет посмотреть расписание рейсов, а заказать билет со скидкой — нет.
Системы .аутентификациисложнь(е и дорогие,потому что при ееСистемы .аутентификациисложнь(е и дорогие,потому что при ееИсторически аутентификация была наиболее сложной проблемой при проектировании системы безопасности. Большинство прикладных разработчиков не хотят иметь с ней дело, исключительной важности ее трудно правиль-
Системы .аутентификациисложнь(е и дорогие,
потому что при ее
Системы .аутентификациисложнь(е и дорогие,
потому что при ее
но реализовать. Вам нужна постоянная команда очень умных программистов, которых не волнует ничего, кроме безопасности,
потому что есть такие же фанатичные плохие ребята, которых интересует только взлом вашего сайта, с которого они хотят бесплатно взять вашу первоклассную программу (или сделать что- нибудь похуже). Например, нельзя просто послать пароль по сети, даже если он зашифрован. Если сетевой пакет содержит даже зашифрованный пароль, не изменяемый при каждой передачу взломщики могут его записать и потом им воспользоваться. IИменно так я вошел в систему обмена валюты некоторого банка (название вы можете узнать, но только с их разрешения), когда выполнял контракт по проверке их системы безопасности. Они очень гордились своим алгоритмом шифрования паролей, кото- Iрый я даже не пытался взломать. Мне понадобилось всего 20 минут работы с анализатором пакетов, чтобы записать идентификатор и пароль пользователя и послать их, чтобы зайти на их сбрвер. Жаль что у меня была почасовая оплата. В следующий раз я возьму недельку оплачиваемого отпуска, прежде чем объявить об успешных результатах.
К счастью, вAS.NFTвстроено несколькоразличных готовыхаутентификационныхмеханизмов.К счастью, вAS.NFTвстроено несколькоразличных готовыхаутентификационныхмеханизмов.Сложность и важность аутентификации заставили встроить эту функцию в безопасную (будем надеяться) ОС в первую очередь. ASP.NET поддерживает три механизма аутентификации (или четыре, если считать «попе») (табл. 3-2).
К счастью, вAS.NFTвстроено несколькоразличных готовыхаутентификационныхмеханизмов.
К счастью, вAS.NFTвстроено несколькоразличных готовыхаутентификационныхмеханизмов.
Табл. 3-2. Режимы аутентификации ASP.NET.
Название
Описание
None
Windows
Forms
Аутентификация в ASP.NET не используется.
Стандартная аутентификация Windows через IIS.
ASP.NET требует, чтобы заголовки запросов всех страниц содержали caokie-файлы, выданные сервером. Пользователи, пытающиеся получить доступ к защищенным страницам без этих файлов, переадресуются к странице регистрации, которая проверяет удостоверяющие данные и выдает cookie-файл.
Passport
Идея та же, что и в случае Forms, за исключением того, что идентификационные данные пользователя сохраняются и cookie-файлы выдаются внешней аутентификационной службой Microsoft Passport.
Нужно хорошо поду-мать, какие из ресурсоввашего сайта нуждаютсяв аутентификации.刍.з: “•:—淤鼠『♦‘ —♦—* '••'«.Нужно хорошо поду-мать, какие из ресурсоввашего сайта нуждаютсяв аутентификации.刍.з: “•:—淤鼠『♦‘ —♦—* '••'«.Нужно хорошо подумать, где именно должна имет1 место аутентификация.Как и в случае мэрии, нужно соблюсти баланс между защитой и доступностью. Так, финансовый Web-саит будет требовать аутентификации
Нужно хорошо поду-мать, какие из ресурсоввашего сайта нуждаютсяв аутентификации.刍.з: “•:—淤鼠『♦‘ —♦—* '••'«.
Нужно хорошо поду-мать, какие из ресурсоввашего сайта нуждаютсяв аутентификации.刍.з: “•:—淤鼠『♦‘ —♦—* '••'«.
при просмотре счетов или переводе денег, но, видимо, должен I предоставлять маркетинговые материалы и проспекты о своих фондах анонимной публике. Важно так построить сайт, чтобы защищенные функции оставались защищенными, но эта защита не мешала незащищенным операциям. Трудно представить что-нибудь более губительное дпя бизнеса, чем заставлять пользователя устанавливать и применять аутентифицированную учетную запись, прежде чем позволить ему посмотреть информацию о товарах, хотя некоторые сайты именно так и устроены.
Аутентифи кп ция вI ПРЕДУПРЕЖДЕНИЕ: в отличие от DCOM,
ASP NET r»ROU3 曜頤到 Т€Я которая имеет собственный жесткий формат без шуфро0ания.для поддержки конфиденциальности паке-
Об этом вам нужно тов, ни одна из аутентификационных схем по^абогшься самим. | ASP.NET не шифрует передаваемые между
клиентом и сервером данные. Эта проблема связана HecASP.NET как таковой, а с общим транспортным протоколом Web — HTTP. Если на вашем сайте есть данные, которые вы не хотите увидеть на первой странице газеты USA Today, вам нужно использовать протокол Secure Socket Layer (SSL) для I шифрования. Обычно это делается только для наиболее чувствительных операций, поскольку шифрование замедляет транспортировку. Например, Web-сайт авиакомпании будет, вероятно, шифровать страницу покупки, где указывается номер кредитной карты, но не страницу поиска рейсов.
Windows-аутентификация
Wi nd0WS-ayTeHTu4?忏 :поддерживает аутентификацию на
нация хорошо работаетбазе Windows, что по сути означает делеги-
только в интрасетях рование процесса аутентификации IIS — ба
на базе Windows.I зовой Web-серверной архитектуре, над кото-
二 рой надстроена ASP.NET. IIS можно настроить так, чтобы он выводил диалоговое окно в пользовательском браузере и принимал идентификатор и пароль пользователя. Эти
идентификационные данные должны соответствовать пользова- „скои учетной записи Windows в домене, к которому принадлежит IIS. Другая возможность предполагает наличие Microsoft Internet Explorer 4 или более поздней версии, Windows-системы и отсутствие прокси. В этом случае US можно настроить на применение встроенных в Windows ауте нтифи ка иион ных протоколов INTLM или Kerberos для автоматического согласования пользовательского идентификатора и пароля на основании текущего сеанса регистрации пользователя.
Windows-аутентификация неплохо работает в интрасетях, где используется только Windows, поскольку здесь у вас полный ад 一 министративный контроль. Для некоторых конфигураций, скажем, для больших корпораций, — это просто фантастика! Просто включай и работай! Но это совсем не так полезно в открытом Интернете, где серверу нужно общаться с системами любых типов (скажем, блокнотными компьютерами) с применением доступа любого типа (скажем, не IE) и где вы не хотите настраивать учетные записи Windows для scex пользователей.
Cookie-аутентификация на основе форм
Большинство проектировщиков Web-прило-
丁Аутентифи каци я на ОС-
жении выберут аутентификацию на "HQ6R.Bl форм начинается
форм, или cookie-аутентификацию. Пользо-с идентификатора и
ватель сначала устанавливает учетную записьпароля пользователя.
с идентификатором и паролем. Некоторые
Web-сайты, например, сайты авиакомпаний, позволяют сделать вам это через Web на странице, открытой для анонимного доступа. Другие, такие как сайты большинства компаний, оказывающих финансовые услуги, требуют подписанный документ, доставленный обычной почтой.
Первый раз обращаясь к странице защищенного Web-сайта^ пользователь получает форму, в которой запрашивается его идентификатор и пароль. Web-сервер сравнивает их со значениями, хранящимися в его досье, и, если они совпадают, разрешает доступ. Затем сервер предоставляет браузеруcookie-файл, подтверждающий успешную регистрацию. Рассматривайте cookie-файл как метку, которую вам ставят в баре, после того как проверяют ваши документы и убеждаются, что вам уже стукнуло 21. Он со-
' Сервер предоставляет браузеру—входной билет,идентифу цируюьции. аутёнтифицирова многопользователя.' Сервер предоставляет браузеру—входной билет,идентифу цируюьции. аутёнтифицирова многопользователя.Клиентский браузер1. Запрашивает страницу, требующую аутентифика- I иию на основе форм.Возвращается начальнаяКлиентский браузер1. Запрашивает страницу, требующую аутентифика- I иию на основе форм.Возвращается начальнаястраницаи соок1е*файл.страницаи соок1е*файл.Запросы следующих страниц передают на сервер cookie-файл.8 конце сеанса клиент сбрасывает cookie или сохраняет его для последующего доступа безрегистрации.Запросы следующих страниц передают на сервер cookie-файл.8 конце сеанса клиент сбрасывает cookie или сохраняет его для последующего доступа безрегистрации.Постоянный cookie-файл (иногда)Постоянный cookie-файл (иногда)СерверASP.NET обнаруживает обращение к защищенному ресурсу и отсутствие cookie. 11е|к*н<]правляет на регистрационную форму.Программа берет идентификатор и пароль с регист- 卩aUHDHHUS формы и кромз- водят внутррннюю проверку При успешном завершении вызывает системную функцию, пр(?доставляю- щую клиенту cookie-файл , и перенаправляло!- клиент на нужную ему страницу,6. ASP.NET обнаруживает доступ к защищенному ресурсу и наличие соак!е^файда Предоставляет защищенный ресурс.СерверASP.NET обнаруживает обращение к защищенному ресурсу и отсутствие cookie. 11е|к*н<]правляет на регистрационную форму.Программа берет идентификатор и пароль с регист- 卩aUHDHHUS формы и кромз- водят внутррннюю проверку При успешном завершении вызывает системную функцию, пр(?доставляю- щую клиенту cookie-файл , и перенаправляло!- клиент на нужную ему страницу,6. ASP.NET обнаруживает доступ к защищенному ресурсу и наличие соак!е^файда Предоставляет защищенный ресурс.
' Сервер предоставляет браузеру—
входной билет,идентифу цируюьции. аутёнтифицирова многопользователя.
' Сервер предоставляет браузеру—
входной билет,идентифу цируюьции. аутёнтифицирова многопользователя.
Клиентский браузер
1. Запрашивает страницу, требующую аутентифика- I иию на основе форм.
Возвращается начальная
Клиентский браузер
1. Запрашивает страницу, требующую аутентифика- I иию на основе форм.
Возвращается начальная
страница
и соок1е*файл.
страница
и соок1е*файл.
Запросы следующих страниц передают на сервер cookie-файл.
8 конце сеанса клиент сбрасывает cookie или сохраняет его для последующего доступа безрегистрации.
Запросы следующих страниц передают на сервер cookie-файл.
8 конце сеанса клиент сбрасывает cookie или сохраняет его для последующего доступа безрегистрации.
Постоянный cookie-файл (иногда)
Постоянный cookie-файл (иногда)
Сервер
ASP.NET обнаруживает обращение к защищенному ресурсу и отсутствие cookie. 11е|к*н<]правляет на регистрационную форму.
Программа берет идентификатор и пароль с регист- 卩aUHDHHUS формы и кромз- водят внутррннюю проверку При успешном завершении вызывает системную функцию, пр(?доставляю- щую клиенту cookie-файл , и перенаправляло!- клиент на нужную ему страницу,
6. ASP.NET обнаруживает доступ к защищенному ресурсу и наличие соак!е^файда Предоставляет защищенный ресурс.
Сервер
ASP.NET обнаруживает обращение к защищенному ресурсу и отсутствие cookie. 11е|к*н<]правляет на регистрационную форму.
Программа берет идентификатор и пароль с регист- 卩aUHDHHUS формы и кромз- водят внутррннюю проверку При успешном завершении вызывает системную функцию, пр(?доставляю- щую клиенту cookie-файл , и перенаправляло!- клиент на нужную ему страницу,
6. ASP.NET обнаруживает доступ к защищенному ресурсу и наличие соак!е^файда Предоставляет защищенный ресурс.
держит идентификационные данные пользователя в зашифрованном виде、 Браузер будет автоматически посылать этот cookie-файл в разделе заголовка всех запрашиваемых после этого страниц, чтобы сервер знал запрашивающего пользователя. Это избавляет
вас от необходимости вводить свой идентификатор и пароль для каждо。посылаемой формы илизапрашиваемойстраницы (рис. 3-21).
С<х)к|е*файлы могутбыть временным HAUпостоянными.было проходитьС<х)к|е*файлы могутбыть временным HAUпостоянными.было проходить
С<х)к|е*файлы могутбыть временным HAUпостоянными.
было проходить
С<х)к|е*файлы могутбыть временным HAUпостоянными.
было проходить
Рис, 3-21. Аутентификация на основе форм.
Предоставляя cookie-файл, сервер указывает, выбросить его после завершения сеанса браузера или сохранить на жестком диске пользователя, чтобы пользователю не нужно процедуру регистрации в следующий раз. Фи-
нансовые Web-сайты часто используют первый подход, чтобы
быть сверхзащи щен н ым и от неавторизованного доступа, который может обойтись в тысячи долларов, Однако второй подход, очевидно, удобней пользователям. БольшинствоWeb-сайтов, чьи данные не очень критичны, например, онлайновые периодичес-
кие издании типа Wall Street Journal, часто позволяют пользователю выбрать вторую возможность (рис. 3-22).
_il a注9 ■七向G .3EtO<7 円_il a注9 ■七向G .3EtO<7 円■*Ъги?чК'<рда<г®»г[ . J г ■■*Ъги?чК'<рда<г®»г[ . J г ■♦ г?*]、” XcuBwC 5ч>* A —♦ г?*]、” XcuBwC 5ч>* A —s| ,d—«о—“i,」 ⑥ Bnestr嗽w*ce<cX:! r, @ e9**v<M0*w«w>.Q:*,:,],•, g «ditC«t0<tWKcr>ir*:,)H 'м] «k'.KYlUH (**■*• .,”0皿 »/ j#w r;-*<»^ .*» ■ Шs| ,d—«о—“i,」 ⑥ Bnestr嗽w*ce<cX:! r, @ e9**v<M0*w«w>.Q:*,:,],•, g «ditC«t0<tWKcr>ir*:,)H 'м] «k'.KYlUH (**■*• .,”0皿 »/ j#w r;-*<»^ .*» ■ Ш:M _J Л5С0*».-■ _j ux.rrt, Zstnp-_j A:«M->-»♦. □ 2—*"-Jj ASirfistratOr. iPSWlCXM!> >_j Amketicn C-ala_J Cog,:M _J Л5С0*».-■ _j ux.rrt, Zstnp-_j A:«M->-»♦. □ 2—*"-Jj ASirfistratOr. iPSWlCXM!> >_j Amketicn C-ala_J Cog,,凸 F*wt»,2j J M»*Te»<Ci»'1•+1 Mu Cciiourx _ .,凸 F*wt»,2j J M»*Te»<Ci»'1•+1 Mu Cciiourx _ .А»ж* I • V м ет, лМ —XAlmE»” IP '••" . l*_t tА»ж* I • V м ет, лМ —XAlmE»” IP '••" . l*_t t▲j 号—G<c*4>aW.■<:可 e5—3@^dm0(11.1"目 *tWHU *ОНММ*>*Э| l !■□>!▲j 号—G<c*4>aW.■<:可 e5—3@^dm0(11.1"目 *tWHU *ОНММ*>*Э| l !■□>!,”■ Chww^. f・“ ■nuwx 【♦" ?а(гч»г< (•>t tW' mer* fe,f *кя tnert ЛОаимпг “・t@?ar>e*c 'МО9ЛГМП,”■ Chww^. f・“ ■nuwx 【♦" ?а(гч»г< (•>t tW' mer* fe,f *кя tnert ЛОаимпг “・t@?ar>e*c 'МО9ЛГМПle,t Cutwrr Te>t Сшл»*к 【6, CKX5Ble,t Cutwrr Te>t Сшл»*к 【6, CKX5B「》^«>^a—I— иЛк—H「》^«>^a—I— иЛк—HIntroducing Microsoft. Nel DIntroducing Microsoft. Nel D361 7336CC8B0CC226438A2CDC03DC7900E7D1 "C96 4C59JF75O956E9F4495DOFD5 3DOF9I5ACAEOF25625B 8B4COOA6D5BDO96C6BBF1 5F79DDD040C70C11 313 808 498FFD920A7B9F5C1B2E8C56850F74943414D762657 I895Enredhookesb/OODi2923 70560n33063765a 761540912□29390078口*口361 7336CC8B0CC226438A2CDC03DC7900E7D1 "C96 4C59JF75O956E9F4495DOFD5 3DOF9I5ACAEOF25625B 8B4COOA6D5BDO96C6BBF1 5F79DDD040C70C11 313 808 498FFD920A7B9F5C1B2E8C56850F74943414D762657 I895Enredhookesb/OODi2923 70560n33063765a 761540912□29390078口*口
_il a注9 ■七向G .3EtO<7 円
_il a注9 ■七向G .3EtO<7 円
■*Ъги?чК'<рда<г®»г[ . J г ■
■*Ъги?чК'<рда<г®»г[ . J г ■
♦ г?*]、” XcuBwC 5ч>* A —
♦ г?*]、” XcuBwC 5ч>* A —
s| ,d—«о—“i,」 ⑥ Bnestr嗽w*ce<cX:! r, @ e9**v<M0*w«w>.Q:*,:,],•, g «ditC«t0<tWKcr>ir*:,)H 'м] «k'.KYlUH (**■*• .,”0皿 »/ j#w r;-*<»^ .*» ■ Ш
s| ,d—«о—“i,」 ⑥ Bnestr嗽w*ce<cX:! r, @ e9**v<M0*w«w>.Q:*,:,],•, g «ditC«t0<tWKcr>ir*:,)H 'м] «k'.KYlUH (**■*• .,”0皿 »/ j#w r;-*<»^ .*» ■ Ш
:M _J Л5С0*»
.-■ _j ux.rrt, Zstnp
-_j A:«M->-»
♦. □ 2—*"
-Jj ASirfistratOr. iPSWlCXM!
> >_j Amketicn C-ala
_J Cog,
:M _J Л5С0*»
.-■ _j ux.rrt, Zstnp
-_j A:«M->-»
♦. □ 2—*"
-Jj ASirfistratOr. iPSWlCXM!
> >_j Amketicn C-ala
_J Cog,
,凸 F*wt»,
2j J M»*Te»<Ci»
'1•
+1 Mu Cciiourx _ .
,凸 F*wt»,
2j J M»*Te»<Ci»
'1•
+1 Mu Cciiourx _ .
А»ж* I • V м ет, лМ —XAlmE»” IP '••" . l*_t t
А»ж* I • V м ет, лМ —XAlmE»” IP '••" . l*_t t
▲j 号—G<c*4>aW.■<
:可 e5—3@^dm0(11.1"
目 *tWHU *ОНММ*>*Э| l !■□>!
▲j 号—G<c*4>aW.■<
:可 e5—3@^dm0(11.1"
目 *tWHU *ОНММ*>*Э| l !■□>!
,”■ Chww^. f・“ ■nuwx 【♦" ?а(гч»г< (•>t tW' mer* fe,f *кя tnert ЛОаимпг “・t@?ar>e*c 'МО9ЛГМП
,”■ Chww^. f・“ ■nuwx 【♦" ?а(гч»г< (•>t tW' mer* fe,f *кя tnert ЛОаимпг “・t@?ar>e*c 'МО9ЛГМП
le,t Cutwrr Te>t Сшл»*к 【6, CKX5B
le,t Cutwrr Te>t Сшл»*к 【6, CKX5B
「》^«>^a
—I
— иЛк
—H
「》^«>^a
—I
— иЛк
—H
Introducing Microsoft. Nel D
Introducing Microsoft. Nel D
361 7336CC8B0CC226438A2CDC03DC7900E7D1 "C96 4C59JF75O956E9F4495DOFD5 3DOF9I5ACAEOF25625B 8B4COOA6D5BDO96C6BBF1 5F79DDD040C70C11 313 808 498FFD920A7B9F5C1B2E8C56850F74943414D762657 I895Enredhookesb/OODi2923 70560n33063765a 761540912□29390078口*口
361 7336CC8B0CC226438A2CDC03DC7900E7D1 "C96 4C59JF75O956E9F4495DOFD5 3DOF9I5ACAEOF25625B 8B4COOA6D5BDO96C6BBF1 5F79DDD040C70C11 313 808 498FFD920A7B9F5C1B2E8C56850F74943414D762657 I895Enredhookesb/OODi2923 70560n33063765a 761540912□29390078口*口
Рис. 3-22. Постоянный cookie-файл, созданный демонстра ционным приложением.
ASP.NET имеет хорошую поддержку аутентификации на основе форм. Демонстрационное приложение (рис. 3-23) содержится на сайте книги. Чтобы ASP.NET использовала аутентификацию на основе форм, нужно сделать в файле web.config соответствующие записи (рис. 3-24). Элеме^т authorization указываетASP.NET запретить доступ всем неаутентифицированным пользователям.
ASP.NET содержит раз-витую готовую под-держку■ аутентификациина основе форм. ,.ASP.NET содержит раз-витую готовую под-держку■ аутентификациина основе форм. ,.Это означает, что ASP.NEI требует, чтобы любой запрос страницы из каталога или его подкаталогов должен содержать cookie-файл от браузера, говорящий, что пользователь аутентифицирован. При отсутствии cookie-
ASP.NET содержит раз-витую готовую под-держку■ аутентификациина основе форм. ,.
ASP.NET содержит раз-витую готовую под-держку■ аутентификациина основе форм. ,.
файла, как это имеет место до первой регистрации^ ASP.NET направляет пользователя на страницу, указанную в атрибуте loginUrl.
Эта страница служит для ввода пользователем идентификатора и пароля. Обработчик этой страницы содержит алгоритмы, необходимые, чтобы проверить, что пользователь является тем, за кого себя выдает. В примере принимается пустой пароль и отвергаются все непустые. Если сервер принимает входящего пользователя, функция S^tem.Web.Secunty^FormsAuthentication.RedirectFrom- LoginPage отсылает его к странице, которую он пытается получить, в противном случае он переходит к экрану регистрации (рис. 3-25).
J[G QJ-!*w*fим》《*■«■• —с
ж^^:二:金
J •>• ” zz」啮
Aff^W .1 ht^:M,,44n*tJtaF**j*hm* ккп/b^riiatt ацп +. лН^>*>г :、. ,ЧЭ%Г,В Л色 ^*«0
Introducing MicrosoftNET
Forms-based authentication demo login form
User ID (enter anything)
jdT«U@r,—, < 加
Password (blank succeeds, non-blank fails)
--
/Rememberme nest time
J
Рис. 3-23, Демонстрационное приложение аутентификации на основе форм.
〈authentication mode = "Forms" >
<fo「ms name=r,IntroduclngMicrosft.NET" loginUrl="loginform.aspx"/>
</authentlcation>
〈authorization〉
<deny users="'?"/> 〈/authorization〉
1 Рис. 3-24. Файл web. con figдля аутентификации на основе форм.
Public Sub Button1_Click(ByVal sender As Object, _ IByVal e As System.EventArgs)
Принимаем пустой пароль. Вызываем функцию, посылающую cookie клиентскому браузеру, и перенаправляем клиента ' на начальную запрашиваемую им страницу,
If txt_Password,Text =
System.Web.Security.FormsAuthentication. _ IRedirectFromLoginPage( _ txt—UserID. text, cb_RemeniberMe. Checked)
' Отвергаем непустой пароль. Не обращаемся ни к каким другим функциям.
Else
Label3.Text =Credentials: Please try again"
IEnd If
IEnd Sub
IРис. 3-25. Код формы АЛЯ аутентификации на основе форм.
ASP.NET можно также настроить на выпалнение автоматической аутентификации, основанной на формах с применением пользовательского идентификатора и пароля, хранящегося в конфигу- Iрационном XML-файле. Видимо, этот подход хорош в небольших I конфигурациях. Демонстрация такого подхода выходит за рам- Iки этой книги, во всяком случае этой редакции.
: Passport-аутентификация
Третий вариант аутентификации — применение службы Passport. Схема, основанная на формах, прекрасно смотрится, и применять
Число Web-cauTOBr длякоторых пользовательдолжен помнитьиденти-фйкатор и пароль, стре-■ метельно растет. При лом возрастаетугроза • • безопасности всехданных.поскольку все ониЧисло Web-cauTOBr длякоторых пользовательдолжен помнитьиденти-фйкатор и пароль, стре-■ метельно растет. При лом возрастаетугроза • • безопасности всехданных.поскольку все ониее легко благодаря готовой поддержке в ASP.NET. Но фатальной проблемой для нее является неконтролируемый рост числа сайтов. Любой сайт, содержащий хотя бы бит критической информации требует реализа- или иноммеханизм;регист-
Число Web-cauTOBr длякоторых пользовательдолжен помнитьиденти-фйкатор и пароль, стре-
■ метельно растет. При лом возрастаетугроза • • безопасности всех
данных.
поскольку все они
Число Web-cauTOBr длякоторых пользовательдолжен помнитьиденти-фйкатор и пароль, стре-
■ метельно растет. При лом возрастаетугроза • • безопасности всех
данных.
поскольку все они
рации. Я, например, использую пять сайтов различных авиалиний для заказа билетов, и, принимают кредитные карты, везде требует
ся аутентификация. Это жуткая головная боль — отслеживать все идентификаторы и пароли, которые я ввожу на разных сайтах. На одном мое имя «dplatt»; когда я подписывался на другой, этот идентификатор уже был задействован, так что там я — «fdave- platt». Я пробовал применить свой адрес электронной почты, который никем другим использоваться не должен, и иногда это работало, но некоторые сайты не позволяют вводить знак @, а другие не воспринимают такие длинные имена. В качестве пароля некоторые используют 4-символьные PIN-коды, другие требуют пароль длиной не менее 6 (а иногда 8) символов, включающий как цифры, так и буквы. Некоторые считают, что их данные настолько секретны (сведения о моих полетах? Вред!), что не позволяют хранить идентификационные данные в постоянных cookie- файлах. Единственная возможность отслеживать все свои пользовательские имена и пароли — выписать их на бумажку и держать поближе к компьютеру, где их и увидит любой злоумышленник, Это один из способов, которым физик Ричард Фейнман, Нобелевский лауреат, вскрыл секретный сейф и шутки ради оставил в нем бессмысленные заметки. Это происходило во время работы над проектом атомной бомбы в Лос Аламосе во время второй мировой войны. (О двух других способах вы можете узнать из его мемуаров «Surely YoLiRjoking, Mr. Feynman». Надеюсь, в Лос Аламосе эту проблему уже решили.) Как говорил мне один клиент еще десять лет назад, главная проблема безопасности - не анализаторы сетевых пакетов, а самоклеющиеся бумажки для заметок.
Microsoft Passport (www.passport.com) — попытка обеспечить универсальную безопасную од но шаговую процедуру регистрации. При этом применяется механизм, аналогичный аутентификации
на основе форм, но хранением и проверкой идентификаторов и паролей занимаются Web-серверы Microsoft Passport. Пользователь должен зайти на сайт службы Passport и создать паспорт —、 по сути идентификатор и пароль, хранящиеся на серверах Microsoft. Когда пользователь запрашивает страницу с сайта, применяющего Passport-аутентификацию, этот сайт ищет в запросе cookie-файл службы Passport. Если он его не находит, запрос перенаправляется на собственный сайт Passport, где пользователь вводит свой идентификатор и пароль и получает cookie- файл. Последующие запросы браузера к любым сайтам, применяющим Passport, содержат этот cookie-файл, пока пользователь не выйдет из системы (рис. 3-26). Таким образом, пользователь может применять один и тот же идентификатор и пароль на всех соответствующих сайтах. Этот механизм во многом решает проблему роста числа сайтов с необходимостью аутентификации, облегчая жизнь пользователям и повышая безопасность в сети.
Клиентский браузерI. Запрос страницы,применяющейPas sport-ауте нти-фикацию. 、Клиентский браузерI. Запрос страницы,применяющейPas sport-ауте нти-фикацию. 、4. Возврат начальнойстраницы и cookie-фа^а.4. Возврат начальнойстраницы и cookie-фа^а.Сервер
Клиентский браузер
I. Запрос страницы,применяющейPas sport-ауте нти-фикацию. 、
Клиентский браузер
I. Запрос страницы,применяющейPas sport-ауте нти-фикацию. 、
4. Возврат начальной
страницы и cookie-фа^а.
4. Возврат начальной
страницы и cookie-фа^а.
ASP.NETобнаруживает обрашение к защищенному ресурсу и отсут- I ствие cookie, Перенаправляет на регистрационную форму.
——wwСерверный комплекс Microsoft PassportСерверный комплекс Microsoft PassportПрограмма берет идентификатор и пароль с регистра-
—
—
w
w
Серверный комплекс Microsoft Passport
Серверный комплекс Microsoft Passport
Постоянный cookie-файл (иногда)Постоянный cookie-файл (иногда)5. В запросах последующих страниц серверу передаются cookie-файлы.7. В конце сеанса клиеш сбрасывает cookie или сохраняет его для послеА'ю- щего доступа без регистрации.5. В запросах последующих страниц серверу передаются cookie-файлы.7. В конце сеанса клиеш сбрасывает cookie или сохраняет его для послеА'ю- щего доступа без регистрации.ционной формы и посылает запрос аутентификации Microsoft.
Постоянный cookie-файл (иногда)
Постоянный cookie-файл (иногда)
5. В запросах последующих страниц серверу передаются cookie-файлы.
7. В конце сеанса клиеш сбрасывает cookie или сохраняет его для послеА'ю- щего доступа без регистрации.
5. В запросах последующих страниц серверу передаются cookie-файлы.
7. В конце сеанса клиеш сбрасывает cookie или сохраняет его для послеА'ю- щего доступа без регистрации.
При успешном завершении вызывает системную функцию, пред()ставля ющую клиенту cookie-файл, и перенаправляяет клиент на начальную страницу.
ASP.NET обнаруживает > доступ кзащищенному ресурсу и наличие
I ookip-0aiiAfL
-Предоставляетзащищенный ресурс.
Рис. 3-26. Passport-a утен тификация.
Microsoft Passportпредлагает единыйидентификатор и пароль'для всех сайтов.Microsoft Passportпредлагает единыйидентификатор и пароль'для всех сайтов.Паспорт также позволяет пользователю хранить персональные сведения, которые он I хочет предоставлять посещаемым Web-сайтам. Например, паспорт может содержать почтовый адрес, чтобы Web-сайты могли авто
Microsoft Passportпредлагает единыйидентификатор и пароль'для всех сайтов.
Microsoft Passportпредлагает единыйидентификатор и пароль'для всех сайтов.
матизировать процедуру заполнения бланков заказов, и даже номер кредитной карты для осуществления покупок. Выглядитэто так, как будто фантастически успешная (и запатентованная) технология заказов одним щелчком мыши, применяемая Amazon.com, доступна любым сайтам. На некоторых сайтах {например, Crutch- field.com или RadioShack.com) вы можете увидеть кнопкудля осуществления быстрой покупки с помощью Passport.
Концепция Passport-аутентификации кажется В паспорте может со
держаться такая инфор- неплохой, но насколько привлекательной она маадя как адреса ибудет для рынка — это вопрос. Пока что
номера кредитных карт. последователей у нее немного. Кроме соб
ственных сайтов Microsoft (Hotmail и MSN), 0
настоящий момент (январь 2001 г.) на сайте Passport перечислен ны только 65 сайтовл применяющих Passport-аутентификацию^ но по большей части крупными их не назвать. И похоже, что на некоторых из них (например на Victoria's Secret) эта возможность еще не реализована. Отчасти дело в том, что Microsoft требует лицензионного соглашения на применение Passport и оплаты своих услуг. Хотя сейчас оплачивается только базовая аутентификация, потенциальные партнеры опасаются ввязываться в это дело, ожидая увеличения расценок в будущем. Они могут также опасаться аутсорсинга. Поскольку они не контролируют этот сервис, как они могут быть уверены, что он будет работать или будет достаточно эффективным? Кому нужно повторение кошмара 23 января 2001 г., когда какой-то болван из Microsoft неправильно настроил DNS и заблокировал доступ ко всем сайтам Microsoft, включая Passport, почти на целый день? (Я неудивлюсь, если этот «специалист» редактировал XML-файлы в Блокноте, а ведь специальная утилита позволила бы избежать
- Будущее Passport зшнгу
сит от отношения к этой проблемы.) И как быть, если такое повторш- службе со сгораны потен- ся* Как может какая-то Интернет-компания циальн&1хпартнеров.послать Microsoft подальше, если Microsoft
хранит их регистрационные данные?
Отношение партнеров будет определяться отнрщением потребителей (и так по круау*Отношение партнеров будет определяться отнрщением потребителей (и так по круау*Те же проблемы существуют и для потребителей. Решат ли пользователи, что паспорт настолько удобен, что нужно его применять? Это зависит от того, сколько сайтов принимает паспорт, что в свою очередь зависит от
Отношение партнеров будет определяться отнрщением потребителей (и так по круау*
Отношение партнеров будет определяться отнрщением потребителей (и так по круау*
того, сколько потребителей его имеет. Так как все 60 миллионов пользователей Hotmail автоматически получили паспорта, начинается все не с нуля. А как быть с теми, кто испытывает стойкое отвращение к Microsoft? Я не думаю, что Ларри Эллисон или Жанет Рино когда-нибудь закажут паспорта. Так ли малочисленны эти потребители, чтобы сайты их игнорировали или они должны вместе с Passport-аутентификацией применять другие механизмы регистрации?
Отношение потреоите- лей во многом определяется возможностями электронной коммерции.Отношение потреоите- лей во многом определяется возможностями электронной коммерции.Мне кажется, большие проблемы возникают из-за наличия в паспорте дополнительных данных. Доверят ли пользователи номера своих кредитных карт Microsoft, только чтобы облегчить себе процесс покупки? Я — нет.
Отношение потреоите- лей во многом определяется возможностями электронной коммерции.
Отношение потреоите- лей во многом определяется возможностями электронной коммерции.
Это связано не столько с недоверием к Microsoft, которой я даю номер своей кредитной карты при каждой покупке бесполезного обновления, речь идет о всех онлайновых поставщиках, которые читают мой паспорт. Откуда я знаю, не прочитали ли в Radio Shack мой паспорт, если я у них ничего не покупал? Откуда мне знать, что они не прочитали мой почтовый адрес и не начнут меня бомбардировать своей дурацкой рекламой? Их обещания этого не делать не являются гарантией невмешательства в мою личную жизнь. Лаже если Microsoft действительно сделает невозможным недозволенное чтение паспорта, сколько пользователей ей поверят? Универсальная регистрация — изящное решение, но готов поспорить, что возможности электронной коммерции сведут эту идею на нет. Потратить деньги и так довольно легко; у меня нет ни потребности, ни желания упрощать этот процесс.
ASP.NEI включает готовую поддержку PassportY аутентификации. ^ASP.NEI включает готовую поддержку PassportY аутентификации. ^Паспорт — интересная идея, и рынок определит, удачна она или нет. Я, пожалуй, не выбрал бы его как единственно возможный механизм аутентификации, но всерьез рас-
ASP.NEI включает готовую поддержку PassportY аутентификации. ^
ASP.NEI включает готовую поддержку PassportY аутентификации. ^
сматриваю его как один из вариантов. Все, что упрощает исполь-
зование сайта в сравнении с сайтами конкурентов, нужно исполь-
зовать. Если вы решите применять Passport-аутентификацию; вы обнаружите, что ее поддержка в ASP. NET позволяет сделать это довольно просто. Этот режим аутентификации устанавливается в файле web.config. Вам нужно будет переписать Passport SDK, подписать лицензионное соглашение и затем сотворить несложную программу, делегирующую процесс аутентификации этой службе.
Авторизация
Мы qo/\XHw проверят^имеет ли пользовательправо делать то, чтопытается:.Мы qo/\XHw проверят^имеет ли пользовательправо делать то, чтопытается:.Можноуказать, кашестраницы и комудоступны, создав записив файле webxontig дляопределенных страниц икаталогов.Можноуказать, кашестраницы и комудоступны, создав записив файле webxontig дляопределенных страниц икаталогов.После завершения процесса аутентификации мь【знаем пользователеили знаем, что это анонимный пользователь. Теперь мы должны решить, разрешить ли ему смотреть запрашиваемую им страницу. Это называется ан- торизацией.
Мы qo/\XHw проверят^имеет ли пользовательправо делать то, чтопытается:.
Мы qo/\XHw проверят^имеет ли пользовательправо делать то, чтопытается:.
Можноуказать, кашестраницы и комудоступны, создав записив файле webxontig дляопределенных страниц икаталогов.
Можноуказать, кашестраницы и комудоступны, создав записив файле webxontig дляопределенных страниц икаталогов.
ASP. NET имеет хорошую поддержку контроля доступак .ASPX-страницам. Можно ограничить доступ к страницам, создав записи в файлах web.config вашего приложения (рис 3-27)
<!- Авторизация
Пользователю Simba и всем пользователям, имеющим роль Doctors, позволено получать страницы из этого каталога, а также всех подкаталогов, в которых собственные файлы web.config не изменяют эти параметры.
<authorization>
<a11ow users=<'Simba*' roles="Doctors" />
<deny users="*" />
</authorization>
Рис. 3-27. Авторизационные записи в файле web.config.
Раздел v authorization〉 содержит элементы < allow > и <deny>. которые соответственно разрешают и запрещают указанным пользователям/группам получать доступ к страницам в том каталоге, к которому относится данный файл web.config. Эти элементы могут также содержать атрибут verb (не показан), позволяющий пользователям смотреть страницу с помощью операций get.
но запрещающий отсылать данные на сервер. Хотя файл web. соп- fig относится ко всему каталогу (и к подкаталогам^ если там он не переопределен), вы можете ограничить доступ к единственному файлу элементом <tocation> (не показан).
Правила qccTyna гаэиме-няются в том порядке, вкотором они приведены.Правила qccTyna гаэиме-няются в том порядке, вкотором они приведены.Когда пользователь запрашивает страницу. ASP.NET применяет указанные в файле web.config правила в том порядке, в каком они там приведены, пока не определяет, раз-
Правила qccTyna гаэиме-няются в том порядке, вкотором они приведены.
Правила qccTyna гаэиме-няются в том порядке, вкотором они приведены.
решить или запретить запрашивающему пользователю доступ к странице. Если из данного файла это определить нельзя, ASP. NET просматривает файл web.config в родительском каталоге и так до тех пор, пока не переходит к файлу machine.config, о котором мы уже говорили. Этот файл по умолчанию предоставляет доступ всем запросам. Так что если вы не хотите, чтобы пользователь
видел какую-то страницу, его нужно явно указать в элементе <deny>. Выше ASP, NE1 сначала применит элемент <allow> и, если пользователя зовут «Simba» или он входит в группу «Doctors», доступ будет предоставлен, и процесс проверки завершится (рис. 3-26). Если ни одна из этих проверок не проходит, ASP. NET
применяет следующее правило, которое запрещает доступ всем (символ *). Запрос не будет выполнен, и проверка прекратится. Таким образом, только Doctors и Simba могут смотреть страницы в этом подкаталоге. Заметьте: при Windows-аутентификации
в домене перед именем пользователя или роли нужно указывать имя домена, чтобы ASP. NET могла его распознать (рис. 3-28).
<!— Авторизация
Здесь делается то же, что в предыдущем примере, только перед именем пользователя и роли указывается имя домена Для корректной Windows-аутентификации в домене.
<authorlzation>
<allow use「s="REDH00KESB0\6imba'7>
Ollow roles="REDHOOKESBO\Doctors,'/>
<deny useB— />
</authorization>
Рис. 3-28. Авторизационные записи в файле web.config при Windows-аутентификации в домене.
Симппл ^> позволяетусыновить правадоступа для неаутен-тифицированныхпользователей.Симппл ^> позволяетусыновить правадоступа для неаутен-тифицированныхпользователей.Поскольку есть вероятность, что к нашем'у Web-сайту будут обращаться многие анонимные пользователи — те, кто не прошел аутен^ тификацию, — нам нужен способ указывать, что они могуделать. Вопросительный знак (?) указывает анонимных пользователей. Он применяется так же, как любое имя или символ «*» Пример вы видели выше: файл web.config для аутентификации на основе форм (рис. 3-23). В данном случае неаутентифицированным пользователям не разрешается просматривать страницы в этом
Симппл ^> позволяетусыновить правадоступа для неаутен-тифицированныхпользователей.
Симппл ^> позволяетусыновить правадоступа для неаутен-тифицированныхпользователей.
каталоге, что заставляет их регистрироваться с помощью соответствующей формы.
На практике при авто-ризации чаще всегоприменяются роли,т. е. особые группыпользователей.На практике при авто-ризации чаще всегоприменяются роли,т. е. особые группыпользователей.ASP.NET позволяет авторизовать как отдельныхпользователей, так и группы. На практике авторизацию отдельных пользователей применяют редко, обычно это делается для групп, Так, медицинское приложение может позволять ассистентам прописывать тайленол,
На практике при авто-ризации чаще всего
применяются роли,т. е. особые группыпользователей.
На практике при авто-ризации чаще всего
применяются роли,т. е. особые группыпользователей.
но прописать наркотические вещества имеют право только лицензированные доктора. Эти права устанавливаются для каждой группы, а отдельные пользователи добавляются или удаляются из групп.
一 ASP.ME1 автаматшескц ::определяет принадлежность к группам приприменении Windows- аутентификации.一 ASP.ME1 автаматшескц ::определяет принадлежность к группам приприменении Windows- аутентификации.В случае Windows-аутентификацииSP.NET автоматически распознает роль, если администратор настроил стандартные группы пользователей Windows. Каждый член группы имеели соответствующую роль. Программировать вам ничего не придется, распозна-
一 ASP.ME1 автаматшескц ::определяет принадлежность к группам при
применении Windows- аутентификации.
一 ASP.ME1 автаматшескц ::определяет принадлежность к группам при
применении Windows- аутентификации.
вание происходит автоматически. Однако если аутентификация
производится с помощью cookie или Passport, определение роли значительно усложняется. ASP.NET не знает, как хранятся сведе-
ния о пользователях или что определяет принадлежность к роли в вашем приложении. Следовательно, вам нужно написать свой код и подключить его к среде A5P.NET, чтобы можно было определить принадлежность пользователя к группам. Вам придется написать класс, реализующий интерфейс IPrincipal, содержащий метод /slnRole. В этот метод вы помещаете код, определяющий принадлежность указанного пользователя к группе. (Вы также можете попробовать вызвать класс CenericPrincipal, позволяющий
Чтобь!ь при-надлежность к группе sслучае Passport-аутенти-фикации и cookie-файдов, нужно написатьс(хх I пенный код.Чтобь!ь при-надлежность к группе sслучае Passport-аутенти-фикации и cookie-файдов, нужно написатьс(хх I пенный код.для определения роли пользователей применять простой массив строк.) Ваш класс под・ ключается к ASP.NET методом On Authenticate (если его имя не изменится) в файле gio- bal.asax вашего приложения. ASP.NET вызывает этот класс каждый раз, когда проверяет принадлежность пользователя к указанной
Чтобь!ь при-
надлежность к группе sслучае Passport-аутенти-фикации и cookie-файдов, нужно написатьс(хх I пенный код.
Чтобь!ь при-
надлежность к группе sслучае Passport-аутенти-фикации и cookie-файдов, нужно написатьс(хх I пенный код.
группе (рис. 3-29). Хотя реализовать все это не так сложно, как
Iкажется, я все же предпочел бы иметь для определения ролей простой механизм по умолчанию, чтобы писать собственный код, только если не устраивает стандартный механизм. Поскольку Microsoft сделала это для пользовательских идентификаторов и паролей (см. конец раздела об аутентификации на основе форм), можно было бы легко добавить атрибут принадлежности к роли
к элементу, описывающего пользователя.
Imports System
Imports System.Security
Imports System.Security.Principal
Public Class MyOwnRoleCheckerPrincipal : Implements IPrincipal
Dim Myldentity As Ildentity
Public Sub New(ByRef id As Ildentity)
Myldentityid
End Sub
Public Function IsInRole(ByVal role As String) As Boolean _ Implements System.Security.Principal.IPrincipal, IsInRole
If ( <role checking logic goes here> ) Then Return True
Else
Return False
End If
End Function
<другие методы>
End Class
Рис. 3-29. Код, проверяющий принадлежность к группам при аутентификации с помощью форм или Passport.
Идентификационныеданные
Web-caur обычноявляется средним слоемЗ'уровневой системы,представляя собойсвязующее^ звенос уровнем данньгх.Web-caur обычноявляется средним слоемЗ'уровневой системы,представляя собойсвязующее^ звенос уровнем данньгх.Автоматическая авторизация, обеспечивае- MartASP.NET прекрасноподходит для управления доступом к страницам вашего Web- сайта. Однако ваши Web-страницы обычно находятся в середине 3-уровневой системы, под ними расположен уровень данных (БД). Средний уровень реализует бизнес-логику,
Web-caur обычноявляется средним слоемЗ'уровневой системы,представляя собойсвязующее^ звенос уровнем данньгх.
Web-caur обычноявляется средним слоемЗ'уровневой системы,представляя собойсвязующее^ звенос уровнем данньгх.
например, определяя, является ли пользователь, прописавший морфий, лицензированным доктором. Если это подтверждается, средний уровень должен связаться с уровнем данных, чтобы уменьшить имеющееся в наличие количество морфия и выписать пациентуочередной счет. Если не подтверждается, нужно, видимо, запустить у пользователя увлекательную игру, чтобы он си-
дел на месте, а в это время вызывать полицию.
Ьажно убедится вподлинности процессаWeb-сервера^Ьажно убедится вподлинности процессаWeb-сервера^Уровень данных почти наверняка имеет собственные механизмы защиты. Все коммерческие БД позволяют настраивать права доступа с различным уровнем детализации, ука-
Ьажно убедится вподлинности процессаWeb-сервера^
Ьажно убедится вподлинности процессаWeb-сервера^
зывая, какие пользователи имеют доступ к различным БД и таб-
лицам, а какие нет. Даже файловая система NTFS позволяет
администратору указать, какие пользователи и группы могут вы- поднять те или иные операции с конкретными файлами и каталогами. Все это напрямую связано с тем, как уровень данных определяет подлинность пользователя, выдавшего запрос на обслуживание.
Уровеньданных, какпра вило, дове 卩 яегавторизацию среднемууровню.Уровеньданных, какпра вило, дове 卩 яегавторизацию среднемууровню.Первое и, вероятно, единственное, что вы захотите применить, называется модельюдо- верейного пользователя. В этой модели серверный процесс имеет конкретные идентификационные данные, например Pharmacy-
Уровеньданных, какпра вило, дове 卩 яегавторизацию среднемууровню.
Уровеньданных, какпра вило, дове 卩 яегавторизацию среднемууровню.
Арр, известные как доверенный пользователь. Уровень данных настроен так, чтобы разрешить ему выполнять те действия, которые позволят выполнить необходимую работу. Например, до- верепному пользователю в фармацевтическом приложении нужно позволить делать записи в таблицы препаратов и счетов пациентов, но, видимо, не в таблицы с личными сведениями о пациентах и не в платежные ведомости сотрудников. Уровень
данных доверяет серверу среднего уровня в том, что касается авторизации, например, что лицензия доктора действительна и повторную авторизацию производить не нужно. Если вы доверяете супруге свой бумажник, вас не волнует, как будут потрачены деньги. Такая взаимосвязь показана ниже (рис, 3-30). Вы указываете идентификационные данные серверного процесса в элементе < identity> в файле web.config вашего приложения (рис. 3-31).
1. Различные удаленные клиенты,1. Различные удаленные клиенты,2. Среднийуровень приложения, выполняющий аутен™фикаи11ю.2. Среднийуровень приложения, выполняющий аутен™фикаи11ю.БД доверяет авторизации, проведенной средним уровнем и предоставляем ему полный доступ.БД доверяет авторизации, проведенной средним уровнем и предоставляем ему полный доступ.Рис. 3-30. Модель авторизации с доверенным пользователем.Рис. 3-30. Модель авторизации с доверенным пользователем.
1. Различные удаленные клиенты,
1. Различные удаленные клиенты,
2. Среднийуровень приложения, выполняющий аутен™фикаи11ю.
2. Среднийуровень приложения, выполняющий аутен™фикаи11ю.
БД доверяет авторизации, проведенной средним уровнем и предоставляем ему полный доступ.
БД доверяет авторизации, проведенной средним уровнем и предоставляем ему полный доступ.
Рис. 3-30. Модель авторизации с доверенным пользователем.
Рис. 3-30. Модель авторизации с доверенным пользователем.
<identity impersonate二”—”
use rName="MyDon?ain\My Username
password=''My Password1' />
Рис. 3-31. Файл web.config указывает
идентификационные данные серверного процесса.
ASP.NET предостабляетобъект, позволяющийвашему коду проверятьидемтиф икационныеданные пользователя.ASP.NET предостабляетобъект, позволяющийвашему коду проверятьидемтиф икационныеданные пользователя.Код вашей .ASPX-страницы может выполнять собственную авторизацию, используя внут- реннийобъекп User. Метод IsInRole последнего позволяет определить, включен ли пользователь в административную группу. Концептуально это совпадает с применением анало-
ASP.NET предостабляетобъект, позволяющийвашему коду проверятьидемтиф икационныеданные пользователя.
ASP.NET предостабляетобъект, позволяющийвашему коду проверятьидемтиф икационныеданные пользователя.
гичного метода в СОМ+. Обычно этим можно ограничиться, Если
вы хотите углубиться и работать с отдельными пользователями,
можете задействовать свойство Identity объекта User. При этом вы получите интерфейс I Identity который укажет имя аутентифи-
цированного пользователя и алгоритм, применявшийся для его аутентификации. Можете написать свой код, который будет обращаться к этим сведениям, чтобы решить, имеет ли пользова-
17€.
тель право делать то, что хочет. В рассмотренном ранее примере с Windows-аутентификацией показана такая программная авторизация. Пример и код страницы, осущест вляю ии,ей авторизацию, показаны ниже (рис. 3-32 и 3-33).
I( гфогитпй* ... ..■■♦.А4ЛЙI( гфогитпй* ... ..■■♦.А4ЛЙDoctors can prescribe morphine or Tylenol. Nurses can prescribe onlyTylenolDoctors can prescribe morphine or Tylenol. Nurses can prescribe onlyTylenolYou are logged in as user KEDHOOKESBOXSeussYou are logged in as user KEDHOOKESBOXSeuss
I( гфогитпй* ... ..■■♦.А4ЛЙ
I( гфогитпй* ... ..■■♦.А4ЛЙ
Doctors can prescribe morphine or Tylenol. Nurses can prescribe onlyTylenol
Doctors can prescribe morphine or Tylenol. Nurses can prescribe onlyTylenol
You are logged in as user KEDHOOKESBOXSeuss
You are logged in as user KEDHOOKESBOXSeuss
Choose drug to prescnbe:
卜Soigine 习
Submit pr&scopliar
Рис. 3-32. Пример Web-страницы с авторизацией на базедоверенного пользователя.
Public Sub Button1_Click(ByVal sender As Object, _
ByVal e As System.EventArqs)
Session( 'DrugName'') =
SessionC'Result")= "OK"
” Если пользователь пытается прописать морфий и не входит ' в группу "Doctors", не выполнять запрос.
If DropDownListl.Selectedltein,Text = "Morphine" Then
If (User. IsInRole( "Doctorsr') = False) Then Session("Result") = "BAD"
End If
End If
Response,Redi rect('ScripfiesuH.aspx")
End Sub
Рис. 3-33. Код Web-страницыс авторизацией
на базе доверенного пользователя.
Иногда модель с goee-ренным пользователемне подходит.Иногда модель с goee-ренным пользователемне подходит.В этом случаеWeb-cep-вер может заимствовать■ права клиента, еслитребуется Windows-аутентификация .пользователя (или данные, предназ-В этом случаеWeb-cep-вер может заимствовать■ права клиента, еслитребуется Windows-аутентификация .пользователя (или данные, предназ-L Различныеудаленные клиенты.L Различныеудаленные клиенты.2. Сервер среднего уровня заимствует права удаленного клиента.2. Сервер среднего уровня заимствует права удаленного клиента.3. БД проводит собственную авторизацию на основании идентификационных данных удаленного клиента.3. БД проводит собственную авторизацию на основании идентификационных данных удаленного клиента.Рис. 3-34. Модель авторизации с заимствованием прав и делегированием.Рис. 3-34. Модель авторизации с заимствованием прав и делегированием.
Иногда модель с goee-ренным пользователемне подходит.
Иногда модель с goee-ренным пользователемне подходит.
В этом случаеWeb-cep-вер может заимствовать■ права клиента, еслитребуется Windows-аутентификация .
пользователя (или данные, предназ-
В этом случаеWeb-cep-вер может заимствовать■ права клиента, еслитребуется Windows-аутентификация .
пользователя (или данные, предназ-
L Различные
удаленные клиенты.
L Различные
удаленные клиенты.
2. Сервер среднего уровня заимствует права удаленного клиента.
2. Сервер среднего уровня заимствует права удаленного клиента.
3. БД проводит собственную авторизацию на основании идентификационных данных удаленного клиента.
3. БД проводит собственную авторизацию на основании идентификационных данных удаленного клиента.
Рис. 3-34. Модель авторизации с заимствованием прав и делегированием.
Рис. 3-34. Модель авторизации с заимствованием прав и делегированием.
He со всеми БД такой подход удобен. Многие базы были созданы, а их администраторы обучены до того, как 3-уровневая модель стала популярной. В особенности в старых
системах уровень БД содержит проверки безопасности и ведение аудита, привязанные к конкретным клиентам.
В этом случае, если используется Windows- аутентификация, можно вернуться к более старой модели заимствования прав и делегирования (impersonation-delegation), применявшуюся в старой ASP. В этой модели код .ASPX-страницы берет («заимствует») идентификационные данные аутентифицированного применяет специальные идентификационные
наченные для анонимных пользователей). Затем код страницы
пытается получить доступ к ресурсам уровня БД и сам ресурс. скажем, SQL-сервер, выполняет авторизацию, проверяет, имеет ли пользовательдоступ (рис. 3-34).
Модель заимствованияправ и делегированияснижает произво-дительность.Модель заимствованияправ и делегированияснижает произво-дительность.
Модель заимствованияправ и делегированияснижает произво-дительность.
Модель заимствованияправ и делегированияснижает произво-дительность.
Этот внешне привлекательный подход дорого обходится в плане производительности. Он требует две аутентификации, а не одну: одну — когда ASP.NET аутентифицирует пользователя, прежде чем заимствовать его
права, и вторую — когда БД аутентифицирует заимствованные
сервером идентификационные данные. Больше того, время теряется, даже когда пользователю отказывается в доступе. Приходится проходить все три уровня, а не два и делать два сетевых запроса, а не один. Лучше, если вы вспомнили, что забыли бумажник, когда пришли в магазин, а не после того, как взяли, что нужно, и отстояли очередь в кассу. Еще лучше, если вы вспомните об этом, садясь в машину.
& случае Windows-аутен^ тификации можно npg раммно передавать пра- за клиента Web-серверу.& случае Windows-аутен^ тификации можно npg раммно передавать пра- за клиента Web-серверу.Web-сервер заимствует права клиента одним из двух способов. Старая ASP автоматически заимствует права клиента каждый раз, когда делается запрос. ASP.NET no умолчанию этого не делает, но можно разрешить эту
& случае Windows-аутен^ тификации можно npg раммно передавать пра- за клиента Web-серверу.
& случае Windows-аутен^ тификации можно npg раммно передавать пра- за клиента Web-серверу.
функцию, установив атрибут mpersonation в True в файле web.con- fig (рис. 3-35). Другой способ — вызов функции System.Sec- urity.Principal. Windowsldentity.CetCurrenff ? Impersonate.
<identity>
<impersonation enable="true" />
</identity>
Рис. 3-35. Параметры web .configдля автоматического заимствования прав.
Web-страница, демонстрирующая автоматическое заимствование прав, выглядит так (рис. 3-36):
“btrl .7• J . : j JL-., *J***W»* 9Ks*flTV _、■“
AgdmM ||Ц tp:/,'i«borf«b/ ■4F»'ve'»«*'sti>nder»o).,»itfnn» I asp' JJ ^Gft lt*t *
—;:~~:3
ImpersonationDemonstration
The current user is: REDHOOKESBO'Dave aiithenticated
by type: Negotiate
The seeing principal is: NT AUTHORrrY\SYSTEM
imparsonam 吋 “L I
痉 qdrgwt
Рис, 3-36, Пример Web-приложения .демонстрирующего заимствование прав.
* E* ?* 弋0** 2<* tHc* E* ?* 弋0** 2<* tHcJ £ 窃,Jxe ijPf f 夕уJ £ 窃,Jxe ijPf f 夕у“■*%£ I W^,;fMfJv>i»U»)diEe".Vgir~«*4он '“■*%£ I W^,;fMfJv>i»U»)diEe".Vgir~«*4он '•4R»W«»*^*v".•4R»W«»*^*v".二J—二J—
* E* ?* 弋0** 2<* tHc
* E* ?* 弋0** 2<* tHc
J £ 窃,Jxe ijPf f 夕у
J £ 窃,Jxe ijPf f 夕у
“■*%£ I W^,;fMfJv>i»U»)diEe".Vgir~«*4он '
“■*%£ I W^,;fMfJv>i»U»)diEe".Vgir~«*4он '
•4R»W«»*^*v".
•4R»W«»*^*v".
二J—
二J—
Impersonation Demonstration
The ciment iiset is: REDHOOKESBO^Dave authenticated by type:
Negotiate
鹵 их」к*тж«1鹵 их」к*тж«1The security principal is: REDHOOKESBO'.Bave
鹵 их」к*тж«1
鹵 их」к*тж«1
Рис. 3-36. (продолжение)
Управление процессом
Важнейшее качествоWeb-сервера — егоустойчивость прибольших нагрузках.Важнейшее качествоWeb-сервера — егоустойчивость прибольших нагрузках.Одно из главных свойств, которое хочется видеть у Web-сервера — это его способность работать 24 часа в сутки, 7 дней в неделю без нашего вмешательства. С проблемой реализации сервиса такого уровня никогда не стал-
Важнейшее качествоWeb-сервера — егоустойчивость прибольших нагрузках.
Важнейшее качествоWeb-сервера — егоустойчивость прибольших нагрузках.
кивались разработчики настольных приложений. Так, утечки памяти в Пасьянсе, который каждый раз запускается на 5 минут
(ладно, на 2 часа), вероятно, никогда не займут столько памяти,
чтобы что-то испортить. Но если я оставлю Пасьянс работать це-
лый год, все время пересдавая карты, любые утечки памяти при-
ведут к тому, что адресное пространство процесса рано или поздно будет исчерпано и это приведет к аварии.
Это чрезвычайнотрудно реализоеать,Да и описать.Это чрезвычайнотрудно реализоеать,Да и описать.Такого рода надежность очень трудно реализовать отчасти потому, что требуется длительное тестирование. Единственная возможность проверить, работает ли что-то в ус-
Это чрезвычайнотрудно реализоеать,Да и описать.
Это чрезвычайнотрудно реализоеать,Да и описать.
ловиях нагрузки в течение двух недель, — это проводить проверку в течение двух недель. И когда авария происходит, зачастую это связано с какой-то ерундой, которая произошла накануне, что
решительно невозможно понять в момент аварии.
Однажды (12 лет назад) я писал приложение для солидного банка. Это была DOS-система (помните DOS?), которая могла работать целый день, но проработать без аварии неделю была не спо-
Большая часть прог рамм гребует nepuo- :дическо?о перезапуска.Большая часть прог рамм гребует nepuo- :дическо?о перезапуска.собна, и выловить ошибки мы были не в состоянии. V меня появилась блестящая идея поставить в машину плату со сторожевым таймером, который наша программа должна
Большая часть прог рамм гребует nepuo- :дическо?о перезапуска.
Большая часть прог рамм гребует nepuo- :дическо?о перезапуска.
была периодически сбрасывать. Если таймер переполнялся, не будучи сброшенным, это приводило к перезагрузке системы. Банк не захотел использовать такое сляпанное наспех решение (надо им было о нем не говорить —! просто сделать и жить спокойно) и вместо этого обязал администратора перезагружать систему каж- дь(й вечер.
ASP.NET поддерживаетутиЛУКАЛцию процессов,чтобы продолжатьработу, столкнувшисьс неверным пользова-тельским кодом.ASP.NET поддерживаетутиЛУКАЛцию процессов,чтобы продолжатьработу, столкнувшисьс неверным пользова-тельским кодом.Старая ASP подрерживаел бесконечную работу пользовательского процесса. Любые ошибки и утечки памяти в пользовательских программах аккумулируются и в какой-то момент приводят к аварии. В ASP.NETучиты- вается, что пользовательский- код можетс»Ь|ТЬ неидеальным. Поэтому администратор мо-
ASP.NET поддерживаетутиЛУКАЛцию процессов,чтобы продолжатьработу, столкнувшисьс неверным пользова-тельским кодом.
ASP.NET поддерживаетутиЛУКАЛцию процессов,чтобы продолжатьработу, столкнувшисьс неверным пользова-тельским кодом.
жет настроить сервер для периодического отключения и перезапуска рабочих процессов. Такая утилизация процесса настраивается элементом <proce$sModel> в файле machine.config на уровне компьютера (рис. 3-37). Было бы здорово, если бы Microsoft позволила настраивать работу процессов на уровне приложения, но на момент написания этой книги этого сделано не было. Вы можете указать ASP.NET отключить рабочий процесс и вызвать новый через заданный интервал (атрибут timeout) после определенного количества запросов страниц (атрибут requestLimit] или при превышении лимита используемой памяти (атрибут memory Limit). Хотя это и не значит, что мы можем расслабиться и писать ненадежный код, это все же позволяет работать с небольшими утечками памяти без ежедневной перезагрузки процесса
настраквдется в файле сервера. Как вы можете заметить, при на- machine.config. I стройке процесса можно использовать и другие параметры.
<processModel enable -"true" timeoijt="infinite" idl6Timeout="infinite" shutdownTiffleaut=,,0:00:05" requestLImi't=" infinite" requestQueueLimit="5000T, memory Limlt^^^80'^ webGarden="false" cpuMask="Oxffffffff" userh/ame="" password='r"
logLevel="errors"
clientConnectedCheck="0:00:05" />
Рис. 3-37. Параметры утилизации процесса в файле machine.config.
Глава 4
Web-службы .NET
Канон совместный — их и мой — в затверженном звучанье: «Закон, Порядок, Служба.Долг, Надежность, Послушанье!» Так их сработали навек, такую мысль внуша, —
Подумать может человек, что есть у них душа.
Р. Киплинг обпсихики, необходимой
для работы с высокими технологиями.
(«Молитгза МакЭндрю», 1894г.)
Суть проблемы
Сегодняшняя структураИнтерн ета такова, что внем содержатся понят-ныелюдям сведения,а не данныедляобработки клиентскимипрограммами. .Сегодняшняя структураИнтерн ета такова, что внем содержатся понят-ныелюдям сведения,а не данныедляобработки клиентскимипрограммами. .Описанная з этой книге базовая модель взаимодействия с пользователем не изменилась с тех пор, как в CERN (Женева) создали Web, чтобы просматривать скучные отчеты о физических экспериментах, Человек (или, как это было в популярном мультф ильме.. собака] запрашивает с сервера страницу с помощью
Сегодняшняя структураИнтерн ета такова, что внем содержатся понят-ныелюдям сведения,а не данныедляобработки клиентскимипрограммами. .
Сегодняшняя структураИнтерн ета такова, что внем содержатся понят-ныелюдям сведения,а не данныедляобработки клиентскимипрограммами. .
универсальной программы-браузера, сервер декодирует запрос и передает страницу, браузер готовит ее для просмотра человеком, который, читая ее, мужественно борется со сном. Проблему скуки во многом удалось решить, улучшив информационное наполнение страниц (помещая на них итоги спортивных событий, порнографию, замысловатые музыкальные клипы Эла Янковича [)г но конечным потребителем запрошенных данных все равно ос-
тается человек, а не компьютерная программа.
Его оесел)^ пародию на Звездные войны можно увидеть по адресу www.sagabegins.com.
Человечество получитерошдную пользу( еслиспециальные программысмогут запрашивать^«понимать» и использо-вать ааннь!б из Интер-нета так же легко, какэто делают люди.Человечество получитерошдную пользу( еслиспециальные программысмогут запрашивать^«понимать» и использо-вать ааннь!б из Интер-нета так же легко, какэто делают люди.Интернеттем и хорош, что вездесущ. К нему подключены все (а если не все, то скоро остальные подключатся) интеллектуальные ус- | тройства на планете. Пользователи пожнут ••: великую выгоду, если Web-серверы смогут обеспечивать данными программы, под управлением которых работают все многочисленные устройства, так же легко, как они
Человечество получитерошдную пользу( еслиспециальные программысмогут запрашивать^«понимать» и использо-вать ааннь!б из Интер-нета так же легко, какэто делают люди.
Человечество получитерошдную пользу( еслиспециальные программысмогут запрашивать^«понимать» и использо-вать ааннь!б из Интер-нета так же легко, какэто делают люди.
создают страницы для людей. Например, разработчики смогут существенно улучшить вид своих программ для пользователя, применяя вместо посредственного интерфейса (который работает в браузере), поддерживаемого сервером, замечательные специализированные интерфейсы, работающие на клиентской машине. Подумайте, насколько легче работать с электронной почтой через специализированный интерфейс Microsoft Outlook, no сравнению с универсальным интерфейсом Hotmail на основе браузера (но мы и это можем испортить дурацким интерфейсом - смерть танцующей скрепке!). Разработка специализированных пользовательских интерфейсов позволит повысить производительность серверов, если перенести форматирование данных для представления пользователю на клиентскую машину: представьте, что каждый из 1 000 клиентов будет сам форматировать для себя данные, а не единственный сервер будет заниматься форматированием данных для 1 000 клиентов. Обеспечение различных устройств данными через Интернет позволит создать программы вообще без пользовательского интерфейса, например, программу для банковского аудита. Это позволит повсеместно использовать связь через Интернет, не разделяя прикладную логику программ на страничные запросы. Аналогичным образом это обеспечит появление нового поколения некомпьютерных Интер- нет-устройств, например телефонов, которые будут выполнять изсе свои функции, используя Интернет вместо стандартных телефонных линии.
Сегодняшняя ситуация, когда доступ в Интернет осуществляется, главным образом, через универсальную программу-браузер, напоминает начало XX века, когда электричество только появилось в домах американцев. Тогда вся домашняя техника была еще без встроенных электромоторов. Поэтому компания Sears, например, продавала отдельный электродвигатель (по 8 долларов 75
Решать конкретные задачи с помощью специализированного аппаратного и программного обеспечения легче, чем делать все с по- Мишин) оиного vhubpd сального устройстваРешать конкретные задачи с помощью специализированного аппаратного и программного обеспечения легче, чем делать все с по- Мишин) оиного vhubpd сального устройствацентов)2 / который можно было приладить ко всякой домашней технике: к швейной машине, миксеру или вентилятору. Ситуация была затруднительная, поскольку прежде чем использовать какой-нибудь аппарат, к нему приходилось подключать мотор и настраивать его. Как правило, денег хватало лишь на один мотор, поэтому, чтобы заштопать какую-либо
Решать конкретные задачи с помощью специализированного аппаратного и программного обеспечения легче, чем делать все с по- Мишин) оиного vhubpd сального устройства
Решать конкретные задачи с помощью специализированного аппаратного и программного обеспечения легче, чем делать все с по- Мишин) оиного vhubpd сального устройства
вещь в жаркий день, приходилось выбирать между швейной машиной и вентилятором. А если к тому же приборов, к которым
было нужно подключить мотор, было много, часто ни один из них толком не работал. Но по мере того, как моторы становились все меньше и дешевле, их стали встраивать в каждый аппарат. Эта
тенденция дошла до того, что сегодня практически невозможно найти зубную щетку или разделочный нож без моторчика внутри. Современная бытовая техника проста в использовании, поскольку моторы и их инфраструктура (блоки питания, передачи и т. д.) оптимизированы для решения конкретной задачи и даже не видны снаружи. Не задумываясь о них, вы просто включаете прибор и взаимодействуете с его специализированным интерфейсом.
Такого же рода революция начинается и в программировании для Интернета. Подобно тому, как моторы стали встраивать в каждый бытовой прибор, в любую написанную программу скоро будут внедрять средства доступа в Интернет. Вам не понадобится универсальный браузер, если только вы не собираетесь просто побродить по страницам. Вместо этого вы будете использовать специализированные программы, оптимизированные дпя решения конкретных задач. Вы не будете думать о том, как программа выходит в Интернет, как не задумываетесь о моторах в бытовой технике (пока они работают нормально и не ломаются, что зерно и для специализированных программ, использующих доступ в Интернет). Примером первых программ этого типа может служить Napster, который позволяет искать на жестких дисках тысяч участников программы музыкальные файлы согласно заданным критериям и загружать понравившиеся. Экран этой программы, которая ищет песни, бесплатно распространяемые ис-
Изображение этого продукта от Sears находится в книге Дональда Нормана The Invisible computer (MIT Press, 19991 на стр. 50.
полнителями через Интернет, показан ниже (рис. 4-1). Другой пример программы со «скрытым» доступом в Интернет — специализированный интерфейс многопользовательской игры. Самая последняя редакция Microsoft Money делает полезные вещи? незримо объединяя данные из Web (текущие биржевые котировки и балансы) с содержимым рабочего стола (с локально созданными финансовыми расчетами).
Разработчики адутсоздавать приложения,компонуя их издоступных 8 Web служб,так же( как они сейчасстроят программы изготовых компонентов налокальных машинах.Разработчики адутсоздавать приложения,компонуя их издоступных 8 Web служб,так же( как они сейчасстроят программы изготовых компонентов налокальных машинах.Программные средства, обеспечивающие легкий доступ вИнтернет, позволят разработчикам компоновать приложения из доступных через Web служб так же, как они сегодня строят их из готовых компонентов на локальных ПК, Разработч и к текстовогопро- цессора, который считается типичным автономным приложением, в этом случае может
Разработчики адутсоздавать приложения,компонуя их издоступных 8 Web служб,так же( как они сейчасстроят программы изготовых компонентов налокальных машинах.
Разработчики адутсоздавать приложения,компонуя их издоступных 8 Web служб,так же( как они сейчасстроят программы изготовых компонентов налокальных машинах.
включить в программу лишь элементарные средства проверки орфографии или вовсе не включать их. Для проверки сложной орфографии или при необходимости обратиться к толковому словарю текстовый процессор может подключаться к онлайновой редакции Oxford English Dictionary, расположенной на сайте oed.com. Этот словарь скромно называется «самым авторитетным и полным в мире словарем английского языка» За подписку на рабо-
В настоящее время я пытаюсь заставить редакционную коллегию OED включить в словарь слово, которое я «родил» в статье, опубликованной журналом Byte.com 23 августа 1999г. Это слово — MINFU, аббревиатура в стиле казарменных сокращений SNAFU и FUBAR (сокращения от довольно жестких американских ругательстн — Прим. Перес.) которые прочно вошли в повседневное употребление. Словом MINFU в определенных кругах часто величают так называемый Microsoft Nomenclature Foul-Up (терминологическую неразбериху Microsoft]. Например, называть активизацию на месте {in-卩 las activation) внедренного объекта “визус ным редактированием» (я так понимаю, чтобы не путать его с осязательным и обонятельным) — это MINFU. Все терминологическое фиаско с COM-OLE-COM-ActiveXCOMбыло и по сей день остается одним гигантским MINFU. На мое письмо из OED пришел аежливыи ответ. где, в частности, было сказано: «.. .есшмы не найдем более общеупотребительный вариант, то рассмотрим возможность его включения в ОЕ6・ В настоящее время пара авторов использует это слово, из которых самый известный ■” Дэвид Чеппел (David Chappel). Надеюсь, вы все будете использовать это слово в своих произведениях и пришлете мне ссылки на них, которые я перешлю в OED, Не надо благодарности — используйте это слово на здоровье (если я смогу протащить его через Microsoft Press).
Доступ в Интернет : должен быть встроен в каждую специализированную программу, а не доступен только через уннверсальн ы йбраузер.Доступ в Интернет : должен быть встроен в каждую специализированную программу, а не доступен только через уннверсальн ы йбраузер.:-* - ]< 5««d*:-* - ]< 5««d*?MK>F«kh?MK>F«khвается, если пользователь не заплатит.вается, если пользователь не заплатит.ScneT* I m* a— fTOwF^Ui I Fni fScneT* I m* a— fTOwF^Ui I Fni f33233323U j У* I ・<*♦ JAivdmMl ; «vb |ФТСНЛЦ “★eylMГ/ез*ку пыл R j~Pnjj T e «щц br I^«SoHC vu*b* [U j У* I ・<*♦ JAivdmMl ; «vb |ФТСНЛЦ “★eylMГ/ез*ку пыл R j~Pnjj T e «щц br I^«SoHC vu*b* [MlQiJSjMlQiJSj•Jr^ii.i 'Jeaj tai Веи: ЕамЬ 啪吧毋単 • прЗ '-'^i. Те-sr uBba Radflli aggie Gyp 的 m(j37 *•or Bert; ^Oiling гmy tWeef babw arm; TIP:•Jr^ii.i 'Jeaj tai Веи: ЕамЬ 啪吧毋単 • прЗ '-'^i. Те-sr uBba Radflli aggie Gyp 的 m(j37 *•or Bert; ^Oiling гmy tWeef babw arm; TIP:'<•«« , lor Beeii - FU京 i^gle&y驚ymp: -Of &"<»^*- s lor 0?eis -••iesXMAFiri'-'E ~ ea;*or Baas-FI les\MАР, IИ M E -tea; !<a bew s -III mp3'<•«« , lor Beeii - FU京 i^gle&y驚ymp: -Of &"<»^*- s lor 0?eis -••iesXMAFiri'-'E ~ ea;*or Baas-FI les\MАР, IИ M E -tea; !<a bew s -III mp3':'-'My Fiie?'<MAF|lTIME-Teai.;lnt Beers-°M^ File^MARlTlME-Wlffi Beers -It Out M"y mp3?"” EkJMARl TIME-1?9Hfor -':'-'My Fiie?'<MAF|lTIME-Teai.;lnt Beers-°M^ File^MARlTlME-Wlffi Beers -It Out M"y mp3?"” EkJMARl TIME-1?9Hfor -—¥;戏二 3.781 255日如 i3 735.552 2:971.458 4 224.435 •Э55Й42748.450 3.52D.559 3J的旣?—¥;戏二 3.781 255日如 i3 735.552 2:971.458 4 224.435 •Э55Й42748.450 3.52D.559 3J的旣?I /5^丄 5r」q»”gMiLI /5^丄 5r」q»”gMiLMlbt: 56 bd團UIUG.'rDelbert.Kt 眩! 1Г Weld% uuiil」$WildfeUlg149w・」—♦414“1IQy1“,,;丁 rm#,W•■*:■Ulll(]J JOgc...…6U“ijKI Ig-j®Mlbt: 56 bd團UIUG.'rDelbert.Kt 眩! 1Г Weld% uuiil」$WildfeUlg149w・」—♦414“1IQy1“,,;丁 rm#,W•■*:■Ulll(]J JOgc...…6U“ijKI Ig-j®生,.MflCem 4it M«rtei» %l MoX * SO —, R.MWb, U*wx、・5ЕМ,3»г >3 Mader f。Mcdur, W Moaen 5W H:den生,.MflCem 4it M«rtei» %l MoX * SO —, R.MWb, U*wx、・5ЕМ,3»г >3 Mader f。Mcdur, W Moaen 5W H:den!0Hiw fx№bl' —ria I?1 Sb.!0Hiw fx№bl' —ria I?1 Sb.C»*>«*tv DCun^f" ^<!^мк «««Нй v, А,4Л^ tt>«*mC»*>«*tv DCun^f" ^<!^мк «««Нй v, А,4Л^ tt>«*mРис. 4・L Пользовательский интерфейс программы Napster, специализированного приложения, использующего доступ в Интернет.Рис. 4・L Пользовательский интерфейс программы Napster, специализированного приложения, использующего доступ в Интернет.Чтобы создавать такие программы, разработчикам нужна возможность быстро и лег^ ко (т. е. без особых затрат) писать код, взаимодействующий с другими программами через Интернет. Идея не нова, существует несколько методик такого взаимодействия: RPC, DCOM и MSMQ. Каждая из них сама поЧтобы создавать такие программы, разработчикам нужна возможность быстро и лег^ ко (т. е. без особых затрат) писать код, взаимодействующий с другими программами через Интернет. Идея не нова, существует несколько методик такого взаимодействия: RPC, DCOM и MSMQ. Каждая из них сама поУстройства, использую-щие наиболее захваты-вающие коммуника-ционные технологии,работают исключи-тельно друг с другом.Устройства, использую-щие наиболее захваты-вающие коммуника-ционные технологии,работают исключи-тельно друг с другом.
Доступ в Интернет : должен быть встроен в каждую специализированную программу, а не доступен только через уннверсальн ы йбраузер.
Доступ в Интернет : должен быть встроен в каждую специализированную программу, а не доступен только через уннверсальн ы йбраузер.
:-* - ]< 5««d*
:-* - ]< 5««d*
?MK>F«kh
?MK>F«kh
вается, если пользователь не заплатит.
вается, если пользователь не заплатит.
ScneT* I m* a— fT
OwF^Ui I Fni f
ScneT* I m* a— fT
OwF^Ui I Fni f
3323
3323
U j У* I ・<*♦ J
AivdmMl ; «vb |ФТСНЛЦ “★eylM
Г/ез*ку пыл R j~
Pnjj T e «щц br I
^«SoHC vu*b* [
U j У* I ・<*♦ J
AivdmMl ; «vb |ФТСНЛЦ “★eylM
Г/ез*ку пыл R j~
Pnjj T e «щц br I
^«SoHC vu*b* [
MlQiJSj
MlQiJSj
•Jr^ii.i 'Jeaj tai Веи: ЕамЬ 啪吧毋単 • прЗ '-'^i. Те-sr uBba Radflli aggie Gyp 的 m(j3
7 *•or Bert; ^Oiling гmy tWeef babw arm; TIP:
•Jr^ii.i 'Jeaj tai Веи: ЕамЬ 啪吧毋単 • прЗ '-'^i. Те-sr uBba Radflli aggie Gyp 的 m(j3
7 *•or Bert; ^Oiling гmy tWeef babw arm; TIP:
'<•«« , lor Beeii - FU京 i^gle&y驚ymp: -Of &"<»^*
- s lor 0?eis -
••iesXMAFiri'-'E ~ ea;*or Baas-
FI les\MАР, IИ M E -tea; !<a bew s -III mp3
'<•«« , lor Beeii - FU京 i^gle&y驚ymp: -Of &"<»^*
- s lor 0?eis -
••iesXMAFiri'-'E ~ ea;*or Baas-
FI les\MАР, IИ M E -tea; !<a bew s -III mp3
':'-'My Fiie?'<MAF|lTIME-Teai.;lnt Beers-
°M^ File^MARlTlME-Wlffi Beers -It Out M"y mp3
?"” EkJMARl TIME-1?9Hfor -
':'-'My Fiie?'<MAF|lTIME-Teai.;lnt Beers-
°M^ File^MARlTlME-Wlffi Beers -It Out M"y mp3
?"” EkJMARl TIME-1?9Hfor -
—¥
;戏二 3.781 255日如 i
3 735.552 2:971.458 4 224.435 •Э55Й4
2748.450 3.52D.559 3J的旣?
—¥
;戏二 3.781 255日如 i
3 735.552 2:971.458 4 224.435 •Э55Й4
2748.450 3.52D.559 3J的旣?
I /5^丄 5r」q»”gMiL
I /5^丄 5r」q»”gMiL
Mlbt: 56 bd團
UIUG.'rDelbert.
Kt 眩! 1Г Weld% uuiil」$Wildfe
Ulg149w・」—
♦414“1IQy1
“,,;丁 rm#,W
•■*:■
Ulll(]J JOgc...…6
U“ijKI Ig-j®
Mlbt: 56 bd團
UIUG.'rDelbert.
Kt 眩! 1Г Weld% uuiil」$Wildfe
Ulg149w・」—
♦414“1IQy1
“,,;丁 rm#,W
•■*:■
Ulll(]J JOgc...…6
U“ijKI Ig-j®
生,.MflCem 4it M«rtei» %l MoX * SO —, R.MWb, U*wx、・
5ЕМ,3»г >3 Mader f。Mcdur, W Moaen 5W H:den
生,.MflCem 4it M«rtei» %l MoX * SO —, R.MWb, U*wx、・
5ЕМ,3»г >3 Mader f。Mcdur, W Moaen 5W H:den
!0Hiw fx№bl' —ria I?1 Sb.
!0Hiw fx№bl' —ria I?1 Sb.
C»*>«*tv DCun^f" ^<!^мк «««Нй v, А,4Л^ tt>«*m
C»*>«*tv DCun^f" ^<!^мк «««Нй v, А,4Л^ tt>«*m
Рис. 4・L Пользовательский интерфейс программы Napster, специализированного приложения, использующего доступ в Интернет.
Рис. 4・L Пользовательский интерфейс программы Napster, специализированного приложения, использующего доступ в Интернет.
Чтобы создавать такие программы, разработчикам нужна возможность быстро и лег^ ко (т. е. без особых затрат) писать код, взаимодействующий с другими программами через Интернет. Идея не нова, существует несколько методик такого взаимодействия: RPC, DCOM и MSMQ. Каждая из них сама по
Чтобы создавать такие программы, разработчикам нужна возможность быстро и лег^ ко (т. е. без особых затрат) писать код, взаимодействующий с другими программами через Интернет. Идея не нова, существует несколько методик такого взаимодействия: RPC, DCOM и MSMQ. Каждая из них сама по
Устройства, использую-щие наиболее захваты-вающие коммуника-ционные технологии,работают исключи-тельно друг с другом.
Устройства, использую-щие наиболее захваты-вающие коммуника-ционные технологии,работают исключи-тельно друг с другом.
ту с этим сайтом надо платить, и пока что он доступен людям лишь через универсальные браузеры. Поддержка встроенного доступа к OED в программах позволила бы намного повысить объемы продаж подписки. Возможно, производители текстовых процессоров смог-
ли бы снизить плату за подписку. Самым умным решением было
бы давать пробную версию программы со встроенным доступом,
которая работала бы несколько месяцев бесплатно. За это время у пользователя должна развиться зависимость от этой про-
граммы, а по окончании испытательного периода доступ закры-
себе замечательна, а два-три года назад они представляли собой неплохие идеи, Но у них у всех одноограниче
ние: любая из этих систем может работать только с аналогичной —может «разговаривать» только скли
ент DCOM — только с сервером DCOM и т. д.
Необходимо универсальное межпрограммное взаимодействие q черезканалы Интернета.Необходимо универсальное межпрограммное взаимодействие q черезканалы Интернета.Что нужно на самомтак это универсальныйдоступ в Интернет,
Необходимо универсальное межпрограммное взаимодействие q через
каналы Интернета.
Необходимо универсальное межпрограммное взаимодействие q через
каналы Интернета.
:программе из одного устрой
ства вызвать функцию, написанную кем
Такой доступ не но и от
внутренней реализации программы. (То есть
нена каком языке она написана — на C + + или BASIC'e,
кто ее производитель, какая версия программы. Нам еле-еле удается справиться с этим даже на единственном автономном пьютере. Этот доступ должен быть простым в использовании, иначе никто не захочет тратить время на написание программ, использующих его.
Архитектура решения
Принароднымии универсальнымв Интернетвозникают сходныепроолемы.Принароднымии универсальнымв Интернетвозникают сходныепроолемы.Проблема универсального программного доступа в Интернетпроблеме, с
При
народными
и универсальным
в Интернетвозникают сходныепроолемы.
При
народными
и универсальным
в Интернетвозникают сходныепроолемы.
которой сталкиваются разработчики систем управления международными полетами. Чле- меняющегося набора гетероген- узлов (самолеты различных типов) дол-
жныс фиксированными
серверами (диспетчерскими управления полетами) и между
Внутренние способы работы программ могут
ми и несовместимыми (как мысли летчиков, говорящих на тайском, норвежском и калифорнийском английском). этом взаимодействие между экипажем, самолетом и должно протекать без сбоев, иначе могут случиться ужасные вещи, как например, 3 марта г., когда в аэропорту Тенерифе из- за неверно понятых указаний диспетчера столкнулись при взлете два Боинга 747, в результате погибли 335 человек.
Ретина проблемус управлением полетамиудалось с помощью«наименьшего общегознаменателя», т. е.достигнув соглашениеоб испольэованиианглийского язьжа.Ретина проблемус управлением полетамиудалось с помощью«наименьшего общегознаменателя», т. е.достигнув соглашениеоб испольэованиианглийского язьжа.Чтобы решить проблему/ все страны, осуществляющие полеты, должны прийти к соглашению. При данных масштабах (совокупности всех операторов воздушных перевозок) Iи неоднородности (при наличии авиалиний для богатых и бедных, транспортной, универсальной и военной авиации, контрабандистов и т. д.) этой группы единственным под-
Ретина проблемус управлением полетамиудалось с помощью«наименьшего общегознаменателя», т. е.достигнув соглашениеоб испольэованиианглийского язьжа.
Ретина проблемус управлением полетамиудалось с помощью«наименьшего общегознаменателя», т. е.достигнув соглашениеоб испольэованиианглийского язьжа.
ходом, обеспечивающим работу системы, является стандартизация на основе «наименьшего общего знаменателя» двух критических областей. Во-первых, это физический механизм передачи информации. В авиации для этого применяются радиостанции, Iработающие на выделенной частоте в метровом диапазоне. Во- вторых, для управления полетами требуется стандартизированное кодирование передаваемой информации. Согласно между-
народному соглашению все пилоты и диспетчеры должны вести переговоры только по-английски, даже если самолет'авиакомпа- нии Эйр Франс садится в международном аэропорту им. Шарля де Голля в Париже (хотя французы в гробу видели английский).
Как и в случае решения проблемы управления полетами, единственный способ справиться с огромным числом гетерогенных сущностей в Интернете — это использовать их «наименьший общий знаменатель». Чтобы принять решение о способе пересылке данных с одного устройства другому, нужно учесть, что для этого следует использовать то, что есть в каждом подключенном к Интернету устройстве. Аналогично тому, как на каждом самолете установлена метровая радиостанция, в Интернете наиболее распространен протокол HTTP (HypertextTransfer Protocol), который сейчас используется для получения страниц практически всеми Web-браузерами. Кроме того, нужен «наименьший общий знаменатель» в области кодирования информации, которая передается по протоколу HTTP. Подобно тому, как при управлении полетами все переговоры ведутся на английском, в нашем случае в рамкахуниверсальной схемы все пересылаемые данные будут кодироваться с помощью XML (Extensible Markup Language).
В результате объединения этих идей в Microsoft создано понятие Web-служб(Web Services). С помощью Web-служб объекты на
сервере могут бесшовно принимать запросы, поступающие от клиентов, применяя «наименьший общий знаменатель Интерне-
та» — HTTP/XML. Чтобы создавать Web-службы, не обязательно изучать новые способы программирования. Объекты при этом
пишутся так же, как если бы они были предназначены для работы напрямую с локальными клиентами. Просто они помечаются атрибутами, указывающими, что эти объекты надо сделать доступными Web-клиентам, а остальное делает ASP.NET. ASP.NET
автоматически подключает готовую инфраструктуру, которая принимает поступающие через HTTP запросы и переправляет их объектам (рис. 4-2). Объединенные в составе Web-службы объек-
ты могут работать с любым элементом Web, который «говорит»
на HTTP и XML. Иными словами, с кем угодно в этой вселенной,
Web-cftyxGbi бесшовносоединяют объекты NETи запросы, поступаю-щие через HTTP.Web-cftyxGbi бесшовносоединяют объекты NETи запросы, поступаю-щие через HTTP.невзирая на тип их ОС и окружения периода выполнения, в котором они работают. При этом писать инфраструктуру для связи через Web не нужно — она предоставлена .NET Framework.
Web-cftyxGbi бесшовносоединяют объекты NETи запросы, поступаю-щие через HTTP.
Web-cftyxGbi бесшовносоединяют объекты NETи запросы, поступаю-щие через HTTP.
Рис. 4-2. Взгляд на \Л/еЬ-службьА5Р.1ЧЕТсо стороны сервера.Рис. 4-2. Взгляд на \Л/еЬ-службьА5Р.1ЧЕТсо стороны сервера.
Рис. 4-2. Взгляд на \Л/еЬ-службьА5Р.1ЧЕТсо стороны сервера.
Рис. 4-2. Взгляд на \Л/еЬ-службьА5Р.1ЧЕТсо стороны сервера.
На стороне клиента .NET поддерживает прокси-классы обеспечивающие простой доступ к Web-службам, которые предоставляет любой принимающий HTTP-запросы сервер (рис. 4-3). Средство разработки читает описание Web-службы и генерирует про-
кси-класс с функциями на любом языке, на котором ведется разработка на клиенте. При вызове одной из этих функций прокси-класс создает HTTP-запрос и посылает его на сервер. Когда с сервера приходит ответ, проксикласс выполняет синтаксический разбор результатов и возвращает их в виде значения
NETтакже поддержи-вает прокси-классы, хо-торые облегчают созда-ние клиентовWeb-служб,скрываядетали реали-зации связи черезИнтернет.
функции. Это обеспечивает бесшовное взаимодействие клиента с любым сервером, «говорящим» на HTTP и XML, т, е. фактически с любым сервером.
0. В период разработки программист генерирует код прокси-объекта на основе описания Web-службы.
Программа-клиент
上 В период выполнения клиент создает прокси-объект.
2. Клиент вызывает методы прокси.
5, Клиент получает от ПрОКС11 значение срунктдм-
Прокеи
3. ПроксиПреобразует вызовы в формат HTTP и XML и посылает их на сервер через Интернет.
4. Прокси получает результаты в виде Хм〔 через HTTP и преобразует их в возвращаемое функцией значение.
На сервер/ от сервера через Интернет
Рис. 4-3. Взгляд на Web-служ 6biASP.NET со стороны клиента.
Простейшийпример:создание Web-службы
Собираясь изучить новую технологию или научить кого-нибудь ей, я всегда пишу простейшую программу-пример. Мне кажется. она поможет продемонстрировать создание Web-службы. Она под-
Здесь начинаетсярассмотрение примераWeb-сАужбьиЗдесь начинаетсярассмотрение примераWeb-сАужбьидержи вает един ствен ный метод, GetTime, который получает значение текущего времени с машины-сервера в виде строки с разрядами секунд или без них. Исходный текстэтой служ-
Здесь начинаетсярассмотрение примераWeb-сАужбьи
Здесь начинаетсярассмотрение примераWeb-сАужбьи
бы можно загрузить с web-сайта этой книги (www. introducing- mtcrosoft.net) и разбирать его, следуя дальнейшему описанию.
Написать Web-службуможно и без VisualStudio. Я, например,написйл ее e Блокноте.Написать Web-службуможно и без VisualStudio. Я, например,написйл ее e Блокноте.Эту XVeb-службу я написал в виде страницы ASP.NET. Сначала я загрузил (это можно cge・ лать бесплатно) и установил NET SDK. После этого, используя обычные инструменты администрирования IIS (Internet Information
Написать Web-службуможно и без Visual
Studio. Я, например,написйл ее e Блокноте.
Написать Web-службуможно и без Visual
Studio. Я, например,написйл ее e Блокноте.
Services) из Windows 2000, я настроил виртуальный каталог, указывающий на папку, в которой будет файл Web-службы. Затем созданный код ASP.NET я записал в файл TimeService.asmx и no- местил его на сервер. Все эти действия можно выполнить и без Visual Studio; hq самом деле все это я написал в Блокноте. Вот исходный текст программы (рис. 4-4):
«@ WebService Languaga=”VB” C1ass="TimeService"X>
Первая строка заголовка указывает ASP.NET на то, что в этом файле находится Web-служба, написанная на языке Visual Basic, а также что эта служба предоставляется классом TimeService.
Импорт пространств имен (считайте, что это ссылки), ' необходимых Web-службе.
Imports System Imports System.Web.Services
Объявляем новый класс службы. Он должен наследовать код ' от системного базового класса WebService,
Public Class TimeService : Inherits WebService
Помещаем в класс функции.
' Пометить их атрибутом WebMethods.
Public Function <WebMethod( )> GetTime (ShowSecohds as Boolean) As String
' Реализация прикладной логики функции:
' получить текущее время, отформатировать в соответствии ' с запросом и вернуть строку.
Dim dt As DateTime
If (ShowSeconds =Then
GetTime =
Else
GetTime = dt. Now. ToShortTimeString
End If
End Function
End Class
Рис. 4-4. Простая Web-служба.
Хотя эта программа довольно проста, некоторые ее конструкции,
ее шаг за шагом.ее шаг за шагом.На страницеA5P.NETзадан класс .NET, объек-ты которого использо-ваны в Web-слу*戻.На страницеA5P.NETзадан класс .NET, объек-ты которого использо-ваны в Web-слу*戻.вероятно, вам незнакомы, поэтому разберем Программа начинается со стандартного при- ветствияASP.NET, <%@%>. В нем расположена директива WebService, которая сообщает ASP.NET, что код страницы должен рассматриваться как Web-служба. Атрибут Lan-
ее шаг за шагом.
ее шаг за шагом.
На страницеA5P.NETзадан класс .NET, объек-ты которого использо-ваны в Web-слу*戻.
На страницеA5P.NETзадан класс .NET, объек-ты которого использо-ваны в Web-слу*戻.
guage задает язык этой страницы. Я использовал Visual Basic, поскольку с ним знакомо подавляющее большинство моих читателей. ASP.NET будет компилировать этот исходный текст с помощью Visual Basic.NET. Visual Studio для этого ставить не надо, все компиляторы входят в .NET SDK. Атрибут Class задает класс объектов, который должен быть активизирован для обработки входящих запросов, адресованных этой службе.
При поступлении пер-вого запроса ASP.NETавтоматически скомпи-лирует код, написанныйна Visual Basic.Концептуально онПри поступлении пер-вого запроса ASP.NETавтоматически скомпи-лирует код, написанныйна Visual Basic.Концептуально онОстальной код страницы содержит реализацию класса. Я применил директиву Imports (это новинка Visual Basic.NET), которая указывает компилятору «импортировать пространства имен». Пространство имен (names- расе) — замечательный способ ссылки на описание набора готовой функциональности.
При поступлении пер-вого запроса ASP.NETавтоматически скомпи-лирует код, написанныйна Visual Basic.
Концептуально он
При поступлении пер-вого запроса ASP.NETавтоматически скомпи-лирует код, написанныйна Visual Basic.
Концептуально он
идентичен ссылкам в проектах Visual Basic 6. Поскольку при по-
ступлении запроса от клиента ASP.NET «оперативно» («just-in- time») компилирует эту программу, проект / в котором можно было бы задать эти ссылки, отсутствует. Ссылки придется поместить в программу явно, Имена, перечисленные после директивы Imports, задают обработчику наборы функциональности, ссылки на которые надо включить з программу. V нас будут включены ссылки на System и System. Web.Services — готовые механизмы, используемые в Web-службах. Остановите меня, если я чересчур углубился в технические подробности!
В следующей строке определено имя класса.
Теперь Visual Bastenoq- ]г 一
qep>Kui3aeTнаследова-видели и писалисами массу классов на ни& что позволяет полу- Visual Basic, и этот мало чем от них отличает- чить доступ к готовым ся. В моей программе в конце строки Public системным Функциям. class TimeService inherits WebService есть
новое ключевое слово. Одним из многих улучшений Visual Basic стала поддержка методики объектно-ориентированного программирования, называемого наследованием (inheritance) (я рассказал о ней в главе 2 — со временем она вам обязательно понравится). Словами «мой класс TimeService наследует от класса WebService» я приказал компилятору взять весь код системного класса WebService, который в этом случае называется базовым (base) классом, и включить его в класс TimeService [производный (derived) класс]. Наследование можно представить в виде операций копирования и вставки; при этом никаких перемещений на самом деле не происходит. Честно говоря^ самые ярые адепты СТ + и Java даже физическую операцию копирова- ния/вставки кода часто называют «наследованием через редактор». Класс WebService поддерживается новой библиотекой периода выполнения .NET, чем он напоминает Visual Basic 6, многие объекты которого поддерживала ОС. В этом классе в готовом виде содержатся все коммуникационные механизмы, нужные для обработки входящих HTTP-запросов и маршрутизации их соответствующим методам объекта.
Студенты часто спрашивают, чем различаются импорт пространства имен и объявление наследования, т. е. ключевые слова Imports и Inherits. Imports лишь вводит описание набора функциональности, но реально его не использует. Как сказано выше. это
ключевое слово подобно установленной ссылке. Inherits реально берет часть кода, на который она ссылается, включает его в описание и использует. Оно работает как оператор Dim as, накачанный стероидами.
С помощью соответст-вующего атрибутаможно указать A5P.NETпредоставлять методкак Web-службу.им метод долженС помощью соответст-вующего атрибутаможно указать A5P.NETпредоставлять методкак Web-службу.им метод долженОпределив класс, надо определить его методы и функции. И это делается почти так же, как на Visual Basic 6, но с одним новым наворотом: к каждому методу, который должен быть доступен Web-клиентам, надо добавлять новый атрибут < WebMethodf )>. Этот атрибут указывает ASP.NET, что помеченный
С помощью соответст-вующего атрибутаможно указать A5P.NETпредоставлять методкак Web-службу.
им метод должен
С помощью соответст-вующего атрибутаможно указать A5P.NETпредоставлять методкак Web-службу.
им метод должен
быть доступен клиентам в виде Web-службы. В Visual Basic 6 вы могли видеть массу элементов/ похожих на атрибуты: Public, Private и Const. Многие из них применяются и в Visual Basic. NETZ и .NE】 Framework, но с новым синтаксисом. Если у класса могут быть открытые и закрытые методы, то точно так же одни из его методов могут быть доступны Web-клиентам, а другие — нет.
Вт 冲лу^ладн* логикуможно писать с по-мощью классов VisualBasic почти так же, какобычно.Вт 冲лу^ладн* логикуможно писать с по-мощью классов VisualBasic почти так же, какобычно.В завершение мы доберемся до внутреннего устройства этого метода. Как и для меня, для вас работа со временем может оказаться несколько новой. Но не стоит сейчас об этом беспокоиться — обработку времени и дат выполняет Visual Basic.NET.
Вт 冲лу^ладн* логикуможно писать с по-мощью классов Visual
Basic почти так же, какобычно.
Вт 冲лу^ладн* логикуможно писать с по-мощью классов Visual
Basic почти так же, какобычно.
А теперь попробуем обратиться к нашей Web-службе с клиента. Хорошие средства поддержки для этого также имеются вASP.NET в готовом виде. Если запустить Internet Explorer 5.5 и запросить страницу, которую мы только что написали на ASP.NEL результат будет таким, как показано ниже (рис. 4-5).
ASP.NE1 обнаруживает факт обращения к самой странице Web- I службы (а не к одному из ее методов) и в ответ выводит страницу со списком функций, которые поддерживает эта служба. В данном случае в списке будет лишь одна функция, GetTime, В ответ на щелчок имени функции ASP.NET покажет страницу, которая позволит проверить этот метод (рис. 4-6). Чтобы заставить GetTime показывать секунды или запретить это, введите TRUE или FALSE, соответственно, и щелкните кнопку Invoke. В итоге тестовая страница вызовет указанный метод и вернет результат
(рис. 4-7). Можно видеть, что в составе URL в поле Address передаются параметры, а результат возвращается в форме XML. Также обратите внимание, что страницу следует открывать так, как это делается з IIS, набирая ее URL: http://Iocalhost/[uMnвашего виртуального каталогаУПте5е1У1се. asmx. Если просто дважды щелкнуть страницу при просмотре содержимого жесткого диска через Internet Explorer, вы минуете IIS и ASP.NE1 и получите просто текст страницы •ASMX, но это вовсе не то, что нужно, не так ли?
Рис. 4-5. Экран по умолчанию, сгенерированныйASP.NET при запросе базовой страницы Web-службы.Рис. 4-5. Экран по умолчанию, сгенерированныйASP.NET при запросе базовой страницы Web-службы.£1£10e K • ••・.b- ••»•給F:同Htp Гх » u»l/3」•”"—,■"・=-■« ・《r ,・0e K • ••・.b- ••»•給F:同Htp Гх » u»l/3」•”"—,■"・=-■« ・《r ,・for a coaipldts 1st uf — уfor a coaipldts 1st uf — уGetTimeGetTime—旦—旦JrlmeServiceJrlmeServicePm—Pm—Sh^wSecendiSh^wSecendiLQcwmaratLQcwmaratРис. 4-6. В ответASP.NET выводит такую страницу.Рис. 4-6. В ответASP.NET выводит такую страницу.
Рис. 4-5. Экран по умолчанию, сгенерированныйASP.NET при запросе базовой страницы Web-службы.
Рис. 4-5. Экран по умолчанию, сгенерированныйASP.NET при запросе базовой страницы Web-службы.
£1
£1
0e K • ••・.b- ••»•
給F:同Htp Гх » u»l/3」•”"—,■"・=-■« ・《r ,・
0e K • ••・.b- ••»•
給F:同Htp Гх » u»l/3」•”"—,■"・=-■« ・《r ,・
for a coaipldts 1st uf — у
for a coaipldts 1st uf — у
GetTime
GetTime
—旦
—旦
JrlmeService
JrlmeService
Pm—
Pm—
Sh^wSecendi
Sh^wSecendi
LQcwmarat
LQcwmarat
Рис. 4-6. В ответASP.NET выводит такую страницу.
Рис. 4-6. В ответASP.NET выводит такую страницу.
Удобные свойства логистики и развертывания объектов NET (см. главу 2) есть и у моей Web-службы. Например, чтобы найти мой
Web-службу^ как идругие объекты ,NET^легко админ нс丁ри роватьи разверть!вать.Web-службу^ как идругие объекты ,NET^легко админ нс丁ри роватьи разверть!вать.объект, ASP.NET не требуется реестр, который нужен для поиска объектов СОМ: местоположение моего объекта задает URL. Обновлять код совсем не трудно: нужно просто скопировать новый файл поверх старого (по-
Web-службу^ как идругие объекты ,NET^легко админ нс丁ри роватьи разверть!вать.
Web-службу^ как идругие объекты ,NET^легко админ нс丁ри роватьи разверть!вать.
пробуйте сделать это с примером на своей локальной машине).
Он не будет заблокирован, что случилось бы на его месте с сер-
вером СОМ. Мне даже не придется перезапускать сервер IIS, что-
Для проверки И/еЬауж"6biASP.NET автомати-чески предоставляетпростой клиент наOCHQB0браузера.Для проверки И/еЬауж"6biASP.NET автомати-чески предоставляетпростой клиент наOCHQB0браузера.бы уведомить его о новом файле. Он автоматически обнаружит, что файл изменился, при необходимости оперативно скомпилирует его «по требованию» и в дальнейшем при обработке запросов к объекту будет исполь-
Для проверки И/еЬауж"6biASP.NET автомати-чески предоставляетпростой клиент наOCHQB0браузера.
Для проверки И/еЬауж"6biASP.NET автомати-чески предоставляетпростой клиент наOCHQB0браузера.
зовать новую версию.
"3"3
"3
"3
1 i.t - *1 0 « •: —'"'т '
..=Л ;〃рт|>*:с.ьч,' 7:05 РМ
建 LWrt*«n*建 LWrt*«n*
建 LWrt*«n*
建 LWrt*«n*
РИС. 4-7. Результаты, которые вернула Web-служба.
Этот пример демонстри-рует массу мощи ейшихфункций, испольаоватькоторые очень легко.Этот пример демонстри-рует массу мощи ейшихфункций, испольаоватькоторые очень легко.IВот и все, что потребовалось сделать/ чтобы написать мою Web-службу. Ее исходный текст занимает всего лишь 13 строк, считая Else и /£ Куда уж легче!
Этот пример демонстри-рует массу мощи ейшихфункций, испольаоватькоторые очень легко.
Этот пример демонстри-рует массу мощи ейшихфункций, испольаоватькоторые очень легко.
Самоописываемость Web-служб: WSDL-файлы
Программистам, которые создают клиентские приложения, использующие Web-службы, потребуется описание выполняемых ими действий, а также сведений, которые следует сообщить службе, чтобы заставить ее работать. Так, клиенту нужно знать предоставляемые службой методы, их параметры и поддерживаемые протоколы. Концептуально эта информация аналогична инфор-
Web-сл/жбы должныпредоставлять описание:своей функциональ-ности заинтересо-ванным клиентам.Web-сл/жбы должныпредоставлять описание:своей функциональ-ности заинтересо-ванным клиентам.тельно также иметьтельно также иметьмации в библиотеке типов, которую использует стандартный компоненп СОМ. Однако проблема с библиотеками типов в том, что они специфичны для Microsoft COM. Хотелось бы, чтобыклиентами Web-служб могли бы быть не только Microsoft-системы. Жела- возможность создавать описания для служб
Web-сл/жбы должныпредоставлять описание:своей функциональ-ности заинтересо-ванным клиентам.
Web-сл/жбы должныпредоставлять описание:своей функциональ-ности заинтересо-ванным клиентам.
тельно также иметь
тельно также иметь
других авторов, кроме Microsoft, чтобы они работали в системах не только под управлением ОС Microsoft, но и других. Но при всем при этом клиентские приложения, разработанные Microsoft, должны иметь возможность использовать эти службы. Требуется универсальный подход к описанию службы, не ограниченный миром Microsoft. (Могли бы вы помыслить, что прочитаете подобные слова в книге, изданной Microsoft? Лично я — нет. Да, мир сегодня уже нетот...) Этот подход должен быть доступен для машинного анализа, что позволило бы использовать его в интеллектуальных средах разработки (так же, как библиотеки типов).
Описание Web-службыИнфраструктура ASP.NET может генериро-
дается BBugeWSDl.-ватьтакое описание путем анализа метадан-
файда.ных (см. главу 2) в коде, реализующем служ-
翳бу. Описание хранится в XML-файле, исполь
зующем словарь под названием WSDL (Web Service Descriptor Language)4.
Обращает на себя внимание тот факт, что многие акронимы в .NET не являются трехбуквенными сокращениями (TLA или Three-Letter Acronyms, TLA само по себе является TLA), которые все привыкли видеть в большинстве компьютерных проектов. Дело в том, что существует всего лишь 1 7 576 уникальныхTLA и Microsoft исчерпала их все, не дойдя и до половины проекта. Я предвидел эту проблему два года назад и предложил решение в виде свертывания TLA в ССТ (Clever Compound TLA — «умные составныеTLA»; кстати, ССТтакже само по себе является ССТ). Хотя этот подход, по-видимому, прижилсяbXML(возьмем, к примеру, полунасыщен- ные ССТ: XSL — XML Stylesheet Language или SAX — Simple API for XML), Microsoft явно открещивается от использования ССТ, предпочитая наращивать длину слов, производя акронимы SOAP, WSDL и UDDI. Эти терминологические объекты еще не получили имени, поэтому л объявляю, что они будут называться FLAP (Four-Letter Acronym Packages). Естественно, что аббревиатура FLAP это тоже FLAP.
Инфраструктура №『 может генерировать описание программыИнфраструктура №『 может генерировать описание программыWSDL-файл Web-службы иногда называют контрактом (contract), поскольку в нем перечислены все функции, которые может выпол-
Инфраструктура №『 может генерировать описание программы
Инфраструктура №『 может генерировать описание программы
текста.текста.Iнять служба, и указаны способы их вызова. , на основе ее исходного
текста.
текста.
WSDL-файл можно получить отASP.NET, go- бавив к URL при запросе .ASMX-файла сим-
волы WSDL. На叩имер, на своей локальной машине я получил WSDL-файл с описанием примера Web-службы, запросив URL Л ttp://Ioclahos t/Aspx TimeService/TimeService.asmx/WSDL. Именно эту операцию выполняет ссылка Service Description со страницы, показанной выше (рис. 4-5).
В качестве альтернати-вы можно сначала соз-дать описание( а затемгенерировать для него^д.В качестве альтернати-вы можно сначала соз-дать описание( а затемгенерировать для него^д.При создании COM-компонентов на Visual Basic 6 или Visual C++ 6 иногда сначала пишут компонент, а затем описывающую его библиотеку. В других случаях начинают с библиотеки типов, описывающей интерфейс, а затем пишут реализующий ее код. WSDL
В качестве альтернати-вы можно сначала соз-дать описание( а затемгенерировать для него^д.
В качестве альтернати-вы можно сначала соз-дать описание( а затемгенерировать для него^д.
может работать по любому из этих сценариев. Можно сначала написать код, как я поступил здесь. В этом случаеASP.NETсгене- рирует WSDL-файл для заинтересованных клиентов. С другой стороны, я мог бы сначала написать WSDL-файл (или получить его из третьих источников), описывающий возможности службы, а потом с помощью утилиты из SDK сгенерировать шаблон, реа-
лизующий описанный WSDL-файлом службу (этот подход аналогичен использованию ключевого слова Imports в программах на
Visual Basic 6).
Здесь в качестве叩мм叩а показана частьWSDL^auAa.Здесь в качестве叩мм叩а показана частьWSDL^auAa.В силу определенных причин WSDL-файлы довольно сложны, поэтому ниже я привожу лишь выдержку из него, иллюстрирующую содержимое WSDL-файлов (рис. 4-8). В эле-
Здесь в качестве叩мм叩а показана частьWSDL^auAa.
Здесь в качестве叩мм叩а показана частьWSDL^auAa.
менте <service> находятся элементы <port> для каждого протокола, позволяющего получить доступ к Web-службе. В нашем случае есть выбор между HTTP GET, HTTP POST u SOAP, являющимся гибридом HTTP/XML. В свою очередь каждый элемент
<port> содержит сведения относительно других элементов документа (они не показаны), описывающие форматы входного зап-
роса и выходных данных для каждого протокола.
<service name="TimeService">
<port naп!e=^^TimeSeгvlceSoap,^
binding="sO:TimeServiceSoap">
<Soap:address location=
"http://LQGalhost/AspxTimeService/TLmeSe rvlce. asm x. />
</port>
<port hame=r T lines e г viceH 11 p@e tя
binding="sO:TimeServiceHttpGet">
<http:address location=
"http://localhost/AspxTimeService/TimeService. asmx'* />
</port>
<port naffle="TimeServiceHttpPost,'
bi nding="s 0:T1meSe г vlceHtt pPost">
<http:address location=
r,http://local host/AspxTimeService/TinieServlce. asmx'1 />
</port>
</servic0 >
Рис. 4-8. Выдержка из WSDL-файла.
Интерпретировать coдержимое WSDL-файлапозволяют различныеинструменть»разработки.Интерпретировать coдержимое WSDL-файлапозволяют различныеинструменть»разработки.Вместо того чтобы при работе с библиотеками типовкопаться з их двоичном содержимом, обычно применяют интерпретирующие средства просмотра. Аналогично при работе с WSDL-файлами зам скорее всего не придется иметь дело с их необработанным со-
Интерпретировать coдержимое WSDL-файлапозволяют различныеинструменть»разработки.
Интерпретировать coдержимое WSDL-файлапозволяют различныеинструменть»разработки.
держиммм, если только вы не пишете программу для анализа WSDL-файлов, Вместо этого вы будете работать с WSDL-файлами, используя интерпретирующие средства. Например, таким
средством является проверочная страница^ которую предоставляет ASP.NET. Эта страница не только проверяет (рис. 4-6), но и Iинтерпретирует WSDL-файл. показывая поддерживаемые им протоколы и способы их использования для доступа к службе. Следующий снимок экрана показывает часть страницы с описанием способа доступа к службе TimeService через протокол HTTP СЕТ (рис. 4-9).
Рис. 4-9. Клиентская программа, которая обращается к Web-службе через HTTP СЕТ.
Создание клиента Web-службы
Мне показалось, что написать клиент не труднее, чем саму службу. СлушательзапросовASP.NET? маршрутизирующий входящие запросы к объектам Web-службы, может работать с запросами по трем протоколам: HTTP GET, HTTP POST u SOAP. Концептуально это напоминает ситуацию при управлении самолетом, когда диспетчеры говорят на различных диалектах английского: британском, американском и австралийском. Первые два протокола поддерживаются в основном из соображений преемственной совместимости, так как сегодня практически все программы в Web используют один из этих протоколов. Однако при осуществлении новых проектов, вероятно, будет легче использовать SOAP. В частности, из-за преимуществ, которые дают готовые средства поддержки этого протокола из Visual Studio.NET. Чтобы изучить способы написания клиентов, применяющих эти механизмы, рассмотрим каждый из них.
Случай 1:НТТРGET
Моя Web-служба будет принимать запросы в виде простых запросов HTTP СЕТ с параметром ShowSeconds в строке URL. В предыдущем разделе мы видели фрагментWSDL-файла с описанием поддержки для этого протокола. А вот пример Web-стран и-
цы, предоставляющей доступ к таким запросам (рис. 4-10), — эта страница также есть на сайте среди других примеров этой главы. Когда запрос приходит на сервер, ASP.NET выполняет синтаксический разбор параметров в строке URL. создает объект TimeService и вызывает метод CetTime. ASP. NET принимает зна-
Вызов web-службыбудет осуществлятьсяпо протоколу HTTP GET.Вызов web-службыбудет осуществлятьсяпо протоколу HTTP GET.чение, возвращаемое этим методом, форматирует его как XML и возвращает клиенту результат в форме XML. Экран с результатами показан выше (рис. 4-7).
Вызов web-службыбудет осуществлятьсяпо протоколу HTTP GET.
Вызов web-службыбудет осуществлятьсяпо протоколу HTTP GET.
Рис. 4-10. Web-страница, которая обращается к нашей демонстрационной Web-службе.Рис. 4-10. Web-страница, которая обращается к нашей демонстрационной Web-службе.
Рис. 4-10. Web-страница, которая обращается к нашей демонстрационной Web-службе.
Рис. 4-10. Web-страница, которая обращается к нашей демонстрационной Web-службе.
Случай 2: HTTP Post
Web-служба также будет принимать все вызовы, поступающие в виде запросов HTTP Post. Чтобы выяснить, как отформатировать запрос Post, чтобы Web-служба смогла его распознать и обработать, я изучил интерпретированный WSDL-файл, показанный выше. Затем с помощью Microsoft Frontpage 2000 я написал форму, выполняющую все, что нужно (рис. 471), HTML-код показан ниже (рис. 4-12) (соответствующий файл также есть наWeb-сай- те книги среди других примеров из этой главы). Когда запрос приходит на сервер, ASP.NET создает объект TimeService, получает от элементов управления формы параметры и вызывает метод
Web-служба будетпринимать вызовы по. протоколу HTTP Post.Web-служба будетпринимать вызовы по. протоколу HTTP Post.CetTime. Затем ASP.NET принимаетзначение, которое возвращаел этот метод, форматирует его как XML и возвращает клиенту результат в виде XML.
Web-служба будетпринимать вызовы по. протоколу HTTP Post.
Web-служба будетпринимать вызовы по. протоколу HTTP Post.
Рис. 4-11. Клиентская форма, которая обращается к Web-службе.
<form METHQD^'TOST" ACTION=
"http://localhost/aspxtimeservice/timeservice,asmx/GetTime">
<p>Would you like to show the seconds digits?</p> <blockquote><p>
<input TYPE="RADIO" NAME="ShowSecondsTT VALUE=rtTrue" CHECKED>
True
<input TYPE="RADIO" NAME=,,ShowSeconds,, VALUE=nFalse"> False<br>
</px/blockquote>
<input TYPE="SUBMIT4 VALUE="Submit Form">
<input TYPE="RESET" VALUE=4Reset Form">
</form>
Рис. 4-12. HTML-код клиентской формы.
Случай 3: необработанный Soap
В дополнение Web-служба будет принимать вызовы, поступающие через HTTP Post, закодированные в пакеты SOAP. Нет-нет, SOAP — это не мыло5. SOAP означает Simple Object Access Protocol (Простой протокол доступа к объектам). Это богатый и гибкий словарь XML, описывающий функции и их параметры, для которого есть встроенная поддержка в Visual Studio.NET. Поэтому я думаю, что в большинстве случаев при разработке новых
Soap (англ.) — мыло. — Прим. перев.
.—мвУламАХТ ЯМГО«П«вС.—мвУламАХТ ЯМГО«П«вСS*eUFLS*eUFL卦 aSeeixdP卦 aSeeixdPsgP Ис》.《aow^fcisgP Ис》.《aow^fci<irc >.- Ъ«с. •• ллл ►. I W.U W125 “m—「•,**»• > —",”, *• I ■;—Ml〕ПЛ '1,冲 Bn k)6*ГГИ₽*ЧР1ЛЛ*1Т> r^htlp "iorwt <r» ' Q#*rrf«sU* iOfM-./GsI ■? Issj■ .,—,'Чн—<irc >.- Ъ«с. •• ллл ►. I W.U W125 “m—「•,**»• > —",”, *• I ■;—Ml〕ПЛ '1,冲 Bn k)6*ГГИ₽*ЧР1ЛЛ*1Т> r^htlp "iorwt <r» ' Q#*rrf«sU* iOfM-./GsI ■? Issj■ .,—,'Чн—
.—мвУламАХТ ЯМГО«П«вС
.—мвУламАХТ ЯМГО«П«вС
S*eUFL
S*eUFL
卦 aSeeixdP
卦 aSeeixdP
sgP Ис》.《aow^fci
sgP Ис》.《aow^fci
<irc >.- Ъ«с. •• ллл ►. I W.U W125 “m—「•,
**»• > —",”, *• I ■;—Ml〕ПЛ '
1,冲 Bn k)
6*ГГИ₽*ЧР1ЛЛ*1Т> r^htlp "iorwt <r» ' Q#*rrf«sU* iOfM-./GsI ■? Issj
■ .,—,'Чн—
<irc >.- Ъ«с. •• ллл ►. I W.U W125 “m—「•,
**»• > —",”, *• I ■;—Ml〕ПЛ '
1,冲 Bn k)
6*ГГИ₽*ЧР1ЛЛ*1Т> r^htlp "iorwt <r» ' Q#*rrf«sU* iOfM-./GsI ■? Issj
■ .,—,'Чн—
клиентов будет избран именно SOAP, а не HTTP GET или HTTP Post, работу которых я только что продемонстрировал. Я написал небольшую программу, которая с помощью SOAP вызывает метод Web-службы GetTime (рис. 4-13). При этом реальное взаимодействие осуществляется по протоколу HTTP. Поскольку код получился довольно громоздким, здесь он не приводится, но его можно найти среди других примеров на сайте этой книги. В отличие от вышеприведенных примеров, где URL указывал метод службы, в этом случае URL указывает на страницу .ASMX. содержащую все методы Web-службы. Пакеты SOAP, посланные на сервер, содержат имя и параметры функции, закодированные в XML согласно принятой схеме (верхнее текстовое поле на рисунке). Когда пакетSOAP достигает сервера, ASP. NET распознает его, выполняет синтаксический разбор пакета, получая имя и парамет- Web-слркба будет рз метода, создаеп объект и вызывав! ме- принимать вызовытод- Затем ASP.NETпринимает значение, ко-
через$ОАР.торое вернул метод, форматирует его как
XML и возвращает результат клиенту.
J32SI
.e:,,/»tofe -
Рис. 4/3. Пример приложения, демонстрирующий доступ к Web-службе через SOAP.
Случай 4: синхронная работа интеллектуального
SOAP-прокси
№Т SDK поддерживаетп рокси-KAaccbi SOAP,что заметно облегчаетнаписание клиентскихприлохений.№Т SDK поддерживаетп рокси-KAaccbi SOAP,что заметно облегчаетнаписание клиентскихприлохений.Писать пример из предыдущего раздела, использующий SOAP, было довольно утомительно. Это занятие напомнило мне написание клиента IDisaptch на классическом СОМ вручную в том смысле, что там была куча . стереотипов, которые почти не отличались от
№Т SDK поддерживаетп рокси-KAaccbi SOAP,что заметно облегчает
написание клиентскихприлохений.
№Т SDK поддерживаетп рокси-KAaccbi SOAP,что заметно облегчает
написание клиентскихприлохений.
метода к методу, критичных для правильной работы программы (ошибись хоть в одном символе — и капут). Visual C + + поддерживает класс-оболочку, который здорово упрощает доступ к объектам автоматизации (многие программисты на Visual Basic даже и не догадывались, что для адептов C + + этот процесс связан со многими страданиями; другим было безразлично, или они это поощряли). Теперь .NET SDK поддерживает набор классов- оболочек, которые делают написание клиента SOAP заурядной операцией.
Прокси-классы генерирует утилита командной строки Wsdl.exe из состава .NET SDK. В Visual Studio.NEl ее можно запустить из среды разработки при добавлении ссылки на службу. Утилита читает описание Web-службы из WSDL-файла и генерирует прокси, дающий доступ к методам службы на заданном языке. В настоящее время поддерживаются Visual Basic, C# и JavaScript, но не C+ + . Можно создать прокси, использующий любой из поддерживаемых протоколов, но по умолчанию задан SOAP. Wsdl.exe запускает команда:
wsdl /l:vb http://localhost/aspxtimeservice/ timeservice.asmx?WDSL
Классы-прокси в Visual Basic содержат функции, позволяющие получать время от нашей Web-службы как синхронно, так и. асинхронно. Вот синхронная версия, которую мы и обсудим (рис. 4-14), Прокси-класс наследует от базового класса System .Web.Services.Protocols.SoapHttpCIientProtocol (нам часто придется использовать такие длинные, очень длинные имена, так что привыкайте — они хоть наглядны), содержащего реальный код. V прокси- жласса есть свойство Uri. унаследованное от базового класса. Оно
Прокси-класс, сгенёрй-рованный утилитоиWgdLexe, предоставляетготовую функциональ-ность для обработкизапросов SOAP.Прокси-класс, сгенёрй-рованный утилитоиWgdLexe, предоставляетготовую функциональ-ность для обработкизапросов SOAP.:URL сервера, на который направляет
Прокси-класс, сгенёрй-рованный утилитоиWgdLexe, предоставляетготовую функциональ-ность для обработкизапросов SOAP.
Прокси-класс, сгенёрй-рованный утилитоиWgdLexe, предоставляетготовую функциональ-ность для обработкизапросов SOAP.
ся вызов Из WSDL-файлаэто свойство получает значение по умолчанию, но при жела
нии его можно изменить в период выполнения (программа-пример демонстрируетсоот- ветствующую методику). Клиент вызывает указанный метод у прокси с помощью мето-
да invoke, который прокси также унаследовал от базового класса. Затем этот метод создает пакет SOAP, содержащий имя и параметры метода (рис, 4ТЗ), и посылает его на сервер no HTTP. Когда возвращается с сервера ответный пакет SOAP, базовый класс осуществляет его синтаксический разбор, извлекает результат и возвращает его прокси, который передает его клиенту.
Public Class <System.Web.Services,WebServlceBindingAttribute
(Name:="TimeServiceSoap", _
[Namespace]:="http://tempuri.org/")> TimeService Inherits System.Web.Services.Protocols.SoapHttpClientProtocol
Public Sub New( )
MyBase.New
Me.Uri = _
"http://local host/aspxtimeservlce/timeservice.asmx” End Sub
IPublic Function
<System.Web.Services.Protocols.SoapMethodAttribute(—
=
System.Web.Services.Protocols.SoapMessageStyle. _
ParametersInDocument)>
GetTime (ByVai ShowSeconds As Boolean) As String
Dim results( ) As Object =
Me.Invoke( 'GetTime'r1 NewObject ( ) {ShowSeconds}) Return CType(results(O). String)
End Function
End Class
Рис. 4-14. Класс-прокси SOAP на языке VisualBasic, сгенерированный Wsdl.exer
Блок атрибутов в объявлении функции (символы в угловых скобках) содержит сведения для базового класса о форматировании вызова, в частности, имена методов. В Visual Studio.NET метаданные этих атрибутов интенсивно используются для передачи информации к средствам готовой функциональности системного кода. Вероятно, раньше это пришлось бы делать с помощью членов-переменных базового класса, при этом было бы трудно различить постоянные атрибуты периода выполнения и атрибуты, изменяемые во время исполнения программы. Новый подход более устойчив к путанице, что в общем случае хорошо.
Ниже показаны реальный код клиента на Visual Basic (рис. 4-15) Iи вид клиентского приложения (рис. 4-16). Видно, что ничего необычного в нем нет. Всю рутинную работу сделал прокси-класс.
' Пользователь щелкнул кнопку GetTlme.
Protected Sub button1_Click(ByVal sender As System. Object,
ByVai e As System.EventArgs) _ Handles buttonl.Click
' Создать новый объект класса-прокси,
Dim foo As New TimeService( )
' Установить значение свойства URL, заданное пользователем.
foo.Uri =
' Реально вызвать функцию. Поместить результат функциив текстовое поле, где он будет виден пользователю.
labelK ).Text = foo. GetTime(checkBox1( } .Checked)
End Sub
Рис. 4-15. Программа на Visual Basic, которая вызывает синхронный метод SOAP-прокси.
7—1 760
— I—HjMkrseftJiET:— I—HjMkrseftJiET:
— I—HjMkrseftJiET:
— I—HjMkrseftJiET:
Web S#>vce URL
Sgt Rslvne dsvtrhionou?Sgt Rslvne dsvtrhionou?jHlW/tocel1—р/лтемеЬпе——
Sgt Rslvne dsvtrhionou?
Sgt Rslvne dsvtrhionou?
IMS 22IMS 22Qe^iime 1Qe^iime 1尸 Show Sworxfee
IMS 22
IMS 22
Qe^iime 1
Qe^iime 1
Cheb U
—liwCl^ntbWMir
Рис. 4-16, Окно программы-примера, использующей SOAP-прокси.
Случай 5: асинхронная работа интеллектуального прокеи SOAP
Как правило, клиентстремится вызыватьWeb-сАужбу аасинхронном режиме.женностью — вКак правило, клиентстремится вызыватьWeb-сАужбу аасинхронном режиме.женностью — вИнтернет может быть очень даже забавным, но он всегда так густо населен, что нет никакой надежды насладиться его прелестями в отсутствие разумной стратегии, позволяющей справиться с его хронической перегру- этом он напоминает Disney World. Обработка
Как правило, клиентстремится вызыватьWeb-сАужбу аасинхронном режиме.
женностью — в
Как правило, клиентстремится вызыватьWeb-сАужбу аасинхронном режиме.
женностью — в
элементарного вызова Web-службы может занять 5-10 секунд
даже при удачном стечении обстоятельств, так что полученное время станет неточным. В таком случае нельзя блокировать пользовательский интерфейс дольше, чем на пару секунд. Приложение промышленного масштаба не может просто вызывать синхронный метод прокси во время исполнения обрабатывающей
нажатие кнопки формы функции, как это сделано в примере выше. Необходимо как-то разместить вызов з другом потоке, который может ждать ответа, не блокируя пользовательский интерфейс. Позже, когда поток вернет результаты вызова, их вы-
вести пользователю.
До сих пор большинству программистов приходилось писать собственную программную инфраструктуру для решения этой проблемы. Код такого рода всегда был печально известен как очень ненадежный. С финансовой точки зрения, потраченное на него время можно занести в чистые убытки. Поскольку такое положе-
Класс-оболочка проксиподдерживает асинхрон-ную версию каждогометодаWeb-€Ayx6bLКласс-оболочка проксиподдерживает асинхрон-ную версию каждогометодаWeb-€Ayx6bLниедел стало универсальным, классы «интеллектуальный прокси» теперь оснащаются готовым кодом, позволяющим решить эту проблему. Вместо того чтобы блокироваться в ожидании завершения вызова, программа
Класс-оболочка проксиподдерживает асинхрон-ную версию каждогометодаWeb-€Ayx6bL
Класс-оболочка проксиподдерживает асинхрон-ную версию каждогометодаWeb-€Ayx6bL
может вызвать метод, который передает данные запроса на сервер и сразу возвращает управление. Позже, в более удобное время, программа может вызвать другой метод и получить результаты с сервера. Это очень, очень облегчает жизнь, так как освобождает от писания кода для распределения процессорного叩е一 мени, Кроме того, этот метод работает с любыми серверами, а не только с теми, что поддерживают асинхронный доступ.
Следует вызывать тотметод, что возвращ^^туправление сразу посленачала запроса.Следует вызывать тотметод, что возвращ^^туправление сразу посленачала запроса.Ниже показана асинхронная версия вызова Web-службы (рис. 4-17). Прокси содержит метод BeginluMfi_Me 丁ода / в данном случае BeginGetTime. В начале списка параметров стоит параметр, который есть у синхронно-
Следует вызывать тотметод, что возвращ^^туправление сразу посленачала запроса.
Следует вызывать тотметод, что возвращ^^туправление сразу посленачала запроса.
го метода (у меня это булева переменная ShowSeconds). В случае
обратного вызова используются еще два параметра, но этот случай выходит за рамки этой книги. Следующая программа (рис. 4-18) производит асинхронный вызов, при этом для обоих параметров передается Nothing (эквивалент null из Visual Basic). Цепочка взаимодействия начинается с вызова метода BeginGetTime, который отсылает запрос и сразу же возвращает управление. При этом возвращается объект типа IAsyncResultt который позже понадобится для поучения результата. Теперь мы свободны и можем заняться другими делами. Чтобы имитировать долгую операцию во время лабораторного тестирования, я вставил в страницу •ASMX цикл, который просто считает от одного до миллиарда. Если хотите проверить эту программу, посчитайте вместе с ней...
Теперь нужно вызватьдругой метод,, чтобыполучить результатыпосле завершения ,операции.Теперь нужно вызватьдругой метод,, чтобыполучить результатыпосле завершения ,операции.Позже в определенный момент потребуется получить результаты операции и узнать, сколько времени было на самом деле, когда сервер послал результаты обратно. Это делает прокси-метод End[имя _метода] {в этом случае —EndCetTime), которому передается
Теперь нужно вызватьдругой метод,, чтобыполучить результатыпосле завершения ,операции.
Теперь нужно вызватьдругой метод,, чтобыполучить результатыпосле завершения ,операции.
о6ьек1 lAsyncResult, полученный от метода Begin. Таким образом, код инфраструктуры может узнать, какой именно результат вер-
Iнуть, если клиент сделал несколько необработанных запросов одновременно. Метод End получает результат и возвращает его.
IPublic Function BeginGetTime(ByVal ShowSeconds As Boolean, _ ByVai callback As System.AsyncCallback, _ ByVai asyncState As Object) _ As System.lAsyncResult
Return Me. Beginlnvoke( "GetTime'r Mew Object^ ) {ShowSeconds}, callback. asyncState)
IEnd Function
Public Function EndGetTime(ByVaL asyncResult As System,lAsyncResult) As String
Dim resutts( ) As Object = Me.Endlnvoke(asyncResult) Return CType(results(O), String)
End Function
Рис. 4-17. Асинхронные методы SOAP-прокси.
' Начать асинхронный вызов, чтобы получить время
Dim AsyncTlmeServiceProxy As TimeService
IDim AsyncResult As lAsyncResult
Private Sub button2_Cliok(ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles button2.Click
AsyncTimeServiceProxy = New TimeService( )
AsyncTlmeServiceProxy.Uri = textBox1( ).Text AsyncResult = AsyncTlmeServiceProxy* BeginGetTime — (checkBoxl( ).Checked, Nothing, Nothing)
End Sub
' Проверить, завершилась ли операция.
IPrivate Sub button3_Click(ByVal sender As System.Object,— ByVal e As System.EventArgs) _ Handles button3.Click
If (AsyncResult,IsCompleted =Then
MessageBox.Show(“Is complete")
Else
MessageBox.Show("NOT complete")
End If
End Sub
Определить время, полученное в результате асинхронного вызова.
Private Sub button4_Click(ByVai sender As System.Object, ByVai e As System.EventArgs) _ Handles button4.Click
Label1( ).Text = _
AsyncTimeServiceProxy,EndGetTime(AsyncResult) AsyncResult = Nothing
AsyncTimeServiceProxy = Nothing
End Sub
Рис. 4-18, Программа на VisualBasic, вызывающая асинхронные метолы SOAP-прокси.
Опрос свойствапозволяет выяснить,завершена ли операция.Опрос свойствапозволяет выяснить,завершена ли операция.Но как узнать, завершена ли операция и готовы ли результаты? Для этого у объекта lAsyncResult есть метод fsCompleted. возвращающий TRUE или FALSE. Чтобы выяснить,
Опрос свойствапозволяет выяснить,завершена ли операция.
Опрос свойствапозволяет выяснить,завершена ли операция.
завершилась ли операция, можно периодически опрашивать этот метод. Если вызвать EndCetTimego завершения операции, он будет заблокирован до того момента, пока операция реально не закончится. Поскольку скорее всего вы не станете вызывать этот метод в главном потоке пользовательского интерфейса, имеет смысл делать это в рабочем потоке, который не сможет продолжить обработку своих данных без результатов вызова Web-службы.
Поддержка Web-служб в Visual Studio.NET Показанный выше пример с Web-службой продемонстрировал, что для написания Web-службы среда разработки не нужна. Но поскольку сроки — это второе по значимости ограничение при разработке ПО (если первым считать тупоголовых менеджеров, которые даже не знают, с какого конца брать паяльник), имеет смысл писать Web-службы с помощью инструментария, который позволил бы «выдавать» их быстрее. Поскольку у нашего старого приятеля Блокнота нет таких возможностей, как встроенный отладчик, лучше писать Web-службы в Visual Studio.NET. Я покажу, как написать аналогичную службу с помощью бета-выпуска 2 Visual Studio.NET.
Если в главном меню Visual Studio выбрать File/New/Project, выводится диалоговое окно (рис. 4-19). В левой панели этого окна я выбрал Visual Basic Projects, а в правой — значок Web Service, ввел в нужную строку имя проекта и щелкнул ОК. В результате
Visual Studio.NET генерирует новое решение, состоящее из файлов (рис. 4-20). (Кстати, ненавижу термин «решение» — это MINFU. Он не описывает выполняемые программой действия, а просто говорит, что это «какая-то хорошая программа». Впервые этот термин появился в Visual J + + 6, а оттуда, очевидно, перешел в ранние версии Visual Studio.NET. Поскольку оно — больше я не буду использовать это слово на букву <<р» — содержит один или несколько проектов, термин «группа проектов» будет в этом случае гораздо информативнее.)
旦旦аожг Types:аожг Types:КМм«>:КМм«>:;_j vw 疝 Вг«с ToladtsI二I—iBFrgCbI f 二I visual 匚十•》Leetsi 99tup ос Uf/j/m: Pf^leds* _J XherPruH»”2j '也w 5U* SaKtions;_j vw 疝 Вг«с ToladtsI二I—iBFrgCbI f 二I visual 匚十•》Leetsi 99tup ос Uf/j/m: Pf^leds* _J XherPruH»”2j '也w 5U* SaKtions逬詢' 口 Ml Ubf ayW ndowCOfMfC»' L^brery逬詢' 口 Ml Ubf ayW ndowCOfMfC»' L^breryAppkstcriAppkstcri—AppC4UCf—AppC4UCf您聲jgra wfcwLt»a> «您聲jgra wfcwLt»a> «j:A можх rnr gj•飞 5#b servicM to 皿 Iron ortw eobdEsj:A можх rnr gj•飞 5#b servicM to 皿 Iron ortw eobdEsLpoMion:LpoMion:Рис. 4-19. Создание Web-службы в диалоговом окне Project.Рис. 4-19. Создание Web-службы в диалоговом окне Project.I v»eo?erv<*i|htt|H 丿加d'—2вГ°^»<I v»eo?erv<*i|htt|H 丿加d'—2вГ°^»<
旦
旦
аожг Types:
аожг Types:
КМм«>:
КМм«>:
;_j vw 疝 Вг«с Toladts
I二I—iBFrgCb
I f 二I visual 匚十•》Leets
i 99tup ос Uf/j/m: Pf^leds
* _J XherPruH»”
2j '也w 5U* SaKtions
;_j vw 疝 Вг«с Toladts
I二I—iBFrgCb
I f 二I visual 匚十•》Leets
i 99tup ос Uf/j/m: Pf^leds
* _J XherPruH»”
2j '也w 5U* SaKtions
逬詢' 口 Ml Ubf ayW ndow
COfMfC»' L^brery
逬詢' 口 Ml Ubf ayW ndow
COfMfC»' L^brery
Appkstcri
Appkstcri
—
AppC4UCf
—
AppC4UCf
您聲jgra wfcw
Lt»a> «
您聲jgra wfcw
Lt»a> «
j:A можх rnr gj•飞 5#b servicM to 皿 Iron ortw eobdEs
j:A можх rnr gj•飞 5#b servicM to 皿 Iron ortw eobdEs
LpoMion:
LpoMion:
Рис. 4-19. Создание Web-службы в диалоговом окне Project.
Рис. 4-19. Создание Web-службы в диалоговом окне Project.
I v»eo?erv<*i
|htt|H 丿加d'—2вГ°^»<
I v»eo?erv<*i
|htt|H 丿加d'—2вГ°^»<
KuluUunbcptorW J
^^ ftrutm WetSwvfei' (1 soject) & WcbServIcel
- 团 RafevwKes p А»з«гЫ**1лГо.Яз 彳 <3aDel<a>ax .Ш1.М> 叁 zeb.ecrHg 勺 WebSeweel vflico
M Sf^s E x「ha [,: 1 .ч г —
Рис. 4-20. Файлы Time Web Services в окне Solution Explorer.
Интересно писать программу, которая хранится в файле Ser- vicel .asmx( где на самом деле «живет» eg, реализующий Web- службу (рис. 4-21). Такие функции среды разработки, как автозавершение, заметно облегчают написание программ в Visual Studio.NET no сравнению с Блокнотом.
Шаблон проекта Web Service генерирует остальные файлы (рис. 4-20). Web.contig — это файл с данными XML, содержащий сведения о параметрах конфигурации, которые сообщают A5P.NET, как работать с Web-службой в период выполнения. Этот файл мы уже видели в главе 3. В частности, он содержит значение таймаута сеанса ASP.NET. В настоящее время этот файл придется редактировать вручную, но для этого определенно требуется хорошая программа конфигурирования, возможно на основе ММС (Microsoft Management Console). Надеюсь, что такая программа будет создана перед окончательным выпуском этого ПО. WebServicel .vsdisco — это XML-файл данных, который служит для управления динамического обнаружения Web-службы клиентами. Элементы конфигурации по умолчанию, которые можно видеть в загруженном коде, просто указывают ASP.NET исключить из сгенерированногоWSDL-файла некоторые подкаталоги (созданные в процессе опубликования). На данном этапе разработки проекта этот файл пока еще слабо документирован.
.ASMX-^файл — это целевой файл для запросов клиентов. В отличие от предыдущего примера, когда в этом файле «жил» код, в нашем примере здесь стоит ссылка. Атрибут Codebehindуказы- iBaei клиенту, где находится код, реализующий службу:
<X@WebService Lanдuaдe="vb^^ Codebehind="S6rvice1.asmx.vb°
Class="WebService1. ServlceV'b
Функции обработки событий уровня проекта (такие как Applica- tion_Sta「t и Application_End), «живут» в файле Global.asax. В эти функции следует поместить собственный код, который будет вызван ASP.NET для обработки указанных событий. Файл Global, asax соединяет A5P.NET и остальные файлы.
При сборке Visual Studio.NE] автоматически публикует проект на заданном сервере (в этом случае заданном по умолчанию). Чтобы протестировать Web-службу, просто запустите отладчик из
главного меню Visual Studio.NET, Он BbiBogin проверочную страницу, похожую на показанную выше (рис. 4-5), с помощью которой очень удобно решать эту задачу. Также можно устанавливать контрольные точки и всячески отлаживать Web-службу. Таким образом, разработка приложений проходит гладко, быстро и даже, не побоюсь этого слова, весело,
Imports System.Web.Services
Public Class Servicel
Inherits System.Web.Services.WebService
# RegionWeb Services Designer Generated Code
'Required by the WebServices Designer.
Private components As System.ComponentModel.Container
IPublic Sub New( )
MyBase.New()
'CODEGEN; This procedure is required by
' the WebServices Designer.
'Do not modify it using the code editor. InitializeComponent( )
'После вызова InitiallzeComponent добавьте 'собственный инициализационный код.
End Sub
IPrivate Sub InitializeComponent( )
'CODEGEN: This procedure is required by
'the WebServices Designer.
'Do not modify it using the code editor.
components = New System.ComponentModel.Container( ) End Sub
Overrides Sub Dispose( )
'CODEGEN; This procedure is required by
'the WebServices Designer.
*Do not modify it using the code editor.
End Sub
#End Region
<WebMethod( )> Public Function GetTime(ByVal ShowSeconds As Boolean) As String
If (ShowSeconds = True) Then
Return Now( ).ToLongTimeString
Else
Return Now( ) .ToShortTimeString
End If
End Function
End Class
Рис. 4-21. Код Web-службы из файла Service 1 .asmx.
Управление состоянием Web-службы
По умолчанию Web- • службы находятся в неопределенном, состоянии.По умолчанию Web- • службы находятся в неопределенном, состоянии.V объектов Web-служб в их естественном состоянии (здесь следует тяжкий вздох) состояние попросту отсутствует. Это означает, что для обработки каждого входящего запроса ASP.NE1 создает новый экземпляр объек-
По умолчанию Web- • службы находятся в неопределенном
, состоянии.
По умолчанию Web- • службы находятся в неопределенном
, состоянии.
та и уничтожает его по завершении обработки вызова. Результа-
ты предыдущего вызова недоступны последующему, если толь- Iко не отступить от этого правила и не сделать их доступными. Эта ситуация в некотором смысле аналогична активизации по требованию в СОМ + .
В ASP-NET Web-c^0K6bi могут хранить сведения о состоянии в контёй-::.нерах состояния науровне сеанса илиприложения.В ASP-NET Web-c^0K6bi могут хранить сведения о состоянии в контёй-::.нерах состояния науровне сеанса илиприложения.Иногда это то, что надо, иногда — нет. В случае показанной в этои главе службы такая ситуация всех устраивает. Будет или не будет текущий клиент показывать секунды — от этого никак не зависят результаты, которые получит следующий клиент. Каждый вызов функции самодостаточен, у любого вызова
В ASP-NET Web-c^0K6bi могут хранить сведения о состоянии в контёй-::
.нерах состояния науровне сеанса или
приложения.
В ASP-NET Web-c^0K6bi могут хранить сведения о состоянии в контёй-::
.нерах состояния науровне сеанса или
приложения.
нет причин помнить хоть что-нибудь о предыдущем. Можно возразить, что здесь нет объекта в его классическом определении (совокупность данных и обрабатывающих их команд). Клиент просто осуществляет вызов, который больше ни с чем не связан, в силу чего это не объект, а функция. Можно спорить о семантике, однако все работает. Если такое поведение не годится, можно сохранять состояние объекта между вызовами. Физически экземпляры объекта no-прежнему создаются при необходимое-
ти и уничтожаются после, но ASP.NET позволяет сохранить данные, которые обрабатывались объектом в прошлой жизни, подобно тому, как завещание позволяет оставить наследство потомкам. В обсуждении ASP.NET (см. глазу 3) сказано, что существуют два различных типа состояния объектов, которые используются страницами ASP.NET, каждый со своими преимуществами и недостатками. Те же возможности управления состоянием доступны и для объектов Web-служб. В базовом классе WebService, производным от которого является наша Web-служба, сведения о состоянии хранятся в двух наборах, один из которых называется Application, а другой — Session. Можно поместить туда данные, а потом извлечь их, обращаясь к наборам с помощью строк с именами элементов.
Глава 5
Windows Forms
Убавь! Залей! Куда глядишь? Вы слишком много жжете!
Ты на посудине, а вишь, жжешь как на пакетботе!
За «думал» — денег не дают! Не думай, а трудись!
О Господи, попробуй тут разок не чертыхнись!
I Р. Киплинг отрудности обучения системных администраторов и необходимости обеспечения их надежными инструментами.
(«Молитва МакЭндрю». 1894г.)
Суть проблемы
Рынок программ дляWindows являетсясамым большим рыню)А-ПО в мире а останетсятаковым в ближайшембудущем.Рынок программ дляWindows являетсясамым большим рыню)А-ПО в мире а останетсятаковым в ближайшембудущем.Впредыдущихглавах я рассказывал осозда- нии серверного кода на платформе Microsoft .NET — безусловно, она очень хорошо подходит для этой цели. Однако какая ОС установлена на всех компьютерах вашего офиса, на домашней рабочей машине и на компьютере, на которым играют ваши дети?
Рынок программ дляWindows являетсясамым большим рыню)А-ПО в мире а останетсятаковым в ближайшембудущем.
Рынок программ дляWindows являетсясамым большим рыню)А-ПО в мире а останетсятаковым в ближайшембудущем.
На ноутбуке сидящего рядом пассажира самолета? За исключе-
нием нескольких фанатиков Macintosh и группы странноватых любителей Linux, это Microsoft Windows. На мой взгляд, разработчики часто забывают, что число клиентских компьютеров с Windows несравнимо больше числа серверов под управлением данной ОС — возможно, больше, чем в 100 раз. Думаете, пользователи этих компьютеров остановились на Windows из-за ее возможностей по обработке транзакции или развертыванию много-
серверных комплексов? Нет, они поступили так из-за удобного пользовательского интерфейса и большого количества настольных приложений для этой ОС. Рынок программ для Windows — самый большой рынок ПО з мире и останется таковым в ближайшем будущем. Мы станем создавать приложения, отличные от разрабатывавшихся 10лет назад. Программы для работы с электронными таблицами и текстовые процессоры давно заняли свое место под солнцем, однако мы no-прежнему будем программировать для настольных ПК Windows. Например, мы разработаем несколько приложений с богатым пользовательским интерфейсом типа программы Napster для поиска музыкальных записей, упо- минавшеися в главе 4.
Разработчики настоль- 1 ных приложений часто сталкиваются с теми же проблемами, что и раз- :работч ики серверного ;Разработчики настоль- 1 ных приложений часто сталкиваются с теми же проблемами, что и раз- :работч ики серверного ;ПО.ПО.IIНекоторые архитектурные проблемы, с кото- pbIM приходится сталкиваться разработчикам настольного ПО, отличаются от проблем раз- работниковсерверных приложений. Например, разработчик настольных программ рассчитывает на отдельного человека, реагиру-Некоторые архитектурные проблемы, с кото- pbIM приходится сталкиваться разработчикам настольного ПО, отличаются от проблем раз- работниковсерверных приложений. Например, разработчик настольных программ рассчитывает на отдельного человека, реагиру-ющего на события гораздо медленнее компь-ющего на события гораздо медленнее компь-
Разработчики настоль- 1 ных приложений часто сталкиваются с теми же проблемами, что и раз- :работч ики серверного ;
Разработчики настоль- 1 ных приложений часто сталкиваются с теми же проблемами, что и раз- :работч ики серверного ;
ПО.
ПО.
I
I
Некоторые архитектурные проблемы, с кото- pbIM приходится сталкиваться разработчикам настольного ПО, отличаются от проблем раз- работниковсерверных приложений. Например, разработчик настольных программ рассчитывает на отдельного человека, реагиру-
Некоторые архитектурные проблемы, с кото- pbIM приходится сталкиваться разработчикам настольного ПО, отличаются от проблем раз- работниковсерверных приложений. Например, разработчик настольных программ рассчитывает на отдельного человека, реагиру-
ющего на события гораздо медленнее компь-
ющего на события гораздо медленнее компь-
ютера, и поэтому всегда имеет в своем распоряжении множество циклов процессора и в отличие от разработчика серверного ПО может не волноваться о масштабируемости. С другой стороны, проблемы, встречающиеся тем и другим программистам, как правило, одни и те же. Например, разработчики стараются повторно использовать исходный код, написанный другими. Все они могут работать с кодами разных типов (скажем, с кодом графической анимации и кодом для доступа к БД), но в итоге сталкиваются с экономической целесообразностью использовать рез 州 ь- таты труда своих коллег. Всех их волнует контроль версий при ложения, абстрагирование от различий в реализациях языков программирования и совместимость с СОМ. До недавнего времени разработчики настольных программ по большей части игнорировали безопасность, считая, что она нужна лишь серверным приложениям. Но теперь, когда большой объем кода передается no Web, они столкнулись с проблемами аутентификации и авторизации, уже долгое время терзающих их коллег, разработчиков серверных программ. Добро пожаловать в реальный мир.
Чтобы обеспечить программистов стандартами многократного использования, различные среды разработки реализуют разнообразные подходы к готовым пользовательским интерфейсам. Visual Basic предоставляет модель программирования^ основанную на событиях и формах, которая благодаря простоте ис-Чтобы обеспечить программистов стандартами многократного использования, различные среды разработки реализуют разнообразные подходы к готовым пользовательским интерфейсам. Visual Basic предоставляет модель программирования^ основанную на событиях и формах, которая благодаря простоте ис-Разработчикам настольных приложений, равно как и разработчикам серверного ПО, требуются готовые решения этих проблем. Помимо общих с разработчиками серверных приложений проблем, у создателей настольного ПО имеются и собственные трудности. Вспоминаю, как десять лет назад я писал приложения для Windows на С. Большая часть времени уходила на создание кода, реализующего стандартные элементы пользовательского интер- фейсаWindows-приложений. Тогда не было готовых строк состояния и панелей инструментов, и поэтому мне приходилось писать собственный код. Точно так же поступал любой, кто желал использовать эти элементы интерфейса в своих приложениях. Я вынужден был создавать собственные обработчики команд, позволявшие получать сообщения от элементов управления. Меня все еще мучают кошмары, когда я вспоминаю, как бездумно пообещал клиенту добавить в приложение функцию предварительного просмотра печатаемых страниц за фиксированную сумму. Экономически (уже имеющийся код пишется повторно, в третий раз, в четвертый и т. д.) и эргономически (непредсказуемое поведение каждой новой панели инструментов сводит пользователей с ума) нецелесообразно, чтобы каждый программист писал собственный код для стандартных элементов пользовательского интерфейса. Нам нужны готовые решения общих проблем разработки интерфейса.
Чтобы обеспечить программистов стандартами многократного использования, различные среды разработки реализуют разнообразные подходы к готовым пользовательским интерфейсам. Visual Basic предоставляет модель программирования^ основанную на событиях и формах, которая благодаря простоте ис-
Чтобы обеспечить программистов стандартами многократного использования, различные среды разработки реализуют разнообразные подходы к готовым пользовательским интерфейсам. Visual Basic предоставляет модель программирования^ основанную на событиях и формах, которая благодаря простоте ис-
Большинству придоже- ниб с графическим ин*, ■ терфейсом пользовате- < АЯ нужен стандартный набор возможностей, что откРьшает дорогу готовйи функциа- . | нальности.
пользования стала довольнопопу 八 ярноП.■ .爨
В Visual C + + реализованы классы Microsoft Foundation Classes (MFC), предоставляющие готовую функциональность (например, функцию предварительного просмотра, с которой в свое время мне пришлось помучаться) на основе системы наследования C+ + . «Плясать от кода», как в Visual C + + , гораздо труднее, чем работать с основанной на формах парадигмой программирования Visual Basic, но меня привлекают широкие возможности язы-
•• Разработчикзачастую останавливается на конкретном языке из-заимеющихся в нем гото-зых элементов пользо-вательскоао интер-фейсал а не из-за того,что этот язык подходит, для решения стоящихперед ним задач.•• Разработчикзачастую останавливается на конкретном языке из-заимеющихся в нем гото-зых элементов пользо-вательскоао интер-фейсал а не из-за того,что этот язык подходит, для решения стоящихперед ним задач.ка Visual C++. Программистам приходилось выбирать между мощным языком и возможностью быстрой разработки пользовательского интерфейса. В Visual Basic я обычно создаю интерфейсные приложения, поскольку мне нравится его редактор форм и удобство подключения элементов управления. Однако
•• Разработчикзачастую останавливается на кон
кретном языке из-заимеющихся в нем гото-зых элементов пользо-
вательскоао интер-фейсал а не из-за того,что этот язык подходит, для решения стоящих
перед ним задач.
•• Разработчикзачастую останавливается на кон
кретном языке из-заимеющихся в нем гото-зых элементов пользо-
вательскоао интер-фейсал а не из-за того,что этот язык подходит, для решения стоящих
перед ним задач.
слабый язык, в котором синтаксис СОМ- I объектов непонятен, обработка ошибок реализована идиотски, и вызовАРкфункций для
выполнения стандартных задач (работа с реестром и т. д.) затруднен, меня жутко злят. Visual C + + я люблю за мощный язык n рограммирования / но здесь меня доканывает низкий уровень абстракции (например, трудности с обработкой и генерацией событий).
: Как и всем остальным людям, разработчикам Как всегда, мы
(и я не исключение) настольных приложении хочется получить хотим, чтобы нам | все сразу и не отдавать чего-нибудь взамен.
оставалось реализовать Нам нужны готовые решения общих с раз- только бизнес-логику. : работчиками серверного ПО проблем. Мы
хотим быстро создавать пользовательский интерфейс, но нам хочется делать это на мощном языке программирования (в идеале — выбранном нами). Для обеспечения согласованности везде должна применяться единая модель программирования, И чтоб все это было недорого. Что ж, когда мы пишем Санта-Клаусу, попросить у него лошадку ничего не стоит.
Архитектура решения
. Как вы уже знаете, .NET предоставляет стан- Многие функции
платформы NETnOMh дартную функциональность для решения об- гают разработчикам как сцих проблем разработчиков серверных и серверного, так инастольных приложений (подробнее о них см.
настольного ПI главу2). Разработчики настольного ПО полю
бят и станут работать с предоставляемой CLR моделью многократного использования кода, функциями управления версиями и памятью, упрощенным развертыванием закрытых сборок, организацией пространства имен, функциями защи-
ты и совместимостью с COM. Web-службы (см. главу 4} дадут разработчикам настольных приложений возможности и способы под-
ключения к серверам.
WFndows Forms • этопакет, предоставляю-щий готовые элементыпользовательского ин-терфейса а составе CLR.WFndows Forms • этопакет, предоставляю-щий готовые элементыпользовательского ин-терфейса а составе CLR.В Microsoft .NET разработчикам доступен бо- гать I и набор функциональности под удивительно бессмысленным названием Windows Forms. Windows Forms предоставляет .NET- классы с готовыми компонентами пользовательского интерфейса, пригодными для боль-
WFndows Forms • этопакет, предоставляю-щий готовые элементыпользовательского ин-терфейса а составе CLR.
WFndows Forms • этопакет, предоставляю-щий готовые элементыпользовательского ин-терфейса а составе CLR.
шинства настольных приложений. Если вы думаете о гибриде Visual Basic и MFC, который реализован в .NET и благодаря этому доступен любому языку программирования, вы думаете практически в правильном направлении. Windows Forms поддерживает меню, панели инструментов и строки состояния, печать и предварительный просмотр, размещение элементов управления ActiveX, а также упрощенный доступ к БД и Web-службам. Это настолько богатый и обширный набор функциональности, что в данной главе я смогу привести лишь поверхностный его обзор, Отдавая должное Windows Forms, нужно сказать, что описание этой технологии займет целую книгу, и, насколько я знаю, Чарльз Петцольд сейчас пишет именно такую книгу для Microsoft Press (англоязычное издание планируется к выходу осенью 2001 г.).
Внимание
Как и все мощные инструменты^ средства разработки пользовательского интерфейса в Windows Forms являются обоюдоострьгми. Они позволяют создавать как отличные, так и ужасные интерфейсы. Воина слишком важна, чтобы предоставить ее генералам, а интерфейс слишком важен, чтобы оставить его программистам. Любой, кто занимается разработкой пользовательского интерфейса без изучения специализированной литературы (About Facer Alan Cooper, IDG, 1995; Design of Everyday Things, Donald Normal, Doub' leday, 1990), преступно небрежен. А прочитав книгу о не- n ривлекательны x Web-узлах Web Pages That Suck (Vincent Flander, MichaelWillis; Sybex, 1998)вы, возможно, не станете создаеать такой узел.
Простейший пример
Как всегда, я начал изучать Windows Forms, написав простейший пример, который только смог придумать (рис. 5-1). Исходный код можно загрузить с Web-узла данной книги {http:// www.introdu- cingmicrosoft.net) и работать вместе со мной- В Visual Studio.NET очень удобно создавать проекты такого типа, но чтобы подчеркнуть языковую и инструментальную независимость Windows
Пример приложенияWindows Forms,
Forms, я написал пример на Visual Basic в Блокноте. Хотя приложение весьма тривиаль-
написанного на Visualно и включает немного кода, оно все же де-
Baste в Блокноте.
монстрирует часть самых OCHOSHbIX и важных функций Windows Forms.
Рис. 51 Пример приложения Windows Forms.
В данном примере неимпортируются какие-
Ниже приведен исходный кодмоейпрограм- мы (рис. 5-2). Заметьте: в данном примере я
либо пространства не импортировал пространств имен (подроб-
умен.
нее о них см. главу 2). Без нужды их можно не импортировать — это делается, лишь что
бы с уверенностью вызывать объекты по коротким именам вместо полных. Я решил поступить так, чтобы вы четко видели, потомком какого класса является каждый объект. При компиляции зам придется включить некоторые системные DLL no ссылке, которая имеется в пакетном файле компиляции, прилагаемом к загруженному вами исходному коду. При работе с проектом Win-
dows Forms в Visual Studio NETэто автоматически сделает за вас сама среда разработки.
Namespace IMDN.SimplestHelloWorid
'Объявляем новый класс - потомок базового класса CLR ' под названием System.Windows.Forms.Form.
Public Class SimplestHelloWorld : Inherits
System.Windows.Forms.Form
' Конструктор класса. Передаем вызов базовому классу
' для его инициализации и затем задаем
'заголовок нашего окна.
Public Sub New( )
MyBase.New
Me.Text = "Introducing Microsoft. Net.: Hello World"
End Sub
' Данная функция является точкой входа приложения Windows Forms. Создаем новый экземпляр объекта нашей ' формы и передаем его системной функции, 'запускающей приложение.
Shared Sub Main( )
System.Windows.Forms.Application.Run(New _ SimplestHelloWorid( ))
End Sub
End Class
End Namespace
Рис. 5-2. Листинг простейшего примера,
В Windows Forms окно верхнего уровня называется формой (form); у каждого приложения должно быть хоть одно такое окно. Программистам на Visual Basic это требование знакомо. Программисты на C + + могут считать форму основным окном своего Iприложения. В Windows Forms функциональн ость, необходимая I каждому окну верхнего уровня, реализована в базовом классе CLR по имени System. Windows.Forms.Form. Этот класс позволяет размещать элементы управления, поддерживает закрепление дочернего окна, реагирует на события и т. д.
d—J75O
Класс нашей <|юрмыявляется производнымот базового класса CLR,предоставляющегоосновную готовуюфун кцисзнальностьформы.Класс нашей <|юрмыявляется производнымот базового класса CLR,предоставляющегоосновную готовуюфун кцисзнальностьформы.Мы подменяемконструктор класса,чтобы добавить новуюфункциональность присоздании 中叩 ммМы подменяемконструктор класса,чтобы добавить новуюфункциональность присоздании 中叩 ммЯ начал разработку приложения с создания нового класса Simp/estHello\Abrld, происходи- щего от System. Windows.Forms.Form. Сооб- сцая о наследовании, я указываю компилятору получить всю функциональность базового класса, разработанную Microsoft, и включить ее в мой производный класс (подробнее о наследовании см. главу 2).
Класс нашей <|юрмыявляется производнымот базового класса CLR,предоставляющегоосновную готовуюфун кцисзнальностьформы.
Класс нашей <|юрмыявляется производнымот базового класса CLR,предоставляющегоосновную готовуюфун кцисзнальностьформы.
Мы подменяемконструктор класса,чтобы добавить новуюфункциональность присоздании 中叩 мм
Мы подменяемконструктор класса,чтобы добавить новуюфункциональность присоздании 中叩 мм
Теперь нужно дополнить класс. представля- ющйи окно верхнего уровня, кодом, определяющим отличия нашего класса от базового.
В данном случае мы подменяем метод New (который является конструктором; см. главу 2) базового класса, вызываемый при каж-
дом создании экземпляра нашего объекта. В этом методе мы сначала вызываем конструктор базового класса, тем самым позво-
ляя последнему завершить инициализацию перед выполнением нами каких-либо действий в производном классе. В ООП невыполнение этого — распространенная причина ошибок. Архитектура .NET не вызывает конструктор базового класса автоматически, поскольку иногда вам требуется пропустить этот вызов или осуществить другой (например, если вы целиком заменяете часть функциональности базового класса, вместо того чтобы тупо на него полагаться, как мы делаем здесь). V базового класса есть свойство Text, содержащее строку в заголовке формы. Мы устанавливаем в этом свойстве недвусмысленный текст.
Мы создаем экземпл;ф нашего объекта «формам и указываем загрузчику запустить его. , |Мы создаем экземпл;ф нашего объекта «формам и указываем загрузчику запустить его. , |Теперь нам н ужно подключить форм'у верхнего уровня, чтобы указать системному загрузчику окно? которое следует вывести при запуске приложения. Если бы мы работали с Visual Studio .NET, среда разработки автома
Мы создаем экземпл;ф нашего объекта «формам и указываем загрузчику запустить его. , |
Мы создаем экземпл;ф нашего объекта «формам и указываем загрузчику запустить его. , |
тически добавила бы весь необходимый код. Но ведь мы работаем в Блокноте, и код придется добавить самостоятельно. При запуске программы загрузчик ищет функцию Main, которую я добавил в наш объект. Эта функция может присутствовать лишь в начальной форме приложения, и загрузчик вызывает ее лишь раз. Спецификатор Shared (для фанатов С + ^^^^J^^^^^^^^^^^^^^^^^^^^^^^Bstatic) означает, что все объекты класса используют лишь один экземпляр Main. За-
грузчик CLR вызывает Main для запуска приложения. Вы можете дополнить ее любым кодом. Приложение Windows Forms требует, чтобы один из потоков принимал от ОС сообщения пользовательского интерфейса (например, нажатия клавиш и щелчки мыши) и передавал их корректным обработчикам событий. Статическая функция CLR — System. Windows.FormsApplication.Run— создает и запускает именно такой поток. Передав ей новый экземпляр нашего объекта «форма», мы указываем, какой форме передавать сообщения.
Более сложный пример: события
Iи элементы управления
Наше простейшее приложение демонстрирует несколько необходимых функций, но и только. На форме нет даже кнопки ОК. Теперь перейдем к менее тривиальному приложению (рис. 5-3).
Пример более сложногоприложения WindowsForms.Пример более сложногоприложения WindowsForms.Хотя это и не требовалось, здесь я работал в Visual Studio.NET, так как встроенный редактор данной среды разработки значительно упрощает взаимодействие с элементами управления.
Пример более сложногоприложения WindowsForms.
Пример более сложногоприложения WindowsForms.
[、Nnt Z,A. Simple M^S
|ЁёйНейНв>е
Рис. 5-3. Более сложная форма Windows Forms, созданная в Visual Studio NET.
Вы увидите, что модель программирования Windows Forms напоминает модель программирования Visual Basic 6.0, хотя и доступна в любом языке CLR. Это хорошая идея, поскольку модель программирования Visual Basic 6.0 была и остается весьма популярной. Многие программисты, включая меня, не выносят скрывающегося за этой моделью языка, и теперь мы можем использо-
вать любой CLR-совместимый язык по собственному выбору. Кроме того, сторонники C + + выиграли большинство схваток по поводу модели ООП, обсуждавшейся в главе 2. Оптимист скажет, что Microsoft смешала лучшие возможности двух принципов проектирования. Пессимист станет уверять, что программистам на Visual Basic следует дать утешительный приз.
На формах обычно имеются вза и модействую щие с пользователем элементы управления, которые получают и выводятему данные. Как и Visual Basic 6.0, пакет Windows Forms среды CLR включает массу элементов управления. Создавая это приложение, п перетаскивал элементы управления с панели инструментов Visual Studio №Т на форму (рис. 5-4). При этом Visual Studio №Т генерировала в коде формы обращения к CLR, которые создают элементы управления, задают их свойства и размещают их в нужном месте при начальном отображении формы. Вот сокращенная версия одного из таких методов (рис. 5-5).
ШЗШШШКЯЛ2 Слтропяпй ± •'I®!??士一 . •Л ut*.tUNnGw Х^М» * МфГМШ^ P <3wd*»x 6 e«Mk<rg "♦««*“ X Atiwrfk-. □ **■* •53 r*ww 3 L<*9»< i; rhrtedLlUflos 讨 Coorflnr 2* gw 笠 1,*« —ШЗШШШКЯЛ2 Слтропяпй ± •'I®!??士一 . •Л ut*.tUNnGw Х^М» * МфГМШ^ P <3wd*»x 6 e«Mk<rg "♦««*“ X Atiwrfk-. □ **■* •53 r*ww 3 L<*9»< i; rhrtedLlUflos 讨 Coorflnr 2* gw 笠 1,*« —FtffTOl.vK П>ейио1FtffTOl.vK П>ейио1aaaMwb»riw| 二•,〜 VaaaMwb»riw| 二•,〜 VSOWiiri У UTFeps 田"“1 »” MXQUS A rttmplH orm 7 Heftmcb▼1 VMTttjlrtz.^3 FFl.QSOWiiri У UTFeps 田"“1 »” MXQUS A rttmplH orm 7 Heftmcb▼1 VMTttjlrtz.^3 FFl.QГмгпИ *b НяЙирегПв,ГмгпИ *b НяЙирегПв,tul:巾二 3»>m ToJ “sn •;. 4tul:巾二 3»>m ToJ “sn •;. 411AdvancedAdvancedРя®*®*^Ря®*®*^Рис. 5-4. Панель инструментов Visual Studio №ГРис. 5-4. Панель инструментов Visual Studio №Г
ШЗШШШКЯЛ
2 Слтропяпй ± •'I®!??士一 . •
Л ut*
.tUNn
Gw Х^М» * МфГМШ^ P <3wd*»x 6 e«Mk<rg "♦««*“ X Atiwrfk-. □ **■* •53 r*ww 3 L<*9»< i; rhrtedLlUflos 讨 Coorflnr 2* gw 笠 1,*« —
ШЗШШШКЯЛ
2 Слтропяпй ± •'I®!??士一 . •
Л ut*
.tUNn
Gw Х^М» * МфГМШ^ P <3wd*»x 6 e«Mk<rg "♦««*“ X Atiwrfk-. □ **■* •53 r*ww 3 L<*9»< i; rhrtedLlUflos 讨 Coorflnr 2* gw 笠 1,*« —
FtffTOl.vK П>ейио1
FtffTOl.vK П>ейио1
aaaMwb»riw| 二•,〜 V
aaaMwb»riw| 二•,〜 V
SOWiiri У UTFeps 田"“1 »” MXQUS A rttmplH orm 7 Heftmcb
▼1 VMTttjlrtz.^
3 FFl.Q
SOWiiri У UTFeps 田"“1 »” MXQUS A rttmplH orm 7 Heftmcb
▼1 VMTttjlrtz.^
3 FFl.Q
ГмгпИ *b НяЙирегПв,
ГмгпИ *b НяЙирегПв,
tul:巾二 3»>m ToJ “sn •;. 4
tul:巾二 3»>m ToJ “sn •;. 4
1
1
Advanced
Advanced
Ря®*®*^
Ря®*®*^
Рис. 5-4. Панель инструментов Visual Studio №Г
Рис. 5-4. Панель инструментов Visual Studio №Г
Private WithEvents Buttonl As System.Windows.Forms.Button Private WithEvents TextBoxI As System.Windows.Forms.TextBox
” Примечание: следующая процедура необходима
Windows Forms Designer, и ее можно изменить
с его помощью. Модифицировать процедуру
' с помощью редактора кода не следует.
Private Sub InitializeComponent( )
'Создаем элементы управления
Me.Buttonl = New System.Windows.Forms.Button()
Me.TextBoxI = New System Windows.Forms.Text8ox()
' Задаем свойства кнопки
Me,Buttonl. Location = New System.Drawing. Point(112, 96)
Me,Button1.Slze = New System.Drawing.Size(75, 40)
Me.Buttonl.Tabindex = 1
Me,Buttonl.Text = "Then Click Here"
' Задаем свойства текстового поля
Me,TextBoxI.Location = New System.Drawing.Point(48, 48)
Me.TextBoxI.Text = "Enter Text Here"
Me.TextBoxI.Tabindex = 0
Me.TextBoxI.Size =20)
' Задаем свойства формы.
Me.Text = "Not Quite As Simple Windows Forms Demo"
Me.Controls.AddRange(Hew System.Windows.Forms.ControlO _ {Me.TextBoxI» Me.Buttonl})
End Sub
Рис. 5-5. Сокращенная версия метода InitializeComponent, демонстрирующая создание элемента управления.
Данный код размещается в закрытом мето- ge InitializeComponent, вызываемом из конструктора формы. В Visual Basic ,NETэлемен- ты управления на форме создает код, кото-
. Эл(управления
на Форме создаются функциями CLR.
рый можно просмотреть, а не некая невидимая рука за кулисами, как это было в Visual Basic 6.0. Кроме того, новые элементы управления добавляются в набор Controls, который форма унаследовала от базового класса. Он позволяет форме следить за всеми ее элементами управления.
Элемент1:>1 управлениязапускают события ,перехватываемыеобработчикамиа вашем коде.Элемент1:>1 управлениязапускают события ,перехватываемыеобработчикамиа вашем коде.1 При взаимодействии пользователя с элементами управАенип последние генерируют со~ бытия, передаваемые своим контейнерам. Так, элемент управления «кнопка» генерируетсобытие, сообщающее о ее нажатии. Нам потребуется написать функции обработки
Элемент1:>1 управлениязапускают события ,перехватываемыеобработчикамиа вашем коде.
Элемент1:>1 управлениязапускают события ,перехватываемыеобработчикамиа вашем коде.
событий, вызываемые, когда элемент управления извещает о событии. Для этого в класс формы добавляется метод <Имя_э- лемента_управления> _< Имяуобытия>; здесь — метод But- to"7_a,ck(puc. 5-6). При щелчке кнопки Visual Studio .NETдобав- ляет нужный код автоматически; любой же человек, работающий с Блокнотом, может добавить метод Button 1_Click в код класса формы вручную. Когда элемент управления запустит событие, механизм событии CLR ищет функцию обработки, получив от элемента точное название события, и, обнаружив подходящую функцию, запускает ее. Кроме того, функция Visual Basic под названием AddHandler позволяет вызывать обработчик события динамически, в процессе выполнения кода.
' Пользователь щелкнул кнопку. Выводим сообщение с текущим содержимым текстового поля.
Private Sub Buttonl_C1lck(ByVa1 sender As Object,.
ByVai e As System.EventArgs)
MessageBox.Show("You entered: “ + textBox().Text) End Sub
Рис. 5-6. Обработчик события «щелчок кнопки».
I Формы попдерживают детерминированное
Формы поддерживают 尸 發> 厂 』 厂 厂
метет Oppose qahI завершение (о нем см. главу 2, раздел, поев%
детерминирован ногещенный сборке мусора). Метод Dispose базо-
завершения.вого класса System. Windows. For ms. Form no-
зволяет клиенту сразу ликвидировать форму и освободить занимаемые ей ресурсы, не ожидая и не вызывая полную сборку мусора. Это особенно важно в Windows Forms, так
каку каждой формы есть используемые ОС описатели окна для всех присутствующих на форме элементов управления и еще один описатель для самой формы. В Windows 95/98 (не заводите меня) ощущается дефицит таких описателей окна, а детерминированное завершение поз воля ei клиенту сразу по завершении работы с формой освободить занимаемые ей ресурсы. Изучив исходный код, вы увидите, что Visual Studio .NET автоматически переопределяет данный метод, добавляя во все элементы управления на форме код для вызова метода Dispose.
Создание собственных элементов
управления Windows Forms
Нам необхоаимавозможность создаватьсобственные элементыуправления .NET.Нам необхоаимавозможность создаватьсобственные элементыуправления .NET.пользователи. Нампользователи. НамДля разработки хороших приложений Windows Forms нужны хорошие элементы управления. CLR предоставляет множество непе хих и полезных элементов управления однако этот набор — лишь малая толика двй- ствий, которые, возможно, захотят выполнять
Нам необхоаимавозможность создаватьсобственные элементыуправления .NET.
Нам необхоаимавозможность создаватьсобственные элементыуправления .NET.
пользователи. Нам
пользователи. Нам
бы действительно хотелось создавать собственные элементы уп- Iравления Windows — как в целях безопасности, так и для дальнейшего использования. И мы хотели бы достичь такого уровня развития рынка, при котором сторонние поставщики стали бы разрабатывать элементы управления, а мы — покупать их. Прежде всего для этого потребуется, чтобы в CLR была хорошая встроенная поддержка написания новых элементов управления.
Рынок готовых элемен-тов управления сторон-них производителейрастет фантастическимитемпами,Рынок готовых элемен-тов управления сторон-них производителейрастет фантастическимитемпами,Идея распространения готовых элементов пользовательского интерфейса (с методами, свойствами и событиями) в удобном пакете, подключаемом к интеллектуальной среде для быстрой разработки программ, оказалось очень удачной на рынке ПО, Все началось с
Рынок готовых элемен-тов управления сторон-них производителейрастет фантастическимитемпами,
Рынок готовых элемен-тов управления сторон-них производителейрастет фантастическимитемпами,
16-разряднь/хэлементов управления VBX и затем, когда Windows стала 32-разрядной, перешло на 32-разрядные элементы управления ActiveX. Страницы MSDN Magazine и Visual Basic Program- mer'sJournal переполнены рекламой элементов управления ActiveX, реализующих всяческую функциональность — от электронных таблиц и программ проверки орфографии до ленточных самописцев и электрокардиограмм. Элементы управления раз-
множились, как кролики в Австралии, конкурирующие с сумчатыми. Если платформа .NET получит признание, она будет обеспечивать дальнейшее процветание рынка ПО.
Технология Windows Forms поддерживает создание пользовательских элементов управления Windows Forms. Саму тему поддержки в этой книге раскрыть невозможно, однако я написал небольшое приложение, показывающее/ насколько просто создавать собственные элементы управления. Ниже показан клиент Windows Forms, содержащий элементуправления (рис. 5-7) и его код (рис. 5-8). Кое-кто, возможно, захочет раздуть эту тему до размеров целой книги, добавив побольше листингов и снимков экрана (молчу!).
MXMX・ ММс. • ■■• ■■■ ■<■■ /・ ММс. • ■■• ■■■ ■<■■ /
MX
MX
・ ММс. • ■■• ■■■ ■<■■ /
・ ММс. • ■■• ■■■ ■<■■ /
6:41:23 AM
Рис. 5-7. Элемент управления WindowsForms в клиенте Windows Forms.
\
Public Class UserControll
'Элемент управления наследует свойства базового класса CLR ' с именем UserControl,
Inherits System,Windows.Forms.UserControl
' У элемента управления есть открытое свойство ShowSeconds.
Private myShowSeconds As Boolean
I Public Property ShowSeconds() As Boolean Get
Return myShowSeconds End Get
Set
myShowSeconds = Value
End Set
End Property
' Переопределяем обработчик OnPaint для использования
' собственного алгоритма,
Protected Overrides Sub OnPalnt(ByVal e As
System.Windows.Farms.PaintEventArgs)
<код пропущен〉
IEnd Sub
End Class
Рис. 5-8. Сокращенный листинг кода элемента управления Windows forms.
Здесь начинается пример с элементом управления Windows Farms.Здесь начинается пример с элементом управления Windows Farms.Чтобы написать элемент управления Windows Forms, создайте класс на основе базового класса System. Windows.Forms. UserControl. Для этого просто откройте в Visual Studio
Здесь начинается пример с элементом управления Windows Farms.
Здесь начинается пример с элементом управления Windows Farms.
..NET проект Windows Control Library. Программистам на C+ + , со-
здававшим элементы управления ActiveX на основе базового класса MFC под именем COIeControl, такой подход покажется зна-
комым. Данный базовый класс содержит общую для всех элементов Windows Forms функциональность, начиная с простых свойств типа цвета фона и кончая сложными взаимодействиями с контейнером, нужными для перемещения и стыковки. Ваш элемент управления переопределяет обработчики событий Windows Forms, поведение которых требуется изменить. Здесь это обработчик уведомления OnPaint. в котором я создал вызовы CLR, закрашивающие прямоугольник моего элемента управления фоновым цветом и отображающие текущее время с использованием шрифта по умолчанию элемента управления. Делать что-либо
Создание элемсэнтауправления WindowsFerms — это лишьпростое наследованиефункциональностиготового базовогокласса CLR.Создание элемсэнтауправления WindowsFerms — это лишьпростое наследованиефункциональностиготового базовогокласса CLR.еще для создания данного элемента уп равле- ния не потребовалось. Чтобы добавить элемент управления в панель инструментов Visual Studio NET, щелкните панель правой кнопкой, выберите в контекстном меню команду Customize Toolbox и затем выберите нужный элемент управления (рис. 5-9).
Создание элемсэнтауправления Windows
Ferms — это лишьпростое наследованиефункциональностиготового базовогокласса CLR.
Создание элемсэнтауправления Windows
Ferms — это лишьпростое наследованиефункциональностиготового базовогокласса CLR.
■ustomizc ) aoiboK■ustomizc ) aoiboKNenespaceNenespace.met.2yrr._.met.2yrr._c:\Modunng reti!fhg, . , 3/—c:\Modunng reti!fhg, . , 3/—з/га.. 3/22f.3固,. 3/22/.3固,.з/га.. 3/22f.3固,. 3/22/.3固,.с \Nnntl—ntMScl C:—BsserntiM*、,.—nd—mdy'gaC ..<:1 ^<^«$«^^48^,.. c:'minnt\—Ыу\дас“..с \Nnntl—ntMScl C:—BsserntiM*、,.—nd—mdy'gaC ..<:1 ^<^«$«^^48^,.. c:'minnt\—Ыу\дас“..5fsteni, WeUUI .'а'зХо! Q$ Sysrew wet- UI,.—rtroh System Whcfows.—System, *et・.UJ Meb Hl m £ 5fsMMet— crt*ol«5fsteni, WeUUI .'а'зХо! Q$ Sysrew wet- UI,.—rtroh System Whcfows.—System, *et・.UJ Meb Hl m £ 5fsMMet— crt*ol«5y—I C—ntModa 5ystem. Wmddws.Forms SYstem-^rdows. Forms System.Web.Ui System. ЛА-'irrdows. Forms5y—I C—ntModa 5ystem. Wmddws.Forms SYstem-^rdows. Forms System.Web.Ui System. ЛА-'irrdows. Forms■OM Conkob I Modeling Shapes General 51■卅,・七 FramewciH 口FuonenU■OM Conkob I Modeling Shapes General 51■卅,・七 FramewciH 口FuonenUMam вMam вП Component口 Containercontrol g Context Menu □ Control□ •ZjnttolП Component口 Containercontrol g Context Menu □ Control□ •ZjnttolВZonlfOllВZonlfOll0 CustomVH 点甘 tor0 DataGric0Cat*j^口 Dat&GridPa^Style 0DataLlst0 CustomVH 点甘 tor0 DataGric0Cat*j^口 Dat&GridPa^Style 0DataLlst€; ^wmntU ssem b M—I... c:\v4nt1 assembiy \gdc'< . C:*AtTnt\aS5Wnbl^fl9C*( ..c ;ls<rtl—±2 дм:..с мппбаямтвМдаю .・€; ^wmntU ssem b M—I... c:\v4nt1 assembiy \gdc'< . C:*AtTnt\aS5Wnbl^fl9C*( ..c ;ls<rtl—±2 дм:..с мппбаямтвМдаю .・3/22/...ЗГ22/.. 3岡… 3/22/..3/22/...ЗГ22/.. 3岡… 3/22/..TberCortwi.CorhoilLdri|i>aQe. Unjua^o Neutrd— (Uzv&aW)TberCortwi.CorhoilLdri|i>aQe. Unjua^o Neutrd— (Uzv&aW)
■ustomizc ) aoiboK
■ustomizc ) aoiboK
Nenespace
Nenespace
.met.2yrr._
.met.2yrr._
c:\Modunng reti!fhg, . , 3/—
c:\Modunng reti!fhg, . , 3/—
з/га.. 3/22f.
3固,. 3/22/.
3固,.
з/га.. 3/22f.
3固,. 3/22/.
3固,.
с \Nnntl—ntMScl C:—BsserntiM*、,.
—nd—mdy'gaC ..
<:1 ^<^«$«^^48^,.. c:'minnt\—Ыу\дас“..
с \Nnntl—ntMScl C:—BsserntiM*、,.
—nd—mdy'gaC ..
<:1 ^<^«$«^^48^,.. c:'minnt\—Ыу\дас“..
5fsteni, WeUUI .'а'зХо! Q$ Sysrew wet- UI,.—rtroh System Whcfows.—
System, *et・.UJ Meb Hl m £ 5fsMMet— crt*ol«
5fsteni, WeUUI .'а'зХо! Q$ Sysrew wet- UI,.—rtroh System Whcfows.—
System, *et・.UJ Meb Hl m £ 5fsMMet— crt*ol«
5y—I C—ntModa 5ystem. Wmddws.Forms SYstem-^rdows. Forms System.Web.Ui System. ЛА-'irrdows. Forms
5y—I C—ntModa 5ystem. Wmddws.Forms SYstem-^rdows. Forms System.Web.Ui System. ЛА-'irrdows. Forms
■OM Conkob I Modeling Shapes General 51■卅,・七 FramewciH 口FuonenU
■OM Conkob I Modeling Shapes General 51■卅,・七 FramewciH 口FuonenU
Mam в
Mam в
П Component
口 Containercontrol g Context Menu □ Control
□ •Zjnttol
П Component
口 Containercontrol g Context Menu □ Control
□ •Zjnttol
ВZonlfOll
ВZonlfOll
0 CustomVH 点甘 tor
0 DataGric
0Cat*j^
口 Dat&GridPa^Style 0DataLlst
0 CustomVH 点甘 tor
0 DataGric
0Cat*j^
口 Dat&GridPa^Style 0DataLlst
€; ^wmntU ssem b M—I... c:\v4nt1 assembiy \gdc'< . C:*AtTnt\aS5Wnbl^fl9C*( ..
c ;ls<rtl—±2 дм:..
с мппбаямтвМдаю .・
€; ^wmntU ssem b M—I... c:\v4nt1 assembiy \gdc'< . C:*AtTnt\aS5Wnbl^fl9C*( ..
c ;ls<rtl—±2 дм:..
с мппбаямтвМдаю .・
3/22/...
ЗГ22/.. 3岡… 3/22/..
3/22/...
ЗГ22/.. 3岡… 3/22/..
TberCortwi.Corhoil
Ldri|i>aQe. Unjua^o Neutrd
— (Uzv&aW)
TberCortwi.Corhoil
Ldri|i>aQe. Unjua^o Neutrd
— (Uzv&aW)
Рис. 5-9. Добавление элемента управления Windows Forms в панель инструментов VisualStudio NET.
Элемент управленияNET можетисполь- зоваться там же, где элемент управления ActiveX, например, .. в Visual Basic 6-0.Элемент управленияNET можетисполь- зоваться там же, где элемент управления ActiveX, например, .. в Visual Basic 6-0.Но если я создам элемент управления Windows Forms, не будет ли это означать, что с ним смогут работать лишь приложения платформы №Т? Таких приложений пока мало, и не подождать ли мне вкладыватьсвои денежки? Чтобы убедить зас з обратном, скажу, что базовый класс UserControl содержит всю
Элемент управления
NET можетисполь- зоваться там же, где элемент управления ActiveX, например, .. в Visual Basic 6-0.
Элемент управления
NET можетисполь- зоваться там же, где элемент управления ActiveX, например, .. в Visual Basic 6-0.
функциональность, которая позволяет ему быть доступным из любых контейнеров элементов управления ActiveX (Visual Basic 6.0
и др.), Это позволяет разработчику элемента управления .NET за-
действовать преимущества огромной существующей базы и зарабатывать много денег.
Чтобы элемент управ-ления .NET выглядел,как ActiveX-элемен^нужно написать один от-носительно небольшойфрагмент кодаЧтобы элемент управ-ления .NET выглядел,как ActiveX-элемен^нужно написать один от-носительно небольшойфрагмент кодаЧтобы сделать элемент управления .NET доступным контейнерам ActiveX л нужно написать один относительно небольшой фрагмент кода. В отличие от стандартных СОМ-серверов, элементы управления ActiveX добавляют в реестр несколько записей, и поэтому вам потребуется реализовать аналогичную функ-
Чтобы элемент управ-ления .NET выглядел,как ActiveX-элемен^нужно написать один от-носительно небольшойфрагмент кода
Чтобы элемент управ-ления .NET выглядел,как ActiveX-элемен^нужно написать один от-носительно небольшойфрагмент кода
циональность в элементе управления .NET. CLR включает готовые функции для добавления и удаления таких записей - ControlAc^'eXRegister и ControlActiveXUnregister соответственна. В классе элемента управления должно быть две функции с атрибутами, указывающими утилите регистрации СОМ-серверов платформы .NET вызвать их в процессе регистрации.
Эти функции должны передавать управление функциям Control ActiveXRegisterи Control. ActiveXUnregister (рис. 5-10). Это единственный дополнительный фрагмент кода, который вам потребуется написать сегодня, и я не уди злюсь, если в будущем он переместится в базовый класс.
Public Shared Sub
〈System. Runtime. InteropServices. ComRegisterFunction()> AxRegister(ByVal regKey As String)
Dim foo As New UserControl 1() ActiveXRegister(foo.GetType)
End Sub
Public Shared Sub _
<System. Runtime. Inte ropSe rvices. ComllnregisterFunction()> AxUnregister(ByVal regkey As String)
Dim foo As New UserControl1() ActiveXUnregister(foo.GetType) End Sub
Рис. 5-Ю. Вспомогательные функции регистрации в элементе управления WindowsForms. Они необходимы, только если вам требуется, чтобы элемент былдоступен контейнерам ActiveX как элемент управления ActiveX.
После этого для использования элемента управления .NET в качестве элемента управления ActiveX его потребуется лишь зарегистрировать — точно так же, как и любой другой класс .NET, который должен быть СОМ-сервером (см. главу 2). Атрибут ComVisible элемента управления NETдолжен быть установлен в True; в противном случае СОМ-клиенты элемент не увидят. На клиентском компьютере должна быть установлена CLR. Создайте библиотеку типов и зарегистрируйте ее с помощью утилиты RegAsm.exe. Затем поместите DLL-файл элемента управления
loc&krr miccfee.diloc&krr miccfee.diJJTlme^onholTlme^onholCancelCancelГ^тв •-□oh olГ^тв •-□oh ol:_' 5hockwave AcbveX Contrd 匚 ShtKkwave Flash CSrcEditOC LU Type Library」StarDpS 1.0 Type Library□ System Monitor_8nbx|:_' 5hockwave AcbveX Contrd 匚 ShtKkwave Flash CSrcEditOC LU Type Library」StarDpS 1.0 Type Library□ System Monitor_8nbx|二 TSHOOT OLE Uor*吧 module :1VB 6 Аррк&юп Wizard;VB 6 C»ate Form Wizard JVB6l*SChvrWteard □ VB/a 1.0 Type Library二 TSHOOT OLE Uor*吧 module :1VB 6 Аррк&юп Wizard;VB 6 C»ate Form Wizard JVB6l*SChvrWteard □ VB/a 1.0 Type LibraryCoEol,] De$>gr>eic | lree;tftt>>e Ubied. |CoEol,] De$>gr>eic | lree;tftt>>e Ubied. |Г* Setectod Items GrtyГ* Setectod Items Grty
loc&krr miccfee.di
loc&krr miccfee.di
J
J
Tlme^onhol
Tlme^onhol
Cancel
Cancel
Г^тв •-□oh ol
Г^тв •-□oh ol
:_' 5hockwave AcbveX Contrd 匚 ShtKkwave Flash CSrcEditOC LU Type Library
」StarDpS 1.0 Type Library
□ System Monitor_8nbx|
:_' 5hockwave AcbveX Contrd 匚 ShtKkwave Flash CSrcEditOC LU Type Library
」StarDpS 1.0 Type Library
□ System Monitor_8nbx|
二 TSHOOT OLE Uor*吧 module :1VB 6 Аррк&юп Wizard
;VB 6 C»ate Form Wizard JVB6l*SChvrWteard □ VB/a 1.0 Type Library
二 TSHOOT OLE Uor*吧 module :1VB 6 Аррк&юп Wizard
;VB 6 C»ate Form Wizard JVB6l*SChvrWteard □ VB/a 1.0 Type Library
CoEol,] De$>gr>eic | lree;tftt>>e Ubied. |
CoEol,] De$>gr>eic | lree;tftt>>e Ubied. |
Г* Setectod Items Grty
Г* Setectod Items Grty
туда где его увидит клиентское приложение; в нашем случае Visual Basic — в каталоги САС или VB98, в которых располагаются другие двоичные файлы. Ваш элемент управления .NET будет отображаться в списке доступныхVB-компонентов (рис. 5-11). Его можно будет установить и запустить, как в прилагающемся к главе примере.
■nmjwiE.
Рис. 5-11. Элемент управления .NETв списке компонентов, доступных Visual Basic,
Размещение элементов управления
ActiveX в приложениях Windows Forms
В приложен иях Wi ndowsForms можно размещатьэлементы управленияActiveX.В приложен иях Wi ndowsForms можно размещатьэлементы управленияActiveX.Я уже писал об огромной популярности элементов управления ActiveX. Если бы NET не позволяла их использоеать, многие программисты просто не стали бы работать с этой платформой, т. е. ActiveX-разработчики ли-
В приложен иях Wi ndows
Forms можно размещатьэлементы управленияActiveX.
В приложен иях Wi ndows
Forms можно размещатьэлементы управленияActiveX.
шились бы довольно большого рынка, для которого стоило пе-
ределывать элементы управления, и вся концепция оказалась бы мертво рожден ной. Именно поэтому авторы Windows Forms мудро решили реализовать поддержку элементов управления ActiveX.
Функциональность таких элементов основана на СОМ, и всем,
кого интересуетданная тема, я рекомендую изучить раздел главы 2, посвященный взаимодействию .NET и СОМ.
Приложение Windows Forms не знает, как использовать элементы управления ActiveX. Оно понимает лишь элементы управления, созданные в соответствии с архитектурой Windows Forms. Чтобы разместить элемент управления ActiveX в приложении Windows Forms, создайте класс-оболочку, который будет содержать собственно элемент, nocpeg- ничать между его СОМ-парадигмой и .NET-
Для разме1цени&элемента управленияActiveX приложениеWindows Forms создаеткласс-оболочку, анало-гичньш оболочке, вызы-ваемои s период вьшоа-:нения и заключаю щейв себе СОМ-объект.Для разме1цени&элемента управленияActiveX приложениеWindows Forms создаеткласс-оболочку, анало-гичньш оболочке, вызы-ваемои s период вьшоа-:нения и заключаю щейв себе СОМ-объект.парадигмой контейнера, представлять элемент управления как
Для разме1цени&элемента управленияActiveX приложение
Windows Forms создаеткласс-оболочку, анало-гичньш оболочке, вызы-ваемои s период вьшоа-:нения и заключаю щейв себе СОМ-объект.
Для разме1цени&элемента управленияActiveX приложение
Windows Forms создаеткласс-оболочку, анало-гичньш оболочке, вызы-ваемои s период вьшоа-:нения и заключаю щейв себе СОМ-объект.
«родной» элемент Windows Forms. Вам действительно нужна мощная оболочка (см. главу 2), которая будет использовать все реа-
лизуемые элементом управления ActiveX СОМ-интерфейсы и предоставлять ему интерфейсы, требуемые им от сервера (рис. 5-12). Если вы думаете, что придется выполнить много работы, вы правы. Но не волнуйтесь — класс CLR по имени System.Win- dows. FormsAxHost сделает всю работу за вас.
Рис, 5-12. Архитектура Windows Forms для размещения элементов управления ActiveX.
:J<Aacc^^созда-Для каждого класса элемента управления
ется в Visual 5tudio.NET ActiveX, размещаемого в приложении, надо или при помощи утили-создать отдельный класс-оболочку на основе
ты команднойстроки.класса AxHost. Такой класс будет включать
идентификатор класса или программы, использовавшейся для создания элемента управления ActiveX, и будет представлять свойства, методы и события внутреннего элемента ActiveX в родном формате платформы .NET. Это покажется знакомым всем, кто когда-либо импортировал элемент управления ActiveX в Visual C++ или Visual J+ + . Классы оболоч ки создает утилита командной строки Axlmp.exe, поставляемая с •NET SDK. При работе в Visual Studio .NET можно щелкнуть панель инструментов правой кнопкой и выбрать в контекстном меню команду Customize Toolbox. Откроется диалоговое окно (рис. 5-13) со списком компонентов, которые Microsoft называет COM Controls («Элементы управления СОМ»), (Прощай, «ActiveX», и скатертью дорога! Одним MINFU в мире меньше.)
de 1.0 Тур® Ubr...de 1.0 Тур® Ubr...JJ&0*&e..&0*&e..卜 «Moiiwze loolra*卜 «Moiiwze loolra*p»l J g 人,t Wet Dr—p»l J g 人,t Wet Dr—mb鳍?am唠仃…mb鳍?am唠仃…Microsoft Wdo.,.Microsoft Wjndo.,.MicrosoftWhdo...Microsoft Windo. .Microsoft Windo...Microsoft Wdo.,.Microsoft Wjndo.,.MicrosoftWhdo...Microsoft Windo. .Microsoft Windo...口Microsoft Shell FolderView Router 口Microsoft Slider Control, version 6.0一 Microsoft Status0ar Control, versio...[7 MkrosaftTabStrip Control, version ■ ■ ■Microsoft Toolbar Cantrol,, version 6.0 Microsoft TreeSew Controlj versio,.,口Microsoft Shell FolderView Router 口Microsoft Slider Control, version 6.0一 Microsoft Status0ar Control, versio...[7 MkrosaftTabStrip Control, version ■ ■ ■Microsoft Toolbar Cantrol,, version 6.0 Microsoft TreeSew Controlj versio,.,Microsoft Web Browser --L*t91ttgо;Langu^e Neutre:Microsoft Web Browser --L*t91ttgо;Langu^e Neutre:C;WNT^ystem32\shell32.dllC'.VWIWMT^SystemSZ^^cMWitl .©ex C: iWlNNTBysteniJ^mscomctLMX С • \wlNPJT^5ys>em32^mscofDc)J. C:\WIWT ^ysteih^fnscomttl. oc x C:\wn4NT|Sy5i:em32\ni scornctI.OCXC;WNT^ystem32\shell32.dllC'.VWIWMT^SystemSZ^^cMWitl .©ex C: iWlNNTBysteniJ^mscomctLMX С • \wlNPJT^5ys>em32^mscofDc)J. C:\WIWT ^ysteih^fnscomttl. oc x C:\wn4NT|Sy5i:em32\ni scornctI.OCXmmmmРис. 5-13. Диалоговое окно со списком доступныхАЛЯ импорта в проект элементов управленияActiveX.Рис. 5-13. Диалоговое окно со списком доступныхАЛЯ импорта в проект элементов управленияActiveX.」Microsofi:Windows Report Control□ MMCCtrl ClassГ.; MorwySnE Quotes」Microsofi:Windows Report Control□ MMCCtrl ClassГ.; MorwySnE Quotes
de 1.0 Тур® Ubr...
de 1.0 Тур® Ubr...
J
J
&0*&e..
&0*&e..
卜 «Moiiwze loolra*
卜 «Moiiwze loolra*
p»l J g 人,t Wet Dr—
p»l J g 人,t Wet Dr—
mb鳍?am唠仃…
mb鳍?am唠仃…
Microsoft Wdo.,.
Microsoft Wjndo.,.
MicrosoftWhdo...
Microsoft Windo. .
Microsoft Windo...
Microsoft Wdo.,.
Microsoft Wjndo.,.
MicrosoftWhdo...
Microsoft Windo. .
Microsoft Windo...
口Microsoft Shell FolderView Router 口Microsoft Slider Control, version 6.0
一 Microsoft Status0ar Control, versio...
[7 MkrosaftTabStrip Control, version ■ ■ ■
Microsoft Toolbar Cantrol,, version 6.0 Microsoft TreeSew Controlj versio,.,
口Microsoft Shell FolderView Router 口Microsoft Slider Control, version 6.0
一 Microsoft Status0ar Control, versio...
[7 MkrosaftTabStrip Control, version ■ ■ ■
Microsoft Toolbar Cantrol,, version 6.0 Microsoft TreeSew Controlj versio,.,
Microsoft Web Browser --
L*t91ttgо;Langu^e Neutre:
Microsoft Web Browser --
L*t91ttgо;Langu^e Neutre:
C;WNT^ystem32\shell32.dll
C'.VWIWMT^SystemSZ^^cMWitl .©ex C: iWlNNTBysteniJ^mscomctLMX С • \wlNPJT^5ys>em32^mscofDc)J. C:\WIWT ^ysteih^fnscomttl. oc x C:\wn4NT|Sy5i:em32\ni scornctI.OCX
C;WNT^ystem32\shell32.dll
C'.VWIWMT^SystemSZ^^cMWitl .©ex C: iWlNNTBysteniJ^mscomctLMX С • \wlNPJT^5ys>em32^mscofDc)J. C:\WIWT ^ysteih^fnscomttl. oc x C:\wn4NT|Sy5i:em32\ni scornctI.OCX
mm
mm
Рис. 5-13. Диалоговое окно со списком доступных
АЛЯ импорта в проект элементов управленияActiveX.
Рис. 5-13. Диалоговое окно со списком доступных
АЛЯ импорта в проект элементов управленияActiveX.
」Microsofi:Windows Report Control
□ MMCCtrl Class
Г.; MorwySnE Quotes
」Microsofi:Windows Report Control
□ MMCCtrl Class
Г.; MorwySnE Quotes
После того, как вы выберете из списка элемент управления, среда Visual Studio .NETсама запускает приложение Axlmp.exe и ге-
нерирует класс-оболочку. Класс встраивается в относящуюся к проекту отдельную DLL-библиотеку. Просмотреть исходный код напрямую нельзя, однако вы можете изучить его свойства и методы в Object Browser (рис. 5-14). Новый элемент управления отобразится на панели инструментов, и с ним можно будет работать, как обычно.
А« ttvrXHifwiwif>rm<> Mtrrnwft WimwiI •■■К 1 t*^<HI*J ■—ГТ 一
@,盘・1на ,/
3
■ I)А .(*)«,Вт
~— С Offoenenb
• ^ЫМС.
—二
г» : АСУ.Е
三 II &,”■!<•—%
;3QQEQ3j
■*; 4;・m,K>・Evr»UhMfcgJГ
*• Г^еМ»птяг1и>Г、1 単—у I
W :*еЬЛи««мЕ,Е、:_&'эгеЧ<“;.,I
9 ои*лл"2Глг<и_ттгпн:из"」
*M_"»f^ 1оНи*и»>4,*< А«<Н_>"г»л Г'«г' • I
•閉/omEE—■-Ь'п;—:—з Г*'Н J . -.EJSerdwr^.M+fR ТЛЛ» MA^Wtr ♦ rd?_juxnb«lb*Qn: r«*,ii「—”<”■
♦心一Co“n<na<ir」M'g — / vrrttwtn ♦ *M_Ftet«x*i«M,“……—№d 9 *J*Xi3<Eivwl”aNA,Hi・J ;'W-W«*
7: J*av5i£-o“",《f м 1 ——
.e卜iwr±.—*—Cocft—»…
♦ «jOrFJf^Wcm.QOfcV*,-"еЛт^чс- 。лА1_0гГвгцву[&,- bD,cQIW><*t»Krl v .・*工ЕЗ М$ЮТ fc ・п»,
A <»Ajj due^rd <о •-. .••' вЬйллмГ
:^ 5uhJUrr> T *».«• & .■-••»€•; < " 11 7
SI ActfveX8rvw*vrDeiiM>
出必•/«■— «ЬмпС^^-'-.Л
3 F—qA
:гг・ г 〜—dxMf —d"lj
-•也 J>”erf*rMr<irtA,《*«”,—bD»rMi ♦ M^a'jr'(м414(А« <<.«*.' '>Vet*t9«>wfv< • 5&!_Р-“Г—«Л,1 •»"+ ^Tir -Г ♦ 9dr_rti»f effWHeln career <rtAx:K«nc4v.C, ♦ sdd」tr*・swe""y<tow«2.:r<»%、5
■ a: CWeUanN»e«fvmi<2J»*»-;*<&»cr • •: 3etJi,f4tEwtr»、? J»e・6 rComri' • 弋'Weba»»****^.——№•»«*£-■“ . •七 C**ebbo»wtf*ertC_He.l9« кЬ -。::WtIAmEv—』л/*Ы«*»Л、
弋 CWeHrurtMt Event »2Jlroiment Сонс 二 У/Л*(» ruwf ver* С_пы 'o^ibeiff . 、£4МвЫп»л⻈4вп(«Г_ЛИЛ»'пЬл1.
■•• ■*♦ CWebEkn**«€vert »? j:lert ^ >ЬГЛ> ; 4* 4: pweW»nwv*rf<i*rt%2_:cr*wri3!e»r:
••二 Гw*b&«ww^»tri C^:«rrwrf5ie!e:
4i °: С*!йЛч»*е»|т*-1»4 Jtaruw*rd:«tG
■々[WfltfeivnefEvtfH tc _Mrtw»-4»<f *. >|>
^Ж^ ^rerCdi-ixrwrMMrxW^wt^ctw-^А^^^.门修:WXJ»鼠%—嵐卜
• Ag E “,Y—f :AMWrt«HJWM4
Рис. 5-14. ObjectBrowser, отображающий методы и свойства класса-оболочки, созданного для ActiveX-элемента управления Web Browser.
Вот ое приложе-ние, демонстрирующееиспользование ActiveX-аАем^нта с Windowsi-orms.Вот ое приложе-ние, демонстрирующееиспользование ActiveX-аАем^нта с Windowsi-orms.
Вот ое приложе-ние, демонстрирующееиспользование ActiveX-аАем^нта с Windowsi-orms.
Вот ое приложе-ние, демонстрирующееиспользование ActiveX-аАем^нта с Windowsi-orms.
Я написал небольшую программу Windows Forms, использующую ActiveX-элемент управления Microsoft Web Browser (рис. 5-15).
В соответствии с приведенными инструкциями я импортировал элемент управления ActiveX в Visual Studio .NET. Затем я поместил
элемент на форму и написал код (рис. 5-16). При щелчке пользователем кнопки Fetch вызывается метод Navigate класса-оболочки, которому передается введенный пользователем URL. Класс-оболочка преобразует дан-
ный вызов в COM-вызов и передает его внутреннему элементу
управления ActiveX.
At “кА IM、At “кА IM、ХапЗе С<мкХапЗе С<мкWumIwa —,— at*wi'WumIwa —,— at*wi'■^■•e ▲: Ci 3 - Tr &Ф* В 屮(A 1■^■•e ▲: Ci 3 - Tr &Ф* В 屮(A 1Leani >»ГТ!Leani >»ГТ!HereHere肅JO m4 皿ed # Ae J3BV rr,—<■ :,d — hr K:reib f 'oKurjtfrrr. wxlr яй q—4^4. “uehiaLm—■ M orcMto yt^tnnttt I • f Хем/ \ff. t?i«e t «U h^Brn^ngai "**■*■ IJjq 1'ie Ьэок d г肅JO m4 皿ed # Ae J3BV rr,—<■ :,d — hr K:reib f 'oKurjtfrrr. wxlr яй q—4^4. “uehiaLm—■ M orcMto yt^tnnttt I • f Хем/ \ff. t?i«e t «U h^Brn^ngai "**■*■ IJjq 1'ie Ьэок d гC t2;V(•“— 5 : doCJMVt beu> t“ n —К I auattt t。 tqvrs* ■ x «сгМхлО* tn & т»1г<4 thrrlhiaic' t-> whe» so 1!c7IW>uj wk MrroioS Ptn to fvtr tiWar: j. t!ai o* un 5 tea t;-T .«raty,, IfJkJ ля S.r|i&・,w.— vl 匕 Ui #—tlui< car ” •* Tbf t>,.l 疝 Iy nrtia и t Мн *h幻,•:吋——第wC t2;V(•“— 5 : doCJMVt beu> t“ n —К I auattt t。 tqvrs* ■ x «сгМхлО* tn & т»1г<4 thrrlhiaic' t-> whe» so 1!c7IW>uj wk MrroioS Ptn to fvtr tiWar: j. t!ai o* un 5 tea t;-T .«raty,, IfJkJ ля S.r|i&・,w.— vl 匕 Ui #—tlui< car ” •* Tbf t>,.l 疝 Iy nrtia и t Мн *h幻,•:吋——第wIntroducing Microsoft .NETIntroducing Microsoft .NETby David S. Р1Я«. President ofRolling TtiunderComputingby David S. Р1Я«. President ofRolling TtiunderComputingFe netFe netXMcrawnXMcrawntt^r+na. imng s l,>: ■<tt^r+na. imng s l,>: ■<卜,.. d mJ no - ♦* « «X »'U ■卜,.. d mJ no - ♦* « «X »'U ■
At “кА IM、
At “кА IM、
ХапЗе С<мк
ХапЗе С<мк
WumIwa —,— at*wi'
WumIwa —,— at*wi'
■^■•e ▲: Ci 3 - Tr &Ф* В 屮(A 1
■^■•e ▲: Ci 3 - Tr &Ф* В 屮(A 1
Leani >»ГТ!
Leani >»ГТ!
Here
Here
肅JO m4 皿ed # Ae J3BV rr,—<■ :,d — hr K:reib f 'oKurjtfrrr. wxlr яй q—4^4. “uehiaLm—■ M orcMto yt^tnnttt I • f Хем/ \ff. t?i«e t «U h^Brn^ngai "**■*■ IJjq 1'ie Ьэок d г
肅JO m4 皿ed # Ae J3BV rr,—<■ :,d — hr K:reib f 'oKurjtfrrr. wxlr яй q—4^4. “uehiaLm—■ M orcMto yt^tnnttt I • f Хем/ \ff. t?i«e t «U h^Brn^ngai "**■*■ IJjq 1'ie Ьэок d г
C t2;V(•“— 5 : doCJMVt beu> t“ n —К I auattt t。 tqvrs* ■ x «сгМхлО* tn & т»1г<4 thrrlhiaic' t-> whe» so 1!c7IW>uj wk MrroioS Ptn to fvtr tiWar: j. t!ai o* un 5 tea t;-T .«raty,, IfJkJ ля S.r|i&・,w.— vl 匕 Ui #—tlui< car ” •* Tbf t>,.l 疝 Iy nrtia и t Мн *h幻,•:吋——第w
C t2;V(•“— 5 : doCJMVt beu> t“ n —К I auattt t。 tqvrs* ■ x «сгМхлО* tn & т»1г<4 thrrlhiaic' t-> whe» so 1!c7IW>uj wk MrroioS Ptn to fvtr tiWar: j. t!ai o* un 5 tea t;-T .«raty,, IfJkJ ля S.r|i&・,w.— vl 匕 Ui #—tlui< car ” •* Tbf t>,.l 疝 Iy nrtia и t Мн *h幻,•:吋——第w
Introducing Microsoft .NET
Introducing Microsoft .NET
by David S. Р1Я«. President ofRolling TtiunderComputing
by David S. Р1Я«. President ofRolling TtiunderComputing
Fe net
Fe net
XMcrawn
XMcrawn
tt^r+na. imng s l,>: ■<
tt^r+na. imng s l,>: ■<
卜,.. d mJ no - ♦* « «X »'U ■
卜,.. d mJ no - ♦* « «X »'U ■
Рис. 5-15. Пример приложения Windows Forms, использующего ActiveX-элемент управления Web Browser.
' Вызываем метод нашего класса-оболочки, как если бы это был ' родной элемент управления Windows Forms .
Protected Sub Button1_Click(ByVal sender As Object, ByVai e As System.EventArgs)
AxWebBrowseг 1. Navigate(TextBoxl.Text, 0('', ””,”")
End Sub
Рис. 5-16. Пример кода ActiveX-элемента управления Windows Forms.
Эпилог
и благословение
И Сборщик к делу преступил. Но сборщик сам — Творец! Механик и мастеровой, порой — простой трудяга f Он соберет, о Боже, твой КовчегДобра и Блага.
Не мне судить, хорош иль плох он будет на плаву, Но я — хвала Тебе — тружусь. Хвала Тебе — живу!
Судить положено не мне. Судить — твоя затея.
Судить, прощать... Эй вы, не спать! На задний ход скорее!
Р. Киплинг о неотвратимоститехнического прогресса.
(«Молитва Ма кЭндрю:^ 1894 г.)
Как и МакЭндрю, я сделал то, что должен был сделать: написал эту книгу. И теперь вам судить о ней. Является ли NETсовершен- ной ОС? Не глупите. Совершенна ли эта книга о ней? Не скажите еще большую глупость. Нет в мире совершенства. Но .NET позволит вам заработать денег больше, чем что-либо другое, и я надеюсь, эта книга помогла вам понять как.
Моя дочь, родившаяся в этом году, принадлежит к первому поколению, узнающему Интернет с колыбели, в отличие от нас с вами. Ее старшие братья и сестры принадлежат к первому поколению, выросшему с настольными ПК, ее родители — к первому Iпоколению с телевидением, ее бабушки и дедушки — первое поколение, услышавшее радио. Вы можете сказать, как это повлияет на нее? Конечно, нет, и я тоже — никто не может. Вернее, множество людей имеет взаимоисключающие мнения на этот счет, но никому не известно, кто прав. Я пишу эти строки в 2001 году и вспоминаю вступление Артура Кларка к его книге «2001: космическая одиссея»: «Важно помнить, что это — лишь плод
фантазии. Действительность, как всегда, будет куда удивительней». Он один из тех парней, кому я верю.
Мы, разработчики叩о叩амм, стали гораздо ответственней. Как недавно написал в факультетском журнале наш декан маииино- строительного факультета, сейчас благосостояние и безопасность нашей нации гораздо больше зависят от битов и байтов, чем от пуль и золотых слшков. Если вылетит Пасьянс, кого это будет волновать, кроме игрока, который потерял записи о своих рекорд дах? Другое дело, если упадет система резервирования авиабилетов, и уж совсем другое, если больница потеряет истории болезней всех сзоих пациентов. Киплинг писал о пассажирах МакЭндрю:
Я — Твой слуеа. Их воля — плыть, хоть в раб, хоть в бездну ада,— Да ведь не мне людей судить; перевозить их надо.
Моя вина -*—^>* но лишь одна — не будет прощена:
Когда шесть тысяч здешних тонн поглотит глубина.
Переварите это хорошенько.
Собратья! Наш вид делает следующий шаг на пути эволюции — ни больше, ни меньше: человечество создает собственный образ. Топорный, ограниченный, глючньш (это ли не человеческие черты?), но свой собственный образ. Вот почему программирование приводит в такой неповторимый трепет. Некоторые сравнивают это с сексуальными переживаниями, и, учитывая созидательную природу обоих явлений, с этим можно согласиться. Вот что чувствовал МакЭндрю 100 лет назад:
Я— пьян?.. Когда Ты создал мир, в начале было Слово,—
И не оно ль внушало нам, что создал образцово?
Вот почему мы ввязались в это безумное дело и почему с ним остаемся. Вот почему очень немногие вешают свою мышь и идут учиться на юристов, даже если у них нет ничего за душой. Прочитайте, что писал Киплинг 100лет назад. Замените «лошадиные силы» на «мегафлопсы». И скажите мне после этого, что вы чувствуете не то же самое, зная, что ваша система работает:
И пусть им жизнь дает не мать, а — плавка, ковка, сварка?—
Их невозможно не понять, когда вздыхают жарко!
Но никто не вразумил их голос никогда.
Семь тысяч лошадиныхсил...ОГосподи, ода!
Предметный указатель
.NET
— ActiveX 202
-COM70.68
- RCW68
— Wo h-служба i 60,. 161
HTTP GET I6R 170, 171
^^^^~ _ - HTTP Post 172
HTTP POST 169
- Soap 173
— SOAP 1 69
— WSDI 168, 170 &i. raoft ЛЕТ: Web-служба: контракт
— базовая страница 166
— доступ 169
- клиент 165, 168, 171
— клиентская форма 173
— контрактсм. т^юке .Ni T:
Web-служба:WSDL
— логистика 166
— метод 174
— ибращенив 165
— прокси-класс 175-176,177
— разверни ван и- объектов 1f>6
— функции 165
— Windows Forms 191
— индексации элементоз массивов 27
— КАНОН 27, 6S5, 70
— межъязыковое паследавани! 57
— иасл^грваии^ 53, 57
— объект 74, 79
— объект-сервер 27
— пространство имен 3$
— сборка компонентов 46
— структурная обработка исключений 80
—丁闷儿由К叩й 76
— управление памятью 59-61
— элемент управления 204
.NET CLR
* — m5c0rlib.dll 40
— безопасность доступа к коду 88
— объект 35
— функция 35
.NETFramework 8, 12, 22, 24, 68
-- безопасность доступа к коду 25
— бесшовное взаимодействие с
СОМ 25
— сборка 42
— ф)-нк ц иоиал^носп? ОС 25
.NEI SDK 27.3口,加,162 163
.NFFWeb Forms 9
NE— Forms 10
A
Active Server Pages CM. ASP
ActiveX
- Windows Forms 205, 208
— контейнер 202
— элемент управления 203 —20% 205
- NE1 202
ADO.NE1 10
API 104
ASP [Active Server Pages I 101
A5P.NET 8, 73, 101
— cookie-аутентификация 131
— passptr: аутс-нтификация 135-137
— Web Forms H)3
—
- .ASMX-файл 183
— Global. asax 183
— управление? состоянием 185
—
— авторизация 140,141
— аутентификация 129
— доверенный пользователь 144
— защита 104
— идентификационные далпип[44
— инфраструктура 168
— приастствце 163
—105
■ — управление сеансом 126
— файл
— machinexontig 118. 141
— web.config 116
г^^^ы фоновый код 1()2
— элемент уп равления 110
assembly см. сборка
Assembly Cache Viewer 42
Assembly Generation Utility「м утилита:
AL.exe
Aulhcnticode 87
c
CCW (COM callable wrapper} 74, 76
CLR (CQmmci Language Runtime) 22
CLR NET 80
code access security CM. №1 CLR: безо- mat ность доступ a к коду
code groups см, сборка: группы программ
code-behind см. ASP.NET: фо1ИМ5ый код
COM 18, 22
— вызываемая оболочка 74
COM callable wrapper см. CCW
Common Language Runtime ом CLR
D
DCOM 15了
deterministic linalizatfon сл», детерминированное завершение
DHTML 116
DLL 29, 30. 36
— замена 46
— класс 30
— метод 30
Е
exceprion handler block с. блок обработки Ut hAK—
f—иг< ” сборщик мусора: за耻pwu тель
21% “udlKied name(,・,. полноетъю каал.ц- ф||Цир<КК1Н|<(>( UM)I
G
CAC (global asstjmblycache] 42, 43, 4g garbage см. объект: мусор garbage collection см. сбор мусора
н
HTML 101
HTML-страница Ч
HTTP (HypertextTransfer Protocol) 9, ;3Q, 159
HTTP GET 169
HTTP POST 169
IIS (Internet Information Server] % 101
IIS (Internet Information Services) 162
IL CM. MSIL
ILDASM 48, 53
ILDASM. ex v см. сборка: дизассемблер IL impersonation-delegation см. заимствовав ние прав и делегирования
infurmatianal version ом. сборка: декларация: информационная версия
JJT fjusl-jn-tirrie} 23
)ITter (just-in-tirne compiler) 23, 32 JIT-компиляция 33
К
Kerberos 131
M
managed code см. управляемый код managed heap см. упраадяемая куча
manifest см. сборка: декларация membership mnditionsсм. сборка: усло- IB и я членства
metadata см. метаданные
MFC [Microsoft Foundation Classes) 189
Microsoft .NET 7
Microsofl Foundation Classes CM. MFC
Microsoft Intermediate Language см, язык ,програ.мл<ирования: M5JL
Microsoft Management Console см. ММС
Microsoft Transaction Server 77
MINFU 182
MMC (Microsoft Management Console) 183
.Mscoree.dll 75
MSMQ 157
N
namespace см. пространство имен
Napster 9
native image generator c. утилита: Ngen.exe
NTLM 131
p
permission set см. набор прав доступа
post back data см. регистрация ответных данных
private assembly сч. закрытая сборка
Q
q-name см. q-имя
qualified name см. квалифи цирава ннос
USASl
qualifier см. квалификатор
Quicken j
q-имя 36 см. также квалифицированное имя
R
IRCW (runtime callable wrapper) 68
Read Tbe Funny Manual CM. RTFM
Regsv-cs.eKe 78
Resource Managers 77
RPC 157
RTFM (Read The Funny Manual) 54 runtime callable wrapper CM. RCW
s
Secure Socket Layer CM. SSL
security poliq см. политика безопасности
SEH 82
shared name см. совместно используемое
•
SOAP (Simple Object Access Protocol)
169, 173
SSL (Secure Socket Layer) 130
strong name см. строгое имя
structured exception handlingсм. структурная обработка исюмомений
I
Tlblmp,exe 70
V
view state CM. Web: элементуправления: состояние отображения
Visual Badc.NET 163
— клиент 31
- — компилятор 30
Vkiw Studio .NET
— WindowsFarms 192-193. 195 202
— панель инструментов196
Visual Sliidio.NET 12, 28, 69
— Web-служба 181
— тестирование 183
— строгое имя 44
W
Web 2, 19
— элемент управления 109
— состояние отображения115
Web Forms Server Control см. сероерньш элемент управ八ени$ Web Forms
Web Service см. Web-служба
Web Service Descriptor LanguageWSDL
Web-служба 159
— Service! .asmx 183
— создание 161, 162, 182
Windows Forms 191
— ActiveX 205, OH
— клиент 200
— пример приложения 192
— форма 193
— элементyn卩已вкениа ^9-200,2⑺
WSDL (Weh Service Descriptor
Language! 188
X
XML 9
♦в—血;ПК 3 атрибут
-- < WebMethod( /> 1 n i
AuloComplete 79
CldSS163
—
— ComVisible 203
— Const 165
impersonation 148
—
bginUri 133
memory Limit 150
— mode 126. 127
Private165
Public 165
rec/uestL/nuf150
SqlConnectionstring 127
staleConnectionSlring 126
— 5 MB 101
System.Runtime. InteropSeL
vices. Com Visible 76
— timeout 150
— verb 140
аутентификация 128
— cookie 131
passport 1 $5
Windows 1"iO
Б
•je^onat ti' - Th 3
—Kocj 4
1нК)ли<111'К.1 .Xclivi'X 27
1»лок,.Wjработки u< ключ— 81
В
31»1зывлемля < ibOAQ4K<i периода нвп— hik: « м KCVV
Г
глобальный кэш сборок см. САС
Д
детерминированное зазершение 65-66
директива
—
Nam£$pd\38
Namespace TinipComponentNS 30
— using 31
— WebService 163
диспетчер кучи 26
3
заимствование прав и делегирова
ния 147
И
I Интернет
— безопасность 3
I Интернет-приложение 3
гребования к инфраструктуре 7
|интерфейс
IDispatch 72
I Disposable 65
(Identify 145
{Principal 142
— iSupportErrorfnfo 80
— lErrorlnfo 80
Iисключение 82
квалификатор 36
квалифицированное имя 36, 37 см. тзк- же q-имя
класс 20, 50, 165
— AxHost 206
— GenencPrindp^l 142-143
SimplestHe/h World 194
System.Exception 84
— System.Object 53, 57, 63, 65
—5ysfem. Runtime.InteropServices. TypeLib-
Convefter 70
System.Web.Seivices.Protocols.Soap-
HltpClientProtocol 175
— System .Windows 198
System. Windows.Forms AxHost 205
S^ten ].Windows. Forms.DataCrid 65
— System. Windows. Forms. Form 193
— System. Windows. Forms. UserContro! 201
— Tim^Component 31,33
— TimeSe^ice 164 — UserControf 202
WebService 164 J 86
— базовый 52,164
— деструктор 57-58
— конструктор 57
— межъязыковое наследование 57
—наследование 52
— объявление 29
— подмена метода 56
— производный(derived) 52,164
— функциональность 57
ключевое слово
— Catch 81
— Imports 37? 164
Inherits 53, 164
— Ov^rriddble 57
— override 56
■— Overrides 56
—30
— Throw 83
- Try 81
— using 37
- — virtual 57
код
— безопасность 87
компилятор no требованию см. JlTter компиляция по требованию см. JIT конструктор 57-58, 59
криптография 43
м
метаданные 30
метод
— Activator.Createinst^nce 73
— Begin 179
— BeginGetTime 179
— Button 1 flick 19S
— Class_
— Console.Write 31
— DisabfeCommit 79
Dispose 65, 84,198
— EnableCommit 79
— End 180
— EndGctTime 179
— Equals 55
File.Open 82
— Finalize 63
CetHashCode 55
— GetTime 27, 31, 162, 172, 174
GetType 55
InitializeComponent 197
— invoke 176
―IsCompleted 181
-団川?oh 142,145
— Main 31
— Navigate 207
— New 58
— OnAuthenticate 143
— Session.Abandon 124
— SetAbort 79
SetCompiete 79
System.Object. ToString 56
ToString 55, 56
Type. CetTypeFromCLSlD 72
Type.Cet TypeFromProglD 72
— детерминированного завершения 65
— подмена 56
Н
набор прав доступа 90
наследование 20, 31, 51, 164
■ " дерево 53
— явное оЗъявдение 54
настольное ПО188
О
обработчик исключений 81
- Try-Finally 84
объект 51
—
—57
— lAsyncResuh 179, 181
— Мё$5a盥 Box 36
— MyBase 5 7
— Session 122, 123
76
System .fnterpnseServ/ces.Context
ual 78, 79
System .Exception 82
— TimeSen^ice 172
— User 145
—завершение 6&
— клиент 32
— конструктор 57-58
— конфликт имен 25
— мусор 61
— удаление 60, 63
— сервер 29
ООП (объектно-ориентированное про
грамма рование) 20, 50
-C++51
— COBOL 51
— Java 51
— Visual Basic 51
— наследование 53
оператор
— imports 70
— new 32, 58, 70
операция get 140
п
параметр ShowSeconds 1 71
подпространство имен 36
позднее связьизание 72
политика безопасности 90
полностью квалифицированное имя 36
право доступа 91
пространство имен 28, 163
System 25, 31, 35
System. Console 36
System .Windows. Forms 36
■ — Visual Basic 28-29
— импорт 29
— импорт j 7, 37
— имя за
— объявление 29 — 30
р
регистрация ответныхданных 114
С
C + + 10
сбор мусора 24, 26, 62, 66
сборка 38, 40
— Assembly! nfo.vh 47
— САС 42, 49
— версия 40
— Apynniji программ 93
— декларация 38, 40
— информационная версия 48
— хэш 45
— дизассемблер IL 40
— закрытая 33, 41
— закрытый ключ 45
— клиент 41
— младшая версия 47
— многофайловая 39
-— номер версии 47
— номер компоновки 47
— однофайловая 39
— открытый ключ 41
.— развертывание 41
— ревизия 47
— совместно используемая 42
— подпись 45
— старшая версия 47
— управление версиями 46, 48-49
— )тлоаия членства 93
— файл 39
— добавление/удаление 40
сборка мусора 8
сборщик мусора 26
— завершитель 63
— удаление объекта 63 свойство
— AutoPostBack 106
CopyLocsf 45
— DeactivateOnReturn 79
Identity 145
— MaintainState 116
MyTransaction Vote 79
Now 30
Text194
серверный элемент управления Web Forms 103
служба — Passport 135 — доступ 8 событие
Classjnitialize 58
SefectedlndexChanged 107
совместно используемое имя 43
спецификатор Shared 194
способ указания версии 24
строгое имя 43, 44
структурная обработка исключений 80
V
управление сеансом 123
управляемая куча 61
управляемый код 22 утечка памяти ig утилита
AL.exe 40
Axlmp.exe 206
СОМ + Explorer 119
■ — CACUTIL.exe 42
— Ngen.exe (native image generator) 33
— RegAsm.exe 75, 203
— SN.exe 44
— Wsdl.exe 175
ф
файл конфигурации 49
функция
— AddHnnd/ег 198
— CoCreatelnstance 70
— CoCreatelnstance 75
Console. Write 31,37
' — ControlActiveXRegister 203
■ — ControlActiveXUnregister 203
CreateFUe 80
CreateWindow 80
Finalize 63
CetObjectContext 78
GetTime 165
LoadUbrary 80
Main 194
— Now 28, 40
—72
System .CC.Su/JpressFjnahze 65
System.^unf-fmeJnferopServices.Mar- shal.Re/easeComObject 37, 72
System Security.Pnncipdl. Windowsldem- tity.CetCurrenti} Impersonate 148
System. Web. Security. FormsAuthentic3-
Uon.RedirectFromLoginPage 134
泌 fem .Windows. FormsApplica- tion.Run 195
Type JnvokeMember 73
— Write 37
— конфлим имен 25
— объявление 29
Ц
цифрозой сертификат 21
Я
язык программирования
— С# И
COBOL 51
)ava 18
J Script 23
MSIL [Microsoft Intermediate Language,
ID 22
Visual Basic 19
взаимодействие 21
выбор 17
—19
— совместимый с CLR 23
Дэвид С. Платт
Дэвид С. Платт основатель и президент Rolling Thunder Computing, преподает программирование для NF7 в компаниях по всему миру. Он автор еще пяти книг по программированию для Windows, последняя из которых, Understanding СОМ т (Microsoft Press, 1999)t по уровню продаж на Amazon.com не уступала книге Тома Клэнси «Каждый мужчина — тигр» (что говорит об интеллектуальном уровне его читателей). Он также часто публикует статьи в MSDN Magazine.
Дэйв получил высшее инженерное образование в Аартмутском колледже. Бросив работу, он стал работать еще больше. Ему интересно, нужно ли связать два пальца у своей дочери, чтобы она научилась считать в восьмеричной системе. Он живет в Ипсвиче, штат Массачу- се тс, и связаться с ним можно по адресу www.rollthunder.com.
Платт Дэвид С.
Знакомствос Microsoft .NET
Перевод с английского под обсцей редакцией В. Г. Вшивцева
Технический редактор С. В. Дергачев
Компьютерная верстка В. Б. Хильченко
Дизайнер обложки Е. В. Козлова
Оригинал-макет выполнен с использованиемиздательской системы Adobe PageMaker 6.0
Рага(-)Т]Рага(-)Т]TypeMarketFo n tL ibraryneга n ?iннй ncrt ion атель
Рага(-)Т]
Рага(-)Т]
Главный редактор А. И. Козлов
Подготовлено к печати издательско-торговым домом «Русская Редакциям居UNCKN 叫МНМ •
Лицензия АР № 066422 от 19.03.99 г.
Подписано в печать 20.07.01 г. Тираж 3 000 экз.
Формат 70x100/16. Физ. л. л. 15
Отпечатано с готовых диапозитивов в ОАО «Типография «Новости»107005, Москва, ул, Фр. Энгельса, 46.
втепвОМвООО ^ЛспекьС-.тел (3552) 58-801S•ЧП Болат Амреев, тег. 8-327-29О-191-25, (3272)26*1404в000телнав Минскетелтел •втепвОМвООО ^ЛспекьС-.тел (3552) 58-801S•ЧП Болат Амреев, тег. 8-327-29О-191-25, (3272)26*1404в000телнав Минскетелтел •ИИ
в
теп
в
ОМ
в
ООО ^ЛспекьС-.тел (3552) 58-801S
•
ЧП Болат Амреев, тег. 8-327-29О-191-25, (3272)26*1404
в
000тел
на
в Минске
тел
тел •
в
теп
в
ОМ
в
ООО ^ЛспекьС-.тел (3552) 58-801S
•
ЧП Болат Амреев, тег. 8-327-29О-191-25, (3272)26*1404
в
000тел
на
в Минске
тел
тел •
И
И
ИздательствоРедакция» — партнер Microsoft Press в России
предлагает широкий выбор литературы
по современным информационнымтехнологиям.
Мы переводим на русский язык бестселлеры ведущих издательств
а также сотрудничаем с компетентными российскими авторами.
Наши книги Вы можете
• в
ул.6.
“MtaxaBCKuWRDM имя歴 yn Нйвы^Ар^т. 8,曲〃 • 1095) 290-450 7
«Дом
тел.
наЛенинградский 78,152-4511
2-я54, теп
квигиуп Тверская, В.
«Алекс кг. Зеленоград.
Пянфипок^нп. I Н06Б in |095; 532 966^
Фирменныйикнига"
Ленинскийстроение 38,778-7269
Иите|1Нвт<магаэии tittp;//www.ITtiook.ru
(095)(095)
e-mail: into^rusedit ru; hnp://www.rusediLm
:Microsoft Press:Microsoft Press(—•^^; ■m.T(—•^^; ■m.TИ РУССКАЯ JEJHIOИ РУССКАЯ JEJHIOI издательство компьютерной литературыI издательство компьютерной литературыПРОДАЖА КНИГоптом тел.: (095) 142-0571. e-mail: alexg@rusedit.ru:интернет-магазин http7/www,)Toook.rtj: тел.:(095] 145-4519; в розницу мапазнн -КОМПЬЮТЕРНАЯ и ДЕЛОВАЯ КНИГА-Москва. Ленинский пр-т. стр. 38.тел.: (095) 778*7269ПРОДАЖА КНИГоптом тел.: (095) 142-0571. e-mail: alexg@rusedit.ru:интернет-магазин http7/www,)Toook.rtj: тел.:(095] 145-4519; в розницу мапазнн -КОМПЬЮТЕРНАЯ и ДЕЛОВАЯ КНИГА-Москва. Ленинский пр-т. стр. 38.тел.: (095) 778*7269Распределенные системыРаспределенные системыРесурсыServerРесурсыServerMicrosoftдля профессMicrosoftдля профессСети ТСР/1Сети ТСР/1КОМА АШ ДИСККОМА АШ ДИСК
:Microsoft Press
:Microsoft Press
(—•^^; ■m.T
(—•^^; ■m.T
И РУССКАЯ JEJHIO
И РУССКАЯ JEJHIO
I издательство компьютерной литературы
I издательство компьютерной литературы
ПРОДАЖА КНИГ
оптом тел.: (095) 142-0571. e-mail: alexg@rusedit.ru:
интернет-магазин http7/www,)Toook.rtj: тел.:(095] 145-4519; в розницу мапазнн -КОМПЬЮТЕРНАЯ и ДЕЛОВАЯ КНИГА-
Москва. Ленинский пр-т. стр. 38.тел.: (095) 778*7269
ПРОДАЖА КНИГ
оптом тел.: (095) 142-0571. e-mail: alexg@rusedit.ru:
интернет-магазин http7/www,)Toook.rtj: тел.:(095] 145-4519; в розницу мапазнн -КОМПЬЮТЕРНАЯ и ДЕЛОВАЯ КНИГА-
Москва. Ленинский пр-т. стр. 38.тел.: (095) 778*7269
Распределенные системы
Распределенные системы
Ресурсы
Server
Ресурсы
Server
Microsoftдля професс
Microsoftдля професс
Сети ТСР/1
Сети ТСР/1
КОМА АШ ДИСК
КОМА АШ ДИСК
Межсетевоевзаимодействие
Ресурсы
Windows :00(\ Server
—РесурсыWindows 2000Server
Издательстао «Русская Редакция* представляет новую серию книг *
Ресурсы
Microsoft Windows 2000 Server официальный источник основных технических сведений по операционной системе Windows 2000 Server.
В книгах серии содержится подробная информация для администраторов сети, Web-мастеров и опытных пользователей, занимающихся настройкой, администрированием, оптимизацией и устранением неполадок в Windows 2000 Server, а также сетей и Web-узлов на основе Windows 2000 Server.
пособия Microsoft —гарантияВашей квалификации/пособия Microsoft —гарантияВашей квалификации/5 Официальные учебные5 Официальные учебные£_ ^щ igj^axHh-yir*;Учебный курс£_ ^щ igj^axHh-yir*;Учебный курсПРОДАЖА КНИГоптом тел.: (095) 142-0571, e-mail: alexg@rusedit.ru;интернет-магазин http://www.ITboo4.ru: тел.: (095) 145-4519;в розницу магазин -КОМПЬЮТЕРНАЯ и ДЕЛОВАЯ КНИГА- iMocKBa, Ленинский пр-т. стр 3В, тел.: (095) 773-726&ПРОДАЖА КНИГоптом тел.: (095) 142-0571, e-mail: alexg@rusedit.ru;интернет-магазин http://www.ITboo4.ru: тел.: (095) 145-4519;в розницу магазин -КОМПЬЮТЕРНАЯ и ДЕЛОВАЯ КНИГА- iMocKBa, Ленинский пр-т. стр 3В, тел.: (095) 773-726&И РУССКАЯ РЕН^ИИ РУССКАЯ РЕН^Ис»1 на «смме Window» 2С8с»1 на «смме Window» 2С8Книги серии «Учебный курс» для подготовкик экзаменам MCSE-2000Книги серии «Учебный курс» для подготовкик экзаменам MCSE-2000Учебный курсУчебный курс1е1курс1е1курсWindow* 2000 .ProfessionelWindow* 2000 .Professioneliss^^iss^^НОМЛАМГ-ДИСМНОМЛАМГ-ДИСМКниги этой серии помогут Вам приобрести фундаментальные знания и подготовитьсяКниги этой серии помогут Вам приобрести фундаментальные знания и подготовитьсяк сдаче экзаменов по программам сертификации Microsoft.к сдаче экзаменов по программам сертификации Microsoft.Каждая книга — это серьезное изложение темы, полная справочная информацияКаждая книга — это серьезное изложение темы, полная справочная информацияот первоисточника; занятия, упражнения для самостоятельной работы, видеороликиот первоисточника; занятия, упражнения для самостоятельной работы, видеороликии вопросы для самопроверки и закрепления знаний.и вопросы для самопроверки и закрепления знаний.Учебный курсУчебный курсWindows 2000Actle D4r*ctory S«fV*eMWindows 2000Actle D4r*ctory S«fV*eMWindows 2000 ServerWindows 2000 Serverиздательство компьютерной литературыиздательство компьютерной литературы
пособия Microsoft —
гарантия
Вашей квалификации/
пособия Microsoft —
гарантия
Вашей квалификации/
5 Официальные учебные
5 Официальные учебные
£_ ^щ igj^axHh-yir*;
Учебный курс
£_ ^щ igj^axHh-yir*;
Учебный курс
ПРОДАЖА КНИГ
оптом тел.: (095) 142-0571, e-mail: alexg@rusedit.ru;
интернет-магазин http://www.ITboo4.ru: тел.: (095) 145-4519;
в розницу магазин -КОМПЬЮТЕРНАЯ и ДЕЛОВАЯ КНИГА- iMocKBa, Ленинский пр-т. стр 3В, тел.: (095) 773-726&
ПРОДАЖА КНИГ
оптом тел.: (095) 142-0571, e-mail: alexg@rusedit.ru;
интернет-магазин http://www.ITboo4.ru: тел.: (095) 145-4519;
в розницу магазин -КОМПЬЮТЕРНАЯ и ДЕЛОВАЯ КНИГА- iMocKBa, Ленинский пр-т. стр 3В, тел.: (095) 773-726&
И РУССКАЯ РЕН^И
И РУССКАЯ РЕН^И
с»1 на «смме Window» 2С8
с»1 на «смме Window» 2С8
Книги серии «Учебный курс» для подготовки
к экзаменам MCSE-2000
Книги серии «Учебный курс» для подготовки
к экзаменам MCSE-2000
Учебный курс
Учебный курс
1е1курс
1е1курс
Window* 2000 .Professionel
Window* 2000 .Professionel
iss^^
iss^^
НОМЛАМГ-ДИСМ
НОМЛАМГ-ДИСМ
Книги этой серии помогут Вам приобрести фундаментальные знания и подготовиться
Книги этой серии помогут Вам приобрести фундаментальные знания и подготовиться
к сдаче экзаменов по программам сертификации Microsoft.
к сдаче экзаменов по программам сертификации Microsoft.
Каждая книга — это серьезное изложение темы, полная справочная информация
Каждая книга — это серьезное изложение темы, полная справочная информация
от первоисточника; занятия, упражнения для самостоятельной работы, видеоролики
от первоисточника; занятия, упражнения для самостоятельной работы, видеоролики
и вопросы для самопроверки и закрепления знаний.
и вопросы для самопроверки и закрепления знаний.
Учебный курс
Учебный курс
Windows 2000
Actle D4r*ctory S«fV*eM
Windows 2000
Actle D4r*ctory S«fV*eM
Windows 2000 Server
Windows 2000 Server
издательство компьютерной литературы
издательство компьютерной литературы
книги по современным информационным
технологиям
новый
интернет-магазин
book・ru
http://ITbook.ru
Ko«M»nra|i«Mi' ■・♦・, y<av*auA ・.pr
ЛГСЛЭАХ? С<Л
[*・6ha«U »'
• ЮМ “и・・
магазин
^Компьютерная
и деловая книга»
. Москва. Ленинский пр-т. стр. 38 тел.: (095)778-7269
БОГАТЫЙ
ВЫБОР
НИЗКИЕ
ЦЕНЫ
<fJef«*',3i : ■ EErze
4—>^аг ・аз лп*ая>< %",》 '-* и—а вмл :*!■■■■- сей* WE-W!» W^xW1T**; ■*■ - MJH**** I |'mq«ww>4i Cat . 6*>>mm ;,«M>wa ДМ »'»!•₽•'»*» • ,we ;^a — ”"•《>» —m 3 >#A :»LtM>T^«>b
.4CM»K**'t4 *el*I'W«» •y c«hmn・ Mn aS juu (tabi'* , 6»,.з
PnputeiM ркпмдаммамс
Примеры программ доступны в любую минуту!Примеры программ на Visual Basic.NET можно загрузить с Web-сайта книги:Примеры программ доступны в любую минуту!Примеры программ на Visual Basic.NET можно загрузить с Web-сайта книги:www.introducingmicrosoft.netwww.introducingmicrosoft.net
Примеры программ доступны в любую минуту!
Примеры программ на Visual Basic.NET можно загрузить с Web-сайта книги:
Примеры программ доступны в любую минуту!
Примеры программ на Visual Basic.NET можно загрузить с Web-сайта книги:
www.introducingmicrosoft.net
www.introducingmicrosoft.net
Знакомство
с MICROSOFT
.NET
Об авторе:Дэвид С. Платт преподает компьютерныенауки в Гарвардском университете. Он основал учебную и консультационную компанию Rolling Thunder Computing (www.rollthunder.com).Платт — автор еще пяти книг, включая Understanding COM+, а также частый автор Microsoft Developer Network.Об авторе:Дэвид С. Платт преподает компьютерныенауки в Гарвардском университете. Он основал учебную и консультационную компанию Rolling Thunder Computing (www.rollthunder.com).Платт — автор еще пяти книг, включая Understanding COM+, а также частый автор Microsoft Developer Network.
Об авторе:
Дэвид С. Платт преподает компьютерныенауки в Гарвардском университете. Он основал учебную и консультационную компанию Rolling Thunder Computing (www.rollthunder.com).
Платт — автор еще пяти книг, включая Understanding COM+, а также частый автор Microsoft Developer Network.
Об авторе:
Дэвид С. Платт преподает компьютерныенауки в Гарвардском университете. Он основал учебную и консультационную компанию Rolling Thunder Computing (www.rollthunder.com).
Платт — автор еще пяти книг, включая Understanding COM+, а также частый автор Microsoft Developer Network.
Подлинная история.NET —кратко и увлекательно!
Какие проблемы решает .NET? Как работать с .NET и как извлечь из этого выгоду? Ответы на эти и другие вопросы вы получите из этой книги.
Дэвид С. Платт — известный автор и консультант —■ последовательно раскрывает тайны новой платформы Microsoft. Минимум технического жаргона и максимум остроумия, масса подробных иллюстраций, изобилие выразительных аналогий и четких разъяснений.
Прочитав эту увлекательную книгу, вы будете достаточно знать о передовой платформе Microsoft .NET, чтобы спланировать свое будущее в программной индустрии.
В книге рассматриваются:
объекты .NET;
ASP.NET и Web Forms;
Web-службыNET;
« Microsoft Windows Forms.
ISBN5-7502-0186-4
9 785750 201860
Web-узел издательства: www.rusedit.ruИнтернет-магазин: www.ITbOok.ru
修 РУССКИ ширя修 РУССКИ ширя
修 РУССКИ ширя
修 РУССКИ ширя
Дэвид С. Платт
Знакомство с MICROSOFT
Microsoft
Моей дочери Аннабел Роз Платт
David S. Piatt
Itroducing
MICROSOFT
.NET
Micfosoft Press
Дэвид С. Платт
Знакомствос MICROSOFT
.NET
Москва 2001
№ п се К AW Е м К ли
УДК 004
ББК 32.973.26 018.2
П45
Платт Д. С.
П45Знакомство с Microsoft .NET/Пер. с англ. — М.: Издательс
ко-торговый дом «Русская Редакция», 2001. — 240 с.: ил.
ISBN 5-7502-0186-4
Книга Дэвида Платта знакомит читателя с новейшей и многообещающей платформой — Microsoft №1 В ней доступно описаны особенности архитектуры и компоненты этой системы. Вы узнаете, какие проблемы позволяет решить .NET, какие для этого используются подходы и как начать с ней работать. Книга содержит множество иллюстраций и примеров программ. Описанные здесь компоненты и технологии, такие как .NET Framework, ASP.NET, Web Forms, Web-службы и Windows Forms, позволь нам эффективно создавать программные продукты нового поколения для набирающей обороты платформы Microsoft .NET.
Книга состоит из 5 глав и предметного указателя.
УДК 004
ББК 32.973.26-018.2
Подготоалено к изданию по лицензионному договору с Microsoft Согоо- ration, Редмонд, Вашингтон, США.
Macintosh — охраняемый товарный знак компании Apple Computer Inc. ActiveX, BackOffice, JScript, Microsoft, Microsoft Press, MSDN, NetShow, Outlook, PowerPoint, Visual Basic Visual e +丄, Visual InterDev, Visual J 4 +, Visual SourceSafe, Visual Studio, Win32, Windows и Windows NT являются товарными знаками или охраняемыми товарными знаками корпорации Microsoft в США и/или других странах. Все другие товарные знаки являются собственностью соответствующих фирм.
Все названия ком пан и 口организаций и продуктов, а также имена лиц, используемые в примерах, вымышлены и не имеют никакого относи е- ния к реальным компаниям, организациям, продуктам и лицам,
© Оригинальное издание на амглййс^ом язике, Дэвид С. Платт, 2001
© Перевод на русский язык, Microsoft Corporation, 203
ISBN 0-73 56-13 77-Х (англ)© Оформление и подготовка к изданию, издатель-
ISBN 5-7502-0186-4ско-торговый дом «Русская Редакция»; 2001
Оглавление
ВступлениеIX
ПредисловиеXI