9:34 05.12.2011 ASP.NET
Схема розвитку архітектурних застосунків
Документно-орієнтовані застосунки
│ │
CGI → ISAPI
Документно-орієнтовані застосунки – на цьому етапі веб-застосунки були примітивним файловим сервером, який повертав користувачу заздалегідь згенеровану статичну веб-сторінку.
Поява застосунків, що ґрунтуються на інтерфейсах.
Суть роботи CGI полягала в тому, що сервер отримував посилання, яке викликало певний застосунок, потім сервер брав вхідні дані для цього застосунку і генерував на основі цих даних сторінку, які потім повертав клієнту.
Недоліком CGI було те, що при кожного клієнтському запиті сервер у реальному часі запускала застосунок, завантажуючи при цьому OPERATIONAL MEMORY (Оперативну пам’ять).
ISAPI повністю розв’язує проблему CGI-застосунків, зберігаючи їхню функціональність. ISAPI – це DLL-бібліотеки, які завантажуються в адресний простір при першому запиті, а при наступних – просто виконуються.
Поява ASP
Враховуючи, що при використані CGI та ISAPI вирішувалися по суті одні й ті ж проблеми, з’явився високорівневий інтерфейс, який spрощеним чином розв’язував завдання інтерфейсу.
Функціональність ASP – spрощене підключення до БД та звернення до різних компонентів сторінки.
ASP.NET
Створений на основі ASP. Передбачає динамічну генерацію HTML-сторінок, інтеграцію серверних компонентів та відокремлення логічної частини від візуальної.
Існує 3 види веб-застосунків:
- Сторінковий – програми, які не використовують компонентну модель (до них можна віднести застосунки, повністю написані скриптовими мовами).
- Компонентний:
a) застосунки, що іспользуют для розширення функціоналу компонентну модель, не призначену для веб-застосунків (ActiveX);
b) застосунки, що іспользуют стандартні моделі і потребують на сервері ґрунтовного діючогоі компонента, який відповідатиме за їхнє виконання (JSP + Glassfish). - MVC.
Для ASP.NET передбачено 2 моделі побудови коду веб-сторінок:
- Однофайлова – суть в тому, що і логічна, і візуальна частини сторінки описуються в одному файлі з розширенням .aspx. Логічна частина розміщується в теґі
<script>. Під час виконання однофайлова сторінка сприймається як клас, що наслідується від Page, тому майже увесь код spриймається як елементи цього класу. Через це не можна підключати простори імен всередині<script>– це вже тіло класу. Якщо потрібно – проблему розв’язують либо черезконфігураційні файли, либо через директиву@Import. - CodeBehind – логічна та інтерфейсна частини відокремлюються: інтерфейсна – в .aspx, логічна – у файлі, розширення якого залежить від мови. Зв’язок між ними забезпечується:
- в .aspx – директивою
@Page, - в програмній частині –
partial class, що наслідується відPage.
- в .aspx – директивою
Якщо якийсь елемент в .aspx-частині має оброблятися сервером – у нього має бути атрибут runat="server".
Керування конфігурацією в ASP.NET
Конфігурація здійснюється за допомогою XML-базованих файлів. Вони мають 3 важливі переваги:
- ніколи не блокуються;
- їх можна вільно dubлювати в каталогах і підкаталогах;
- їх легко редагувати і вони зрозумілі.
Konфігурація починається з 2 кореневих файлів:
- machine.config – визначає розділи, які будуть підтримуваними в конфігураційних файлах і відповідає за налаштування сервера загалом.
- кореневий web.config – містить налаштування для всіх застосунків на поточному сервері尤其是: обробники HTTP-протоколу, підключення ASP-модулів, політики безпеки, правила підтримки браузерів.
web.config конкретного застосунку
Основні розділи:
<configSections>– реєструє елеміntи конфігурації, які можна використовувати.<appSettings>– сюди додають глобальні для застосунку строкові змінні. Відмінність від звичайних(globals) – можна змінювати значення без зупинки/перекомпіляції застосунку.<connectionStrings>– строки підключення до баз даних.<system.web>– конфігураційні параметри ASP.NET.<assemblies>– перелік збірок, що застосовуються.<compilation debug="true/false"– увімкнення/вимкнення дебагу.
<authentication>– як перевіряти auth-дані клієнта.
<customErrors>– URL-и для редіректу при стандартних errores.<pages>– parameters by default для сторінок (перекриваються директивою@Page).
<httpHandlers>– класи-обробники HTTP-запитів.
<httpModules>– спеціальні модулі сервера.<system.codedom>– компілятори для логічної частини сторінок.<system.webServer>– конфігурація ASP.NET AJAX especially для IIS7.<runtime>– налаштуванняі запуску застосунку.
Розширення структури конфігураційного файлу
У <appSettings> two серйозні обмеження:
- тільки одиничні значення;
- тип – string.
Але часто потрібно зберігати об’єкти. Вирішення – створення власного розділу:
- визначити структуру теґу (атрибути = окремі одиниці);
- створити клас-наслідник
ConfigurationSection; - зареєструвати новий розділ в
<configSections>.
9:30 06.12.2011
Наслідування конфігурацій
ASP.NET uses багаторівневу систему Konфігурації з механізмом наслідування.順序:
machine.config → root web.config → web.config zastosunku → web.config subfolders
global.asax – file для global event handlers. Nikoli безпосередньо не запитується користувачами, викликається автоматично. Obligatoryчно – тільки one file in root.
global.asax processes two типи подій:
-
Podії на кожен запрос:
Application_BeginRequestApplication_authenticateRequest(точка входу для власної auth)Application_AuthorizeRequest(призначення прав)
煞 -Application_ResolveRequestCacheApplication_AcquireRequestStateApplication_PreRequestHandlerExecuteApplication_PostRequestHandlerExecute( ODRAZУ після генерації HTML)Application_ReleaseRequestState(serialization session)Application_UpdateRequestCacheApplication_EndRequest
-
Podії за услові:
Application_Start(перший запуск)Application_EndApplication_ErrorSession_Start / Session_EndApplication_Disposed( після GC, resources already freed)
Життєвий цикл сторінки
- Ініціалізація структури – створюються controls, deserializes viewstate, podія
Page.Init. Nie можна задавати properties controls. - Ініціалізація user code – podія
Page.Load. перевіряти!IsPostBack, bo Load Spracovuje vždy.EnableViewState="false"– disable serialization per-control. - Перевірка достовірності даних – validators auto-check, developer перевіряє
Page.IsValid. - Обробка podій – podії two груп:
a) негайної відповіді (submit);
b) зміна values (text changed).
9:35 07.12.2011
Механізм обробки подій в ASP.NET
Даний механізм радикально відрізняється від обробки подій у Windows Forms. Зокрема, у WinForms можна реєструвати обробники на всі події миттєво, тоді як ASP.NET накопичує групу подій, пов’язаних зі зміною елементів управління, до моменту настання PostBack. При цьому PostBack має бути спровокований подією, що вимагає негайної обробки.
Принципово будь-який елемент на сторінці можна зробити таким, що викликає миттєву обробку подій — для цього достатньо встановити у нього атрибут AutoPostBack="true". Але при цьому щоразу, коли значення елемента змінюється, відбуватиметься автоматичне перезавантаження сторінки.
5) Автоматичне прив’язування даних
В ASP.NET існує ряд елементів — так звані джерела даних (Data Source Controls). Їхнє основне призначення — отримання даних із зовнішніх ресурсів та прив’язування цих даних до елементів управління. На цьому етапі надсилаються запити до конкретного ресурсу, отримуються дані та заповнюються пов’язані елементи управління.
Відразу після цього етапу спрацьовує подія Page.PreRender. Обробник цієї події — фактично останнє місце, де ще можна внести будь-які зміни на сторінку, бо після цього сторінка вже буде відправлена користувачу.
6) Очищення
Етап очищення складається з двох подій:
а) Page.Unload – вивантаження сторінки з пам’яті; тут можна звільняти ресурси.
б) Page.Disposed – збирач сміття вже підготував об’єкт до очищення. На цьому етапі вже нічого не можна робити з ресурсами, лише контролювати, чи звільнилася критична пам’ять.
Вбудовані об’єкти класу Page:
| Об’єкт | Тип | Призначення |
|---|---|---|
Session |
HttpSessionState | Зберігання даних користувача, що стосуються поточного сеансу |
Application |
HttpApplicationState | Глобальні для всього застосунку дані |
Cache |
Cache | Дані кешування конкретної сторінки |
| → ці три об’єкти є словниками типу key-value | ||
Request |
HttpRequest | Містить значення та властивості HTTP-запиту, що привів до завантаження сторінки |
→ Browser |
HttpBrowserCapabilities | Можливості браузера користувача |
→ Cookies |
Колекція cookie | |
→ QueryString |
Параметри рядка запиту | |
→ UserLanguages |
Масив мов клієнта | |
Response |
HttpResponse | Надсилання відповіді користувачу (використовується рідко) |
→ IsClientConnected |
bool | Чи є з’єднання з клієнтом |
→ Redirect() |
Перенаправлення на іншу сторінку | |
→ Write() |
||
Server |
HttpServerUtility | Набір допоміжних методів та властивостей сервера |
→ MachineName |
Ім’я сервера | |
→ HtmlEncode() / HtmlDecode() |
Кодування/декодування HTML | |
→ MapPath() |
Абсолютний шлях за відносним | |
→ Transfer() |
Передача виконання іншій сторінці в межах того ж застосунку (без зміни URL у браузері) | |
→ GetLastError() |
Остання помилка |
Директиви ASP.NET
| Директива | Призначення |
|---|---|
@Page |
Налаштування та атрибути поточної сторінки |
@Assembly |
Імпорт збірки (Name, Src) |
@Control |
Ідентифікація сторінки як користувацького елемента управління (аналогічно @Page) |
@Implements |
Для однофайлової моделі – вказує, що клас сторінки реалізує певний інтерфейс |
@Import |
Імпорт просторів імен (однофайлова модель) |
@Master |
Сторінка є master-page (шаблоном дизайну) |
@MasterType |
Посилання на клас master-сторінки (TypeName, VirtualPath) |
@OutputCache |
Керування кешуванням сторінки або елемента управління |
@PreviousPageType |
Тип попередньої сторінки, з якої прийшли дані |
@Reference |
Сторінка/елемент, що компілюється разом із поточною |
@Register |
Створення псевдонімів для просторів імен та користувацьких елементів управління (Assembly, Namespace, Src, TagPrefix, TagName) |
Важливі атрибути директиви @Page / @Control
CodeFile– файл із програмною частиноюCulture– кодування, мова тощоDebug– увімкнення/вимкнення дебагу (перекриває web.config)EnableViewStateEnableThemingInherits– клас логічної частини сторінкиLanguage– мова скриптівAutoEventWireup– автоматична прив’язка обробників подій
9:25 08.12.2011
Серверні директиви включення
Вставка зовнішнього файлу в тіло ASP.NET-сторінки:
<!--#include file="test.aspx"--> <%-- той самий каталог --%>
<!--#include virtual="/MyDir/test.aspx"--> <%-- інший каталог --%>Серверні елементи управління
Усі серверні елементи управління — це класи .NET Framework. Кожен клас відповідає певному елементу форми. Поділяються на категорії:
- Серверні HTML-елементи управління – звичайні HTML-теги з
runat="server". Дозволяють працювати з ними з коду. - Web-елементи управління – розширені аналоги HTML (Button, Label, TextBox тощо).
- Повноправні елементи – генерують великий обсяг розмітки та мають розширений функціонал (Calendar, GridView тощо).
- Елементи валідації – автоматична перевірка коректності введених даних.
Усі елементи управління походять від базового класу System.Web.UI.Control.
Серверні HTML-елементи управління (простір імен System.Web.UI.HtmlControls):
- Елементи вводу → успадковуються від HtmlInputControl
- Контейнерні елементи → HtmlContainerControl
- візуальні (кожен має свій клас)
- службові (усі обслуговує HtmlGenericControl)
Обробка подій:
- ServerClick – клік, що обробляється на сервері та викликає відправку даних
- ServerChange – генерується при зміні значення; обробляється лише під час PostBack
9:43 12.12.2011
Web-елементи управління
Серверні HTML-елементи мають три суттєві недоліки:
- Стилі задаються тільки через CSS-синтаксис
- Немає автоматичної відправки при зміні значення
- Неможливо створювати складні структури
Усі ці обмеження зникають при використанні Web Controls (успадковуються від System.Web.UI.WebControl).
Спільні властивості простих Web-елементів управління:
AccessKey– гаряча клавіша (Alt + літера)BackColor,BorderColor,BorderStyle,BorderWidthCssClassEnabled,Font,ForeColorHeight,Width,TabIndex,ToolTip
Рекомендація: завжди задавайте ID елементам (крім тих, що є частиною складнішого елемента). Усі Web-елементи мають розміщуватись усередині однієї серверної форми <form runat="server">.
Одиниці вимірювання
Для властивостей розмірів використовується структура Unit:
<asp:Panel Height="300px" Width="50%" ... />pnl.Height = Unit.Pixel(300);
pnl.Width = Unit.Percentage(50);Перелічення (enum)
У .cs-частині використовуються як звичайно. В .aspx — вказується лише назва константи, належність до enum визначається автоматично.
Кольори
Встановлюються через System.Drawing.Color:
- через ARGB
- через іменовані кольори .NET (
Color.Red) - через назву в стилі HTML (
"red")
Ось продовження ваших конспектів у чистому, структурованому та зрозумілому вигляді (укр. мова).
Властивість Font у Web-контролів насправді є посиланням на повноцінний об’єкт типу FontInfo.
Цей об’єкт містить усі налаштування шрифту для даного елемента управління.
- Font (властивість) — доступна тільки для читання цілком.
- Змінювати можна окремі налаштування об’єкта.
Основні властивості FontInfo
| Властивість | Призначення |
|---|---|
Name |
Назва одного шрифту (наприклад "Arial") |
Names |
Масив назв шрифтів (наприклад "Arial", "Helvetica", "sans-serif") |
→ Name і Names пов’язані: запис в одне автоматично оновлює інше |
|
Name |
Назва одного шрифту (наприклад "Arial") |
Size |
Розмір шрифту як об’єкт FontUnit |
Bold, Italic, Strikeout, Underline, Overline |
Стилі шрифту (true/false) |
- На відміну від HTML-контролів, кожен Web-контроль має метод
.Focus(). - Реальний фокус працює тільки на елементах, що дозволяють введення даних (TextBox, DropDownList тощо).
- При виклику
.Focus()сторінка автоматично прокручується до елемента (якщо він нижче). - ASP.NET реалізує це через JavaScript: у відповідь додається скрипт
Функція
<script type="text/javascript"> WebForm.AutoFocus('textbox1'); </script>
WebForm.AutoFocusгенерується автоматично і лежить уWebResource.axd.
- Часто потрібно, щоб при натисканні Enter форма відправлялася певною кнопкою.
- Для всієї сторінки:
<form id="Form1" runat="server" DefaultButton="btnSubmit"> <asp:Button ID="btnSubmit" Text="OK" runat="server" /> </form>
- Якщо на сторінці кілька груп полів → кожну групу обгортаємо в
<asp:Panel>і задаємо власнийDefaultButton:<asp:Panel DefaultButton="btnLogin" runat="server"> … поля логіну … <asp:Button ID="btnLogin" Text="Увійти" runat="server" /> </asp:Panel>
ServerClick→ замінюється на подіюClickServerChange→ замінюється на спеціалізовані події:TextChanged,SelectedIndexChanged,CheckedChangedтощо- Web-контроли підтримують
AutoPostBack="true"– автоматична відправка при зміні.
Валідація даних (Validators)
ASP.NET підтримує клієнтську та серверну валідацію одночасно.
| Загальні властивості валідаторів | Опис |
|---|---|
ControlToValidate |
ID елемента, що перевіряється |
Display |
Static / Dynamic / None |
EnableClientScript |
Увімкнути/вимкнути клієнтський JavaScript |
ErrorMessage |
Повне повідомлення (для ValidationSummary) |
Text |
Коротке повідомлення (виводиться біля поля) |
IsValid |
true, якщо перевірка пройшла |
Validate() |
Примусовий виклик перевірки |
RequiredFieldValidator – обов’язкове поле
InitialValue– значення «за замовчуванням» (наприклад, «Введіть email»), при його наявності валідатор перевіряє не на порожність, а на зміну цього тексту.
RegularExpressionValidator
ValidationExpression– регулярний вираз- Клієнтська перевірка – синтаксис JavaScript, серверна – синтаксис .NET
CompareValidator
ControlToCompare/ValueToCompareOperator(Equal, GreaterThan, DataTypeCheck тощо)Type(String, Integer, Date тощо)
RangeValidator
MinimumValue,MaximumValue,Type
ValidationSummary
- `HeaderText– заголовок–
ShowMessageBox– виводити повідомлення в alert (клієнт)ShowSummary– виводити на сторінці (сервер)- Ці два атрибути взаємовиключні
CustomValidator – власна логіка
<asp:CustomValidator
ControlToValidate="txtAge"
OnServerValidate="CheckAge"
Text="*" runat="server"/>protected void CheckAge(object sender, ServerValidateEventArgs e)
{
int age;
if (int.TryParse(e.Value, out age) && age >= 18)
e.IsValid = true;
else
e.IsValid = false;
}CustomValidator не спрацьовує, якщо поле порожнє (потрібен ще RequiredFieldValidator).
**ViewState
- Вбудована колекція типу ключ-значення.
- Дані зберігаються між PostBack-ами у прихованому полі
__VIEWSTATE. - Використання:
ViewState["UserName"] = "Іван"; string name = ViewState["UserName"] as string;
- Через рядок запиту (QueryString)
Response.Redirect("Page2.aspx?id=" + Server.UrlEncode(value));
- Cross-page postback (PostBackUrl)
На Page2:
<asp:Button PostBackUrl="~/Page2.aspx" … />
Або точніше – через директивуif (PreviousPage != null) { TextBox tb = PreviousPage.FindControl("txtName") as TextBox; }
@PreviousPageTypeта публічні властивості на попередній сторінці.
Складні елементи управління для роботи з даними
| Елемент | Призначення |
|---|---|
| GridView | Табличне представлення даних + редагування, сортування, пагінація |
| DetailsView | Детальний перегляд/редагування однієї записи (вертикально) |
| FormView | Детальний перегляд однієї записи через шаблоном (максимальна гнучкість) |
| ListView | Повна свобода розмітки (всі шаблони треба писати вручну) |
→ у ListView обов’язково в LayoutTemplate вказати контейнер з id="itemPlaceholder" |
Master Pages
- Єдиний шаблон дизайну для багатьох сторінок.
- Файл має розширення
.master, директива@Master. <asp:ContentPlaceHolder ID="MainContent" runat="server" />– місце для контенту.- На звичайній сторінці:
<%@ Page Language="C#" MasterPageFile="~/Site.master" Title="Моя сторінка" %> <asp:Content ContentPlaceHolderID="MainContent" runat="server"> …весь контент… тут… </asp:Content>
- У master-сторінці всередині ContentPlaceHolder можна вказати контент за замовчуванням – він відобразиться, якщо сторінка не перевизначила цей блок.
- На сторінках-контенті не повинно бути
<html>,<body>,<form runat="server">– все це вже є в master. <asp:PlaceHolder>– звичайний контейнер для динамічного додавання контролів з коду.
Ось продовження ваших конспектів у чистому, структурованому вигляді (укр. мова).
UserControl – це перевикористовуваний блок коду та розмітки, аналогічний звичайній сторінці ASP.NET.
-
Складається з двох файлів:
.ascx– візуальна розмітка.ascx.cs– код (code-behind)
-
Замість директиви
@Pageвикористовується директива@Control:<%@ Control Language="C#" AutoEventWireup="true" CodeFile="MyControl.ascx.cs" Inherits="Controls.MyControl" %>
-
У
.ascxне потрібно створювати<html>,<body>,<form runat="server">– там одразу розміщуються контролы. -
Клас у
.ascx.csповинен наследуватися відSystem.Web.UI.UserControl:public partial class MyControl : System.Web.UI.UserControl { // публічні властивості з значеннями за замовчуванням public string UserName { get; set; } = "Гість"; protected void Page_Load(object sender, EventArgs e) { // ініціалізація } }
Підключення та використання UserControl на сторінці
<%@ Page ... %>
<%@ Register TagPrefix="uc" TagName="MyControl" Src="~/Controls/MyControl.ascx" %>
<html>
<body>
<form id="form1" runat="server">
<uc:MyControl ID="ctrl1" runat="server" UserName="Іван" />
</form>
</body>
</html>** Як додати місце для вставки вмісту ззовні (аналог ContentPlaceHolder)**
- У
.ascxдодаємо контейнер:<asp:PlaceHolder ID="ContentArea" runat="server" />
- У
.ascx.csстворюємо публічну властивість:public ControlCollection Content { get { return ContentArea.Controls; } }
- Використання на сторінці:
<uc:MyControl runat="server" ID="ctrl"> <Content> <div>Цей вміст вставлено ззовні</div> </Content> </uc:MyControl>
Підняття власних подій із UserControl
- Створюємо делегат (або використовуємо готовий
EventHandler):public event EventHandler<UserLoginEventArgs> UserLoggedIn;
- Створюємо клас аргументів (якщо потрібні свої дані):
public class UserLoginEventArgs : EventArgs { public string UserName { get; set; } public bool Success { get; set; } }
- Піднімаємо подію в потрібному місці:
protected void btnLogin_Click(object sender, EventArgs e) { var args = new UserLoginEventArgs { UserName = txtName.Text, Success = true }; UserLoggedIn?.Invoke(this, args); }
AJAX в ASP.NET
open(method, url, async, user, password)send(content)- Стани:
0-uninitialized,1-loading,2-loaded,3-interactive,4-complete - Властивості:
responseText,responseXML,status,readyState
- XHTML + CSS – представлення
- DOM – динамічне відображення
- XML + XSLT – обмін даними
- XMLHttpRequest – асинхронний обмін
- JavaScript – склеювання усього
- Обов’язково на сторінці один
<asp:ScriptManager runat="server" EnablePartialRendering="true" /> <asp:UpdatePanel>– область, що оновлюється асинхронно
| Властивість UpdatePanel | Значення | Опис |
|---|---|---|
UpdateMode |
Always |
Оновлюється при кожному PostBack |
Conditional |
Оновлюється тільки за тригерами або викликом .Update() |
|
ChildrenAsTriggers |
true/false |
Чи викликають дочірні контролы оновлення панелі |
Тригери (коли UpdateMode="Conditional")
<asp:UpdatePanel runat="server" UpdateMode="Conditional">
<Triggers>
<asp:AsyncPostBackTrigger ControlID="btnRefresh" EventName="Click" />
<asp:PostBackTrigger ControlID="btnFullPostBack" /> <!-- повний PostBack -->
</Triggers>
<ContentTemplate>
…контент…
</ContentTemplate>
</asp:UpdatePanel>Програмне оновлення:
UpdatePanel1.Update();Збереження стану (State Management) у веб-додатках
Веб-додатки за своєю природою stateless – після обробки запиту пам’ять очищається, об’єкт Page знищується.
| Розташування | Переваги | Недоліки |
|---|---|---|
| На клієнті | Масштабованість, підтримка веб-ферм | Менша безпека, обмежений об’єм |
| На сервері | Безпека, немає обмежень об’єму | Витрата пам’яті сервера, проблеми з фермами |
| Спосіб | Опис |
|---|---|
| ViewState | Автоматичне збереження стану контролів у прихованому полі __VIEWSTATE |
Сховані поля (<input type="hidden">) |
Без шифрування/хешування |
| QueryString | Видно користувачу |
Cross-page posting (PostBackUrl) |
Доступ через PreviousPage |
| Cookies | Зберігаються у файлах браузера |
ViewState – детальніше
- Зберігається у прихованому полі, серіалізується, базово хешується.
EnableViewState="false"– вимикає для конкретного контролу/сторінки.EnableViewStateMac="true"– перевірка контрольної суми (захист від підміни).ViewStateEncryptionMode– шифрування (Auto/Never/Always).- Властивість сторінки
maxPageStateFieldLength– розмір одного поля (якщо -1 – без обмежень).
if (!IsPostBack)
FillListBox();
else
{
// відновлюємо вибране з Request.Form
string[] selected = Request.Form.GetValues("ListBox1");
}Cookies
- Зберігаються у тимчасових файлах браузера (до 20 шт. на домен, до 4 КБ кожен).
- Користувач може вимкнути, видалити, змінити.
Робота з cookies у коді
// Запис
HttpCookie cookie = new HttpCookie("UserInfo");
cookie["Name"] = "Іван";
cookie.Expires = DateTime.Now.AddDays(30); // термін дії
Response.Cookies.Add(cookie);
// Читання
if (Request.Cookies["UserInfo"] != null)
{
string name = Request.Cookies["UserInfo"]["Name"];
}
// Видалення
cookie.Expires = DateTime.Now.AddDays(-1);
Response.Cookies.Add(cookie);Обмеження видимості:
Response.Cookies["clicks"].Path = "/Admin"; // тільки для папки AdminПеревірка підтримки cookies
// Можливість браузера
bool supportsCookies = Request.Browser.Cookies;
// Реальна перевірка (рекомендовано)
if (Session.IsNewSession)
{
// створюємо тестову cookie і перенаправляємо на себе
Response.Cookies["TestCookie"]["value"] = "1";
Response.Redirect(Request.RawUrl);
}
else if (Request.Cookies["TestCookie"] == null)
{
// cookies вимкнено
}Session (збереження стану на сервері)
- При першому запиті створюється унікальний
SessionID(42 байти в .NET 3.5). Session– словник типуSession["key"] = value;- Доступний з будь-якої сторінки додатка.
Як передається SessionID
- Через cookie
ASP.NET_SessionId(за замовчуванням) - У URL (cookieless) – якщо
<sessionState cookieless="true" />
Режими зберігання Session (sessionState mode)
| Mode | Де зберігається | Особливості |
|---|---|---|
InProc (за замовчуванням) |
У пам’яті процесу IIS | Швидкий, втрачається при рестарті |
StateServer |
Окрема служба ASP.NET State Service | Виживає після рестарту IIS |
SQLServer |
У базі SQL Server | Найнадійніший, найповільніший |
Off |
Вимкнено | |
Custom |
Свій провайдер |
Налаштування у web.config:
<sessionState mode="SQLServer"
sqlConnectionString="..."
timeout="20" />Тайм-аут за замовчуванням – 20 хвилин бездіяльності.
Ось продовження ваших конспектів у чистому та структурованому вигляді (укр. мова).
Session – коли втрачається стан сеансу
Сесія втрачається у таких випадках:
- Користувач закриває та знову відкриває браузер (якщо SessionID у cookie).
- Користувач заходить з іншого браузера/комп’ютера.
- Простій більше
timeout(за замовчуванням – 20 хвилин). - Програмне завершення:
Session.Abandon(). - Перезапуск додатка (Application Pool), зміна домену додатка, рестарт IIS (залежить від режиму
sessionState).
Клас HttpSessionState – основні члени
| Член | Опис |
|---|---|
Count |
Кількість елементів у колекції |
IsCookieless |
true – SessionID у URL, false – у cookie |
IsNewSession |
true – сеанс щойно створено для цього запиту |
SessionID |
Унікальний ідентифікатор сеансу |
Timeout |
Тайм-аут у хвилинах |
Clear(), RemoveAll() |
Очистити всі дані сеансу |
Remove("key"), RemoveAt(index) |
Видалити конкретний елемент |
Налаштування <sessionState> у web.config
<sessionState
mode="InProc"
cookieless="AutoDetect" <!-- UseCookies, UseUri, AutoDetect, UseDeviceProfile -->
timeout="30"
regenerateExpiredSessionId="true"
cookieName="MYAPP_SESSIONID" />cookieless |
Значення HttpCookieMode |
|---|---|
| UseCookies | 1 – завжди cookie (за замовчуванням) |
| UseUri | 0 – завжди в URL |
| AutoDetect | 2 – найнадійніший: автоматично визначає підтримку |
| UseDeviceProfile | 3 – тільки по профілю браузера |
regenerateExpiredSessionId="true" – захищає від атак типу Session Fixation при cookieless-режимі.
Примусово відправляти SessionID тільки по HTTPS
Response.Cookies["ASP.NET_SessionId"].Secure = true;Збереження даних у стані додатка (Application State)
- Глобальна пам’ять для всіх користувачів і всіх сторінок одного додатка.
- Доступ через
Application["key"] = value; - Тип:
System.Web.HttpApplicationState - Існує весь час життя додатка, втрачається при рестарті Application Pool.
Особливості
- Потокобезпека забезпечується автоматично методами
Lock()/UnLock():Application.Lock(); Application["Visitors"] = (int)Application["Visitors"] + 1; Application.UnLock();
- Не рекомендується для часто змінюваних даних (знижує продуктивність через блокування).
Статичні змінні в Global.asax – альтернатива Application
// Global.asax
<%@ Application Language="C#" ClassName="MyApp" %>
public class MyApp : HttpApplication
{
public static int TotalVisitors = 0;
}Використання на сторінці:
MyApp.TotalVisitors++;Переваги: немає автоматичного блокування → потрібно робити lock вручну:
lock (typeof(MyApp))
{
MyApp.TotalVisitors++;
}Модель прив’язки даних в ASP.NET
| Тип | Синтаксис | Коли виконується |
|---|---|---|
| Single-value (звичайна) | <%# %> |
Тільки після виклику Page.DataBind() або control.DataBind() |
| Dollar-вирази (Expression Builder) | <%$ %> |
Автоматично при завантаженні сторінки |
- Не обчислюється автоматично!
- Потрібно явно викликати
DataBind() - Можна використовувати всюди (всередині
Text,Runat="server"елементів, у шаблонах тощо).
Приклад:
<asp:Label Text='<%# DateTime.Now.ToString("dd.MM.yyyy HH:mm") %>' runat="server" />protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
Page.DataBind(); // або this.DataBind()
}Автоматично обчислюються при кожному запиті сторінки.
Вбудовані:
<%$ ConnectionStrings:MyConn %><%$ AppSettings:Version %>
Створення власного ExpressionBuilder (приклад: випадкове число)
- Клас:
using System;
using System.CodeDom;
using System.Web.Compilation;
using System.Web.UI;
[ExpressionPrefix("Random")]
public class RandomExpressionBuilder : ExpressionBuilder
{
public override CodeExpression GetCodeExpression(BoundPropertyEntry entry,
object parsedData, ExpressionBuilderContext context)
{
// Параметри: min-max, наприклад <%$ Random:1,100 %>
var parts = entry.Expression.Trim().Split(',');
int min = int.Parse(parts[0]);
int max = parts.Length > 1 ? int.Parse(parts[1]) : min + 100;
return new CodeMethodInvokeExpression(
new CodeTypeReferenceExpression(typeof(RandomHelper)),
"GetRandom",
new CodePrimitiveExpression(min),
new CodePrimitiveExpression(max));
}
}
public static class RandomHelper
{
private static readonly Random _rnd = new Random();
public static int GetRandom(int min, int max)
{
return _rnd.Next(min, max + 1);
}
}- Реєстрація у
web.config:
<compilation debug="false">
<expressionBuilders>
<add expressionPrefix="Random" type="RandomExpressionBuilder, App_Code" />
</expressionBuilders>
</compilation>- Використання:
<div>Випадкове число: <%$ Random:1,100 %></div>
<!-- При кожному оновленні сторінки – нове число -->| Властивість | Призначення |
|---|---|
DataSource |
Програмно задаємо джерело (List<T>, DataTable тощо) |
DataSourceID |
Декларативно – ID контролу-джерела (<asp:SqlDataSource>, ObjectDataSource тощо) |
DataTextField |
Поле для відображення (Text) |
DataValueField |
Поле для значення (Value) |
DataTextFormatString |
Форматування, напр. {0:dd.MM.yyyy} |
Життєвий цикл сторінки з прив’язкою даних
- Створюється об’єкт Page
Init→Load- Події контролів
- Джерела даних виконують оновлення (
Updating → Updated,Inserting → Inserted,Deleting → Deleted) PreRender- Отримання даних:
Selecting → Selected - Побудова та відображення сторінки
IHttpHandler – власні обробники запитів
Інтерфейс для створення обробників, які повністю замінюють стандартний цикл ASPX-сторінок.
public class HelloHandler : IHttpHandler
{
public bool IsReusable => false; // чи можна перевикористовувати екземпляр
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
context.Response.Write("Привіт від власного Handler!");
}
}Реєстрація у web.config
<system.webServer>
<handlers>
<add name="Hello" path="hello.world" verb="*"
type="MyApp.Handlers.HelloHandler, MyApp" />
</handlers>
</system.webServer>Тепер запит http://site/hello.world оброблятиметься вашим класом без .aspx.
IHttpAsyncHandler – асинхронна версія (для довгих операцій I/O).