Нове в 2
Завжди приємно коли тебе пам'ятають. Особливо коли пам'ятають не тільки тебе, а й твої смаки і переваги, розумієш, що ти не просто один з багатьох. У таке місце завжди хочеться повернутися.
Однак це завдання не з легких. Уявіть, що ви - продавець великого магазину, в якому щодня буває не одна сотня покупців, а що якщо ви - сайт, який щодня переглядають десятки тисяч відвідувачів? Адже треба не просто запам'ятати кожного, але ще і зберегти все це, поки він не зволить зайти до вас ще раз, щоб ви змогли продемонструвати йому свою феноменальну пам'ять. А що якщо за цей час його смаки змінилися і доведеться все запам'ятовувати заново, проблеми ростуть як сніжний ком. Щоб автоматизувати завдання буде потрібно не одна таблиця в базі даних, безліч запитів до них, та ще й купа коду, щоб зв'язати все воєдино. Ну і тестування, тестування, тестування. Задумаєшся, а чи варта шкурка вичинки? Однак не все так погано, з виходом ASP.NET 2.0 всі проблеми відходять на другий план, тому що тепер він містить нову вбудовану можливість - профіль (Profile) користувача.
Профіль користувача
* Строго типізований доступ до елементів колекції: на відміну від колекцій типу Application, Session, Context, Cache, та й усіх інших колекцій, які перейшли у спадок від ASP.NET 1.x, які здійснювали доступ до значень своїх елементів по ключу, профіль користувача - клас HttpProfile - використовує строго типізовані іменовані властивості, працювати з якими набагато зручніше. Запам'ятовувати назви і типи властивостей більше не потрібно, тепер це доля Intellisense, який справляється з цим набагато краще. Інший корисний ефект - перевірка типів на етапі компіляції. Наприклад, наступний фрагмент коду демонструє два варіанти отримання дати останньої активності користувача:
o старий, з використанням сесії:
DateTime LastLogin = (DateTime) Session [ "LastLogin"];
o новий, із залученням сервісу персоналізації:
DateTime LastLogin = Profile.LastLogin;
Зауважте, що в другому випадку приведення типів не треба було, оскільки дата вже зберігається як дата, а не упаковується в object.
* Вибірка даних зі сховища проводиться тільки при необхідності. На відміну від класу Session дані витягуються ні до кожному запиті сторінки, займаючи ресурси сервера, а тільки тоді, коли в них дійсно є потреба.
* Час зберігання даних не обмежена. На відміну від всіх інших колекцій, час життя збережених даних в профілі нескінченно і ніяк не залежить ні від програми, ні від поточної сесії. Фактично дані будуть зберігатися вічно, якщо сховище досить надійно і Ви самі не вирішите їх одного разу видалити звідти.
* Дані можуть зберігатися як для відомих (зареєстрованих і пройшли аутентифікацію в системі), так і для невідомих (анонімних, тобто ще не зареєстровані або просто не увійшли в систему) відвідувачів сайту.
* Доступ до атрибутів профілю здійснюється так само просто, як і при роботі з колекцією Session. Це можливо завдяки новому властивості Profile, доступному в усіх похідних від System.Web.UI.Control класах додатки. Або у всіх класах додатки через контекст веб-додатки, використовуючи наступний синтаксис: System.Web.HttpContext.Current.Profile або ((ProfileCommon) System.Web.HttpContext.Current.Profile) .MessagesPosted якщо потрібен доступ до своїми властивостями профілю. ProfileCommon - це спеціальний клас, автоматично створюваний компілятором при включеному профілі і містить всі призначені для користувача властивості, додані через web.config.
* Місце для даних розширюваність і може бути будь-яким. За замовчуванням в поставку ASP.NET 2.0 входить один провайдер для профілю користувача - провайдер для Microsoft SQL Server. Але можливо і створення свого власного провайдера даних. Для цього пропонується нова модель реалізації провайдерів. Вона має на увазі виділення з програмного інтерфейсу сховища рівня роботи з даними. Так досягається можливість прозорого доступу до будь-яких даних, незалежно від типу фізичного сховища - це може бути база даних і файл на жорсткому диску або навіть виділений сервер даних. Подібна архітектура провайдера даних використовується і в інших сервісах ASP.NET 2.0. Пізніше ми розглянемо приклад створення власного провайдера даних і побачимо, наскільки це просто. Провайдер даних може бути заданий статично в файлі конфігурації програми або динамічно призначений в режимі виконання.
Давайте розглянемо, як можна почати використовувати профіль. Отже, профіль зберігає дані про конкретного користувача вашого сайту і дозволяє потім ці отримувати. За замовчуванням всі ці дані будуть зберігатися в таблицях бази даних SQL Server Express. Рядок з'єднання за замовчуванням називається "LocalSqlServer" і задана вона в глобальному файлі налаштувань machine.config. Ось як вона виглядає:
тобто база даних буде працювати в режимі User Instance, назва файлу бази даних ASPNETDB.MDF і при першій спробі збереження профілю база даних буде автоматично створена в папці App_Data кореневій директорії сайту.
Відмінно, виявляється все вже налаштовано, все що нам залишається зробити - це описати потрібні нам поля профілю в файлі конфігурації програми web.config. Налаштуємо профіль на зберігання імені та прізвища користувача, а також лічильника його відвідувань нашого сайту:
За замовчуванням тип параметра профілю - це System.String, тому, для того, щоб зберігати кількість відвідувань сайту як число, нам необхідно явно задати його тип. Також параметр може мати значення за замовчуванням (в нашому випадку це 1). Якщо провайдер даних не виявить значення параметра в сховище даних, то буде повернуто значення параметра за замовчуванням.
Після того як профіль налаштований, використовувати його дуже просто. Наведений нижче код відображає дані з профілю поточного користувача і оновлює їх при натисканні на кнопку. Зауважте, ніякого додаткового коду для збереження цих відомостей деінде в базі даних або отримання їх звідти писати не потрібно, про це подбає інфраструктура ASP.NET.
Розширення профілю користувача
Профіль містить наступні базові параметри: