Что передается клиенту?

Сценарии 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="http://schemas.microsoft.com/intel1isense/ie5">

</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.

 

Файл Web.config

В ранних версиях 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, представляющая особый интерес для тех, кто хочет защитить свою интеллектуальную собственность. В этом разделе приводится список типов файлов, которые не должны приниматься клиентом с сервера.