Skip to content

Instantly share code, notes, and snippets.

@sunmeat
Created December 4, 2025 18:48
Show Gist options
  • Select an option

  • Save sunmeat/daad49cad8188b42e8972ed98330f852 to your computer and use it in GitHub Desktop.

Select an option

Save sunmeat/daad49cad8188b42e8972ed98330f852 to your computer and use it in GitHub Desktop.
конспект

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 види веб-застосунків:

  1. Сторінковий – програми, які не використовують компонентну модель (до них можна віднести застосунки, повністю написані скриптовими мовами).
  2. Компонентний:
    a) застосунки, що іспользуют для розширення функціоналу компонентну модель, не призначену для веб-застосунків (ActiveX);
    b) застосунки, що іспользуют стандартні моделі і потребують на сервері ґрунтовного діючогоі компонента, який відповідатиме за їхнє виконання (JSP + Glassfish).
  3. MVC.

Для ASP.NET передбачено 2 моделі побудови коду веб-сторінок:

  1. Однофайлова – суть в тому, що і логічна, і візуальна частини сторінки описуються в одному файлі з розширенням .aspx. Логічна частина розміщується в теґі <script> . Під час виконання однофайлова сторінка сприймається як клас, що наслідується від Page, тому майже увесь код spриймається як елементи цього класу. Через це не можна підключати простори імен всередині <script> – це вже тіло класу. Якщо потрібно – проблему розв’язують либо черезконфігураційні файли, либо через директиву @Import.
  2. CodeBehind – логічна та інтерфейсна частини відокремлюються: інтерфейсна – в .aspx, логічна – у файлі, розширення якого залежить від мови. Зв’язок між ними забезпечується:
    • в .aspx – директивою @Page,
    • в програмній частині – partial class, що наслідується від Page.

Якщо якийсь елемент в .aspx-частині має оброблятися сервером – у нього має бути атрибут runat="server".

Керування конфігурацією в ASP.NET
Конфігурація здійснюється за допомогою XML-базованих файлів. Вони мають 3 важливі переваги:

  1. ніколи не блокуються;
  2. їх можна вільно dubлювати в каталогах і підкаталогах;
  3. їх легко редагувати і вони зрозумілі.

Konфігурація починається з 2 кореневих файлів:

  1. machine.config – визначає розділи, які будуть підтримуваними в конфігураційних файлах і відповідає за налаштування сервера загалом.
  2. кореневий web.config – містить налаштування для всіх застосунків на поточному сервері尤其是: обробники HTTP-протоколу, підключення ASP-модулів, політики безпеки, правила підтримки браузерів.

web.config конкретного застосунку
Основні розділи:

  1. <configSections> – реєструє елеміntи конфігурації, які можна використовувати.
  2. <appSettings> – сюди додають глобальні для застосунку строкові змінні. Відмінність від звичайних(globals) – можна змінювати значення без зупинки/перекомпіляції застосунку.
  3. <connectionStrings> – строки підключення до баз даних.
  4. <system.web> – конфігураційні параметри ASP.NET.
    • <assemblies> – перелік збірок, що застосовуються.
    • <compilation debug="true/false" – увімкнення/вимкнення дебагу.
  5. <authentication> – як перевіряти auth-дані клієнта.
    <customErrors> – URL-и для редіректу при стандартних errores.
  6. <pages> – parameters by default для сторінок (перекриваються директивою @Page).
    <httpHandlers> – класи-обробники HTTP-запитів.
    <httpModules> – спеціальні модулі сервера.
  7. <system.codedom> – компілятори для логічної частини сторінок.
  8. <system.webServer> – конфігурація ASP.NET AJAX especially для IIS7.
  9. <runtime> – налаштуванняі запуску застосунку.

Розширення структури конфігураційного файлу
У <appSettings> two серйозні обмеження:

  1. тільки одиничні значення;
  2. тип – string.

Але часто потрібно зберігати об’єкти. Вирішення – створення власного розділу:

  1. визначити структуру теґу (атрибути = окремі одиниці);
  2. створити клас-наслідник ConfigurationSection;
  3. зареєструвати новий розділ в <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 типи подій:

  1. Podії на кожен запрос:

    • Application_BeginRequest
    • Application_authenticateRequest (точка входу для власної auth)
    • Application_AuthorizeRequest (призначення прав)
      煞 - Application_ResolveRequestCache
    • Application_AcquireRequestState
    • Application_PreRequestHandlerExecute
    • Application_PostRequestHandlerExecute ( ODRAZУ після генерації HTML)
    • Application_ReleaseRequestState (serialization session)
    • Application_UpdateRequestCache
    • Application_EndRequest
  2. Podії за услові:

    • Application_Start (перший запуск)
    • Application_End
    • Application_Error
    • Session_Start / Session_End
    • Application_Disposed ( після GC, resources already freed)

Життєвий цикл сторінки

  1. Ініціалізація структури – створюються controls, deserializes viewstate, podія Page.Init. Nie можна задавати properties controls.
  2. Ініціалізація user code – podія Page.Load. перевіряти !IsPostBack, bo Load Spracovuje vždy. EnableViewState="false" – disable serialization per-control.
  3. Перевірка достовірності даних – validators auto-check, developer перевіряє Page.IsValid.
  4. Обробка 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)
  • EnableViewState
  • EnableTheming
  • Inherits – клас логічної частини сторінки
  • Language – мова скриптів
  • AutoEventWireup – автоматична прив’язка обробників подій

9:25 08.12.2011
Серверні директиви включення

Вставка зовнішнього файлу в тіло ASP.NET-сторінки:

<!--#include file="test.aspx"-->     <%-- той самий каталог --%>
<!--#include virtual="/MyDir/test.aspx"--> <%-- інший каталог --%>

Серверні елементи управління

Усі серверні елементи управління — це класи .NET Framework. Кожен клас відповідає певному елементу форми. Поділяються на категорії:

  1. Серверні HTML-елементи управління – звичайні HTML-теги з runat="server". Дозволяють працювати з ними з коду.
  2. Web-елементи управління – розширені аналоги HTML (Button, Label, TextBox тощо).
  3. Повноправні елементи – генерують великий обсяг розмітки та мають розширений функціонал (Calendar, GridView тощо).
  4. Елементи валідації – автоматична перевірка коректності введених даних.

Усі елементи управління походять від базового класу System.Web.UI.Control.

Серверні HTML-елементи управління (простір імен System.Web.UI.HtmlControls):

  • Елементи вводу → успадковуються від HtmlInputControl
  • Контейнерні елементи → HtmlContainerControl
    • візуальні (кожен має свій клас)
    • службові (усі обслуговує HtmlGenericControl)

Обробка подій:

  • ServerClick – клік, що обробляється на сервері та викликає відправку даних
  • ServerChange – генерується при зміні значення; обробляється лише під час PostBack

9:43 12.12.2011
Web-елементи управління

Серверні HTML-елементи мають три суттєві недоліки:

  1. Стилі задаються тільки через CSS-синтаксис
  2. Немає автоматичної відправки при зміні значення
  3. Неможливо створювати складні структури

Усі ці обмеження зникають при використанні Web Controls (успадковуються від System.Web.UI.WebControl).

Спільні властивості простих Web-елементів управління:

  • AccessKey – гаряча клавіша (Alt + літера)
  • BackColor, BorderColor, BorderStyle, BorderWidth
  • CssClass
  • Enabled, Font, ForeColor
  • Height, 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:

  1. через ARGB
  2. через іменовані кольори .NET (Color.Red)
  3. через назву в стилі 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)

Метод Focus()

  • На відміну від HTML-контролів, кожен Web-контроль має метод .Focus().
  • Реальний фокус працює тільки на елементах, що дозволяють введення даних (TextBox, DropDownList тощо).
  • При виклику .Focus() сторінка автоматично прокручується до елемента (якщо він нижче).
  • ASP.NET реалізує це через JavaScript: у відповідь додається скрипт
    <script type="text/javascript">
        WebForm.AutoFocus('textbox1');
    </script>
    Функція WebForm.AutoFocus генерується автоматично і лежить у WebResource.axd.

Кнопка «за замовчуванням» (DefaultButton)

  • Часто потрібно, щоб при натисканні 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>

Обробка подій у Web-контролів

  • ServerClick → замінюється на подію Click
  • ServerChange → замінюється на спеціалізовані події: TextChanged, SelectedIndexChanged, CheckedChanged тощо
  • Web-контроли підтримують AutoPostBack="true" – автоматична відправка при зміні.

9:20 14.12.2011

Валідація даних (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 / ValueToCompare
  • Operator (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).

9:31 20.12.2011

**ViewState

  • Вбудована колекція типу ключ-значення.
  • Дані зберігаються між PostBack-ами у прихованому полі __VIEWSTATE.
  • Використання:
    ViewState["UserName"] = "Іван";
    string name = ViewState["UserName"] as string;

Міжсторінкова взаємодія

  1. Через рядок запиту (QueryString)
    Response.Redirect("Page2.aspx?id=" + Server.UrlEncode(value));
  2. Cross-page postback (PostBackUrl)
    <asp:Button PostBackUrl="~/Page2.aspx"  />
    На Page2:
    if (PreviousPage != null)
    {
        TextBox tb = PreviousPage.FindControl("txtName") as TextBox;
    }
    Або точніше – через директиву @PreviousPageType та публічні властивості на попередній сторінці.

10:10 16.01.2012

Складні елементи управління для роботи з даними

Елемент Призначення
GridView Табличне представлення даних + редагування, сортування, пагінація
DetailsView Детальний перегляд/редагування однієї записи (вертикально)
FormView Детальний перегляд однієї записи через шаблоном (максимальна гнучкість)
ListView Повна свобода розмітки (всі шаблони треба писати вручну)
→ у ListView обов’язково в LayoutTemplate вказати контейнер з id="itemPlaceholder"

9:28 23.01.2012

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)

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)**

  1. У .ascx додаємо контейнер:
    <asp:PlaceHolder ID="ContentArea" runat="server" />
  2. У .ascx.cs створюємо публічну властивість:
    public ControlCollection Content
    {
        get { return ContentArea.Controls; }
    }
  3. Використання на сторінці:
    <uc:MyControl runat="server" ID="ctrl">
        <Content>
            <div>Цей вміст вставлено ззовні</div>
        </Content>
    </uc:MyControl>

Підняття власних подій із UserControl

  1. Створюємо делегат (або використовуємо готовий EventHandler):
    public event EventHandler<UserLoginEventArgs> UserLoggedIn;
  2. Створюємо клас аргументів (якщо потрібні свої дані):
    public class UserLoginEventArgs : EventArgs
    {
        public string UserName { get; set; }
        public bool Success { get; set; }
    }
  3. Піднімаємо подію в потрібному місці:
    protected void btnLogin_Click(object sender, EventArgs e)
    {
        var args = new UserLoginEventArgs { UserName = txtName.Text, Success = true };
        UserLoggedIn?.Invoke(this, args);
    }

9:31 30.01.2012

AJAX в ASP.NET

XMLHttpRequest (класичний JavaScript)

  • open(method, url, async, user, password)
  • send(content)
  • Стани: 0-uninitialized, 1-loading, 2-loaded, 3-interactive, 4-complete
  • Властивості: responseText, responseXML, status, readyState

AJAX – набір технологій

  1. XHTML + CSS – представлення
  2. DOM – динамічне відображення
  3. XML + XSLT – обмін даними
  4. XMLHttpRequest – асинхронний обмін
  5. JavaScript – склеювання усього

ASP.NET AJAX – UpdatePanel (часткове оновлення сторінки)

  • Обов’язково на сторінці один <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();

9:37 02.02.2012

Збереження стану (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 – без обмежень).

Відновлення стану без ViewState (наприклад, для великих списків)

if (!IsPostBack)
    FillListBox();
else
{
    // відновлюємо вибране з Request.Form
    string[] selected = Request.Form.GetValues("ListBox1");
}

10:43 03.02.2012

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

9:41 06.02.2012

Перевірка підтримки 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 вимкнено
}

9:35 07.02.2012

Session (збереження стану на сервері)

  • При першому запиті створюється унікальний SessionID (42 байти в .NET 3.5).
  • Session – словник типу Session["key"] = value;
  • Доступний з будь-якої сторінки додатка.

Як передається SessionID

  1. Через cookie ASP.NET_SessionId (за замовчуванням)
  2. У 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 хвилин бездіяльності.

Ось продовження ваших конспектів у чистому та структурованому вигляді (укр. мова).

9:28 08.02.2012

Session – коли втрачається стан сеансу

Сесія втрачається у таких випадках:

  1. Користувач закриває та знову відкриває браузер (якщо SessionID у cookie).
  2. Користувач заходить з іншого браузера/комп’ютера.
  3. Простій більше timeout (за замовчуванням – 20 хвилин).
  4. Програмне завершення: Session.Abandon().
  5. Перезапуск додатка (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;

9:28 08.02.2012

Збереження даних у стані додатка (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++;
}

9:36 10.02.2012

Модель прив’язки даних в ASP.NET

Два типи прив’язки

Тип Синтаксис Коли виконується
Single-value (звичайна) <%# %> Тільки після виклику Page.DataBind() або control.DataBind()
Dollar-вирази (Expression Builder) <%$ %> Автоматично при завантаженні сторінки

Single-value прив’язка (<%# %>)

  • Не обчислюється автоматично!
  • Потрібно явно викликати 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()
}

Dollar-вирази (<%$ %>) – Expression Builders

Автоматично обчислюються при кожному запиті сторінки.

Вбудовані:

  • <%$ ConnectionStrings:MyConn %>
  • <%$ AppSettings:Version %>

Створення власного ExpressionBuilder (приклад: випадкове число)

  1. Клас:
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);
    }
}
  1. Реєстрація у web.config:
<compilation debug="false">
  <expressionBuilders>
    <add expressionPrefix="Random" type="RandomExpressionBuilder, App_Code" />
  </expressionBuilders>
</compilation>
  1. Використання:
<div>Випадкове число: <%$ Random:1,100 %></div>
<!-- При кожному оновленні сторінки – нове число -->

Repeated-value прив’язка (спискові контролі)

Властивість Призначення
DataSource Програмно задаємо джерело (List<T>, DataTable тощо)
DataSourceID Декларативно – ID контролу-джерела (<asp:SqlDataSource>, ObjectDataSource тощо)
DataTextField Поле для відображення (Text)
DataValueField Поле для значення (Value)
DataTextFormatString Форматування, напр. {0:dd.MM.yyyy}

Життєвий цикл сторінки з прив’язкою даних

  1. Створюється об’єкт Page
  2. InitLoad
  3. Події контролів
  4. Джерела даних виконують оновлення (Updating → Updated, Inserting → Inserted, Deleting → Deleted)
  5. PreRender
  6. Отримання даних: Selecting → Selected
  7. Побудова та відображення сторінки

10:21 16.02.2012

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment