Что передается
клиенту?
Сценарии ASP .NET
программируются в обычном стиле VB .NET,
однако в зависимости от типа
клиентского броузера генерируется
разный код HTML. Например, если клиент
работает в последней версии Internet
Explorer, в сгенерированном коде
используются конструкции DHTML, а
интервальная проверка
осуществляется на стороне клиента.
Но если в качестве броузера
используется сотовый телефон с
поддержкой WAP (Wireless Application Protocol),
будет сгенерирован код WML (версия HTML
для этой платформы), а все
необходимые проверки будут
выполняться сервером. И все это
происходит автоматически,
совершенно не требуя особых
действий со стороны программиста![ Если,
конечно, вы не займетесь
разработкой нестандартных
элементов для форм Web — в этом
случае вам придется изрядно
потрудиться. Элементы форм ^Veb
должны знать, какой код следует
генерировать для каждой конкретной
платформы. ]
Ниже приведен
код предыдущего примера,
сгенерированный для клиентского
броузера Internet Explorer, работающего в
Windows XP. Ключевые строки выделены
жирным шрифтом:
<!DOCTYPE HTML
PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAO>
<title></title>
<meta name="GENERATOR"content="Microsoft
Visual Studio.NET 7.0">
<meta name="CODE_LANGUAGE"content="Visual
Basic 7.0">
<meta name="vs_defaultClientScnpt"content="JavaScnpt">
<meta name="vs_targetSchema"
content="align="left"></HEAD>
<body
MS_POSITIONING="GridLayout">
<form name="Forml"
method="post" action="WebForml.aspx" id="Forml">
<input type="hidden"
name="_VIEWSTATE" value="dDwxMDA3MzE2MzEy0zs+"/>
<input type="subm1t"
name="Buttonl" value="Click me!" id="Buttonl"
style="height:67px;width:123px;Z-INDEX:
101: LEFT :311px:
POSITION:absolute;TOP:212px"/>
<span id="Labell"style="height:132px:width:631px:Z-INDEX:102:
LEFT:15px;POSITION:absolute:TOP:40px"></span>
</form>
</body>
</HTML>
Из выделенного
фрагмента видно, что в
сгенерированный для клиентской
стороны HTML-код включена форма HTML с
атрибутом post и скрытым полем _VIEWSTATE.
Эти строки позволяют ASP .NET
сохранять информацию состояния, не
требуя специальных действий со
стороны клиента. Скрытое поле _VIEWSTATE
содержит зашифрованные данные, по
которым ASP .NET может восстановить
страницу и ее состояние. Механизм
шифрования представляет собой
особую разновидность сериализации;
чтобы отключить сохранение
состояния, задайте свойству ЕпаЫе-ViewState
значение False.
Чтобы лучше
понять, как происходит сохранение
состояния, нажмите кнопку и снова
просмотрите исходный текст. На этот
раз ключевые строки HTML-кода будут
выглядеть примерно так:
<form name="Forml"
method="post" action="WebForml.aspx" id="Forml">
<input type="hidden"
name="_VIEWSTATE"
value="dDwxMDA3MzE2MzEy03Q802w8aTwxPjs+
02w8dDw7bDxpPDM+Oz47bDxOPHA,
8cDxsPEZvbnRfU216ZTtUZXh0018hUOI7PjtsPFN5
c3RlbS5XZWIuVUkuV2Vi029udHJvbH
MuRm9udFVuaXQsIFN5c3RlbS5XZWIsIFZlcnNpb
249MS4wLjIOMTEuMCwgQ3VsdHVyZT
luZXVOcmFsLCBQdWJsaWNLZXlUb2tlbjliMDNmN
WY3ZjExZDUwYTNhPFgtT6FyZ2U+0
ldlbGNvbWUgdG8gQVNQLk5FVCBAOC8xOS8yMDAx
IDEyOjM20jAwIFBN02k8MTQwOT
47Pj47Pjs7Pjs+Pjs+Pjs+"/>
Хотя базовый
файл .aspx, указанный в атрибуте тега
<form>, остался прежним, скрытая
переменная _VIEWSTATE изменилась весьма
основательно. Фактически в этом
поле сохранено полное состояние
элементов HTML и данных формы. Одно из
преимуществ этого подхода
заключается в том, что программист
избавляется от хлопот с
сохранением состояния. Он просто
задает свойству EnableViewState значение
True и переходит к программированию
логики страницы. С другой стороны, с
каждой страницей приходится
пересылать дополнительные данные.
В большинстве случаев их объем
относительно невелик, поэтому
преимущества компенсируют
недостатки.
Элементы
ввода (тег <input>) на стороне
клиента всегда запоминают свое
состояние даже после пересылки
данных на сервер и обратно. ASP .NET не
позволяет отключать
автоматическое сохранение
состояния для элементов ввода.
Наконец, у
каждой страницы .aspx имеется
свойство Sessi on, возвращающее объект
с информацией о текущей странице.
Объект Session можно рассматривать как
своего рода «cynepcookie» с возможностью
сохранения данных по ключу (как в
хэш-таблицах). Пример:
Session("user
name") = TextBox1.Text
Содержимое
текстового поля TextBoxl сохраняется в
объекте Session, а при обращениях к -нему
используется строка "user name".
Нехватка
места не позволяет развивать эту
тему, однако мы хотим обратить
внимание читателя на одно
обстоятельство. В особо сложных
ситуациях, когда сохранение всех
данных в объекте Session, находящемся в
памяти сервера, нежелательно,
информация сохраняется в базе
данных SQL Server. Более того, если сайт
обслуживается web-комплексом, вы
даже можете указать, на каком
сервере должна храниться эта
информация! Эти две особенности
значительно улучшают
масштабируемость приложений ASP .NET.
В ранних
версиях Windows конфигурационные
данные хранились в ini-файлах, на
смену которым пришел глобальный
реестр. В ASP .NET приложения
фактически возвращаются к временам
текстовых ini-файлов —
конфигурационные данные хранятся в
текстовом файле Web.config, находящемся
в каталоге приложения. Этот файл
определяет условия выполнения
приложений ASP .NET — такие как
параметры отладки и системы
безопасности. Конфигурационные
файлы имеют довольно сложную
структуру. Ниже приведено
содержимое файла Web.config для
предыдущего примера:
1 <?xml version-"1.0"
encoding="utf-8"?>
2
<configuration>
3 <system.web>
4 <!--DYNAMIC
DEBUG COMPILATION
5 Set compilation
debug="true" to insert debugging symbols (.pdb
6 information)into
the compiled page.Because this creates a larger file
7 that executes more
slowly,you should set this value to true only when
8 debugging.and to
false at all other times.For more information,refer
9 to the
documentation about debugging ASP .NET files.
10 -->
11 compilation
defaultl_anguage="vb" debug="true"/>
12 <!--CUSTOM
ERROR MESSAGES
13 Set customErrors
mode="0n" or "RemoteOnly" to enable custom
error
14 messages. "Off"to
disable.Add <error> tags for each of the errors
15 you want to
handle.
16 -->
17 <customErrors
mode="RemoteOnly"/>
18 <!--AUTHENTICATION
19 This section sets
the authentication policies of the application.
20 Possible modes
are "Windows". "Forms". "Passport"
and "None"
21 -->
22
<authentication mode="windows"/>
23 <!--AUTHORIZATION
24 This section sets
the authorization policies of the application.You can
25 allow or deny
access to application resources by user or role.
26 Wildcards:
"*" mean everyone, "?" means anonymous (unauthenticated)
27 users.
28 -->
29
<authorization>
30 <allow users-
"*" /><!-- Allow all users -->
31 <!--<allow
users="[comma separated list of users]"
32 roles="[comma
separated list of roles]"/>
33 <deny users="[comma
separated list of users ]"
34 roles="[comma
separated list of roles]"/>
35 -->
36 </authorization>
37 <!--APPLICATION-LEVEL
TRACE LOGGING
38 Application»level
tracing enables trace log output for every page within
39 an application.Set
trace enabled= "true"to enable application trace
40 logging.If
pageOutput- "true",the trace information will be
displayed at
41 the bottom of
each page.Otherwise,you can view the application trace
42 log by browsing
the "trace.axd"page from your Web application root.
43 -->
44 <trace enabled-
"false" requestLimit = "10"
45 pageOutput =
"false" traceMode = "SortByTime"
46 localOnly- "true"
/>
47 (--SESSION STATE
SETTINGS
48 By default ASP .NET
uses cookies to identify which requests belong to a
49 particular
session.If cookies are not available.a session can be
50 tracked by adding
a session identifier session.To disable cookies.set
51 sessionState
cookieless = "true"'
52 -->
53 <sessionState
54 mode="InProc"
55
stateConnectionString - "tcpip=127.0.0.1:42424"
56
sqlConnectionSthng = "data source=127.0.0.1:user id=sa:password="
57 cookieless="false"
58 timeout="20"
59 />
60 <!--PREVENT
SOURCE CODE DOWNLOAD
61 This section sets
the types of files that will not be downloaded.As
62 well as entering
a httphandler for a file type.you must also *
63 associate that
file type with the xspisapi.dll in the App Mappings
64 property of the
Web site.or the file can be downloaded.lt is
65 recommended that
you use this section to prevent your sources from
66 being downloaded.
67 -->
68
<httpHandlers>
69 <add verb=
"*" path= "*.vb"
70 type= "System.Web.HttpNotFoundHandler.System.Web"/>
71 <add verb="*"
path = "*.cs"
72 type= "System.Web.HttpNotFoundHandler.System.Web"/>
73 <add verb="*"
path="*.vbproj"
74 type= "System.Web.HttpNotFoundHandler.System.Web"/>
75 <add verb="*"
path="*.csproj"
76 type= "System.Web.HttpNotFoundHandler.System.Web"/>
77 <add verb="*"
path-"*.webinfo"
78 type= "System.Web.HttpNotFoundHandler.System.Web"/>
79 </httpHandlers>
80 <!--GLOBALIZATION
81 This section sets
the globalization settings of the application.
82 -->
83 <globalization
requestEncoding= "utf-8" responseEncoding="utf-8"/>
84 </system.web>
85 </configuration>
Из строки 1
видно, что страницы ASP .NET, как и
многие объекты .NET, строятся на базе
XML. В строках 2-11 содержится часть
конфигурационного файла, которая
управляет настройками компиляции и
определяет режим использования
страницы — тестирование/разработка
или нормальная работа. В этой части
файла также указываются языки,
использованные в странице (как
видно из строки И, в приведенном
примере это VB).
При
переводе приложения в рабочий
режим установите в файле Web.config
параметр debug=false. Отладочный режим
играет важную роль в процессе
разработки, но на стадии
использования он может серьезно
замедлить работу приложения ASP .NET —
в некоторых случаях на порядок и
даже более.
Следующий
раздел относится к проверке
привилегий пользователя (строки 18-36).
В приведенном листинге параметрам
аутентификации присвоено значение «*»;
это означает, что работа с
приложением разрешена любому
пользователю. Как видно из
автоматически сгенерированных
комментариев к этому разделу, вы
также можете разрешить или
запретить доступ к приложению при
помощи ключевых слов allow и deny.
Хорошая схема
аутентификации занимает важное
место в программировании
распределенных приложений. Каким
образом страница узнает, кем
является ее пользователь? В ASP .NET
поддерживаются три разновидности
схем аутентификации, перечисленные
в табл. 12.1.
Таблица 12.1. Схемы
аутентификации в ASP .NET
Схема
аутентификации |
Описание |
Windows | Используется встроенная схема аутентификации IIS (на экране появляется диалоговое окно для ввода имени и пароля). Пользователь должен иметь учетную запись на данном компьютере |
Forms | Наиболее распространенная форма аутентификации. После успешной регистрации сервер генерирует cookie, автоматически включаемое в заголовок сообщения на протяжении сеанса. При настройке этой схемы аутентификации указывается имя регистрационной формы и управляющая ею страница ASP .NET |
Passport | Новая схема аутентификации, активно внедряемая компанией Microsoft |
Первые две
схемы вполне стандартные, только
третья относительно нова. Поиск на
сайте Googte показывает, что на момент
написания книги существовали
тысячи web-страниц с обсуждением
достоинств и недостатков схемы
аутентификации Microsoft Passport. При
желании вы можете самостоятельно
изучить эту тему и принять
собственное решение.
Помните, что при
любой схеме аутентификации HTTP
остается текстовым протоколом,
поэтому информация передается
клиенту в незашифрованном виде и
может быть похищена методом
перехвата пакетов (packet sniffing). Для
борьбы с перехватом используется
транспортный механизм SSL (Secure Socket
Layer).
Классы .NET
WebRequest и WebResponse автоматически
используют SSL для URL, начинающихся с
префикса «https».
Строки 47-59
управляют состоянием сеанса. В
большинстве случаев используются
стандартные механизмы ASP .NET,
обладающие достаточно мощными
возможностями. Начиная со строки 60
и до конца файла реализуется одна
занятная возможность ASP .NET,
представляющая особый интерес для
тех, кто хочет защитить свою
интеллектуальную собственность. В
этом разделе приводится список
типов файлов, которые не должны
приниматься клиентом с сервера.