Профіль користувача, ASP.NET, ASP, статті

Сервіс персоналізації (personalization) – це нова можливість у ASP.NET, яка застосовувалася ще в продукті Site Server. Даний сервіс надає готове рішення для зберігання персональних даних, безпосередньо характеризують користувача сайту, так званого профілю користувача (Profile). Ось кілька прикладів подібних даних – це ім’я, прізвище, адреса електронної пошти користувача, його тимчасова зона, а також “кошик покупця” для користувача сайту електронної комерції або інформація про належність відвідувача сайту тим чи іншим групам користувачів. Зараз такі параметри зазвичай зберігають у сесії (Session), в файлах cookie, базах даних і так далі. Незалежно від місця їх зберігання, ASP.NET 1.x мало допомагає в цьому випадку. Доводиться своїми силами розробляти і налаштовувати всю інфраструктуру під відповідне сховище. Також самостійно необхідно отримувати ці дані і зберігати їх. Колекція Session полегшує життя, але вона ненадійна, а зберігання її в окремому процесі або в базі даних приводило до високих витрат ресурсів сервера і збільшення часу відгуку програми. По суті, сервіс персоналізації – це колекція, дуже схожа на сесію за своєю суттю. Так само, як і сесія, профіль користувача відноситься до одного конкретного відвідувачу сайту і забезпечує зберігання інформації, що відноситься безпосередньо до нього. Проте є і значні відмінності, вигідно характеризують новий сервіс, серед них:

Давайте розглянемо, як можна почати використовувати профіль. Отже, профіль зберігає дані про конкретного користувача вашого сайту і дозволяє потім ці отримувати. За замовчуванням всі ці дані будуть зберігатися в таблицях бази даних SQL Server Express. Рядок з’єднання за умовчанням називається “LocalSqlServer” і задана вона в глобальному файлі налаштувань machine.config. Ось як вона виглядає:

            
<add name="LocalSqlServer" connectionString="data source=.SQLEXpreSS; Integrated
          Security=SSPI; AttachDBFilename=|DataDirectory|aspnetdb.mdf; User Instance=true" providerName="System.Data.SqlClient" />
		

тобто база даних буде працювати в режимі User Instance, назва файлу бази даних ASPNETDB.MDF і при першій спробі збереження профілю база даних буде автоматично створена в підпапці App_Data кореневої директорії сайту.

Відмінно, виявляється все вже налаштовано, все що нам залишається зробити – Це описати потрібні нам поля профілю в файлі конфігурації програми web.config. Налаштуємо профіль на зберігання імені та прізвища користувача, а також лічильника його відвідувань нашого сайту:

<configuration> 
 <system.web> 
  <anonymousIdentification enabled="true"/> 
  <profile> 
   <properties> 
    <add name="FirstName" allowAnonymous="true" /> 
    <add name="LastName" allowAnonymous="true" /> 
    <add name="Visits" allowAnonymous="true" type="System.Int32" defaultValue="1" /> 
   </properties> 
  </profile> 
 </system.web> 
</configuration> 

За замовчуванням тип параметра профілю – це System.String, тому, для того, щоб зберігати кількість відвідувань сайту як число, нам необхідно явно задати його тип. Також параметр може мати значення за замовчуванням (в нашому випадку це 1). Якщо провайдер даних не виявить значення параметра в сховище даних, то буде повернуто значення параметра по замовчуванням.

Після того як профіль налаштований, використовувати його дуже просто. Наведений нижче код відображає дані з профілю поточного користувача і оновлює їх при натисканні на кнопку. Зауважте, ніякого додаткового коду для збереження цих відомостей будь-де в базі даних або отримання їх звідти писати не потрібно, про це подбає інфраструктура ASP.NET.

<%@ Page Language="C#" %>
<html>
   <head>
    <script runat="server">
      protected override void OnLoad(EventArgs e)
      {
        if (!IsPostBack)
        {
          tbFirstName.Text = Profile.FirstName;
          tbLastName.Text = Profile.LastName;
                 lblVisits.Text = Profile.Visits.ToString();
        }
      }
      protected void Update(object s, EventArgs e)
      {
        Profile.FirstName = tbFirstName.Text;
        Profile.LastName = tbLastName.Text;
        Profile.Visits += 1;
      }
    </script>
  </head>
  <body> Ім'я:  
Прізвище:
Кількість відвідувань:
<asp:Button runat="server" ID="updateProfileButton" Text="Update profile" OnClick="Update" /> </body > </html>

Розширення профілю користувача

Профіль містить такі базові параметри:

Назва Тип Опис
UserName String Ім’я користувача
IsAnonymous Boolean Має значення “Брехня”, якщо це профіль зареєстрованого користувача і “Істина” в разі анонімного користувача, має сенс тільки в тому випадку, якщо включений профіль для анонімних користувачів
IsDirty Boolean Показує, чи є в профілі змінені, але ще не збережені в сховищі дані
LastActivityDate DateTime Дата останньої активності користувача в системі (в даному випадку це останнє збереження або отримання властивостей профілю), в UTC
LastUpdatedDate DateTime Дата останнього збереження профілю, в UTC

Для розширення класу Profile використовується елемент розділу елемента файлу конфігурації програми – web.config. За допомогою цього елемента ми можемо додавати нові властивості до класу Profile. При компіляції сторінки ASP.NET замінить клас Profile, генерований за замовчуванням, класом побудованим на підставі властивостей, заданих в розділі елемента . Все це відбудеться автоматично, без нашої участі. Підтримка нових властивостей IntelliSense-му в Visual Studio починається зі збереження конфігураційного файлу.

Найбільш простий варіант використання елемента – це визначення нового властивості індивідуалізації з єдиним атрибутом –
name:

<profile> 
    <properties> 
        <add name="Nickname" /> 
    </properties> 
</profile> 

В даному випадку інфраструктура ASP.NET створить властивість з назвою Nickname, що має тип даних за замовчуванням – String, недоступне для нерозпізнаних користувачів і використовує для роботи з сховищем даних провайдер за замовчуванням (це провайдер для роботи з базою даних SQL Server). До речі, імена нових властивостей можливо задавати і російською мовою, а ось прогалини в них не допускаються.

<profile> 
    <properties>   
    </properties>
</profile> 

Список атрибутів, доступних в теге :

Елемент Тип Опис
allowAnonymous Boolean При установці в true дозволяє нерозпізнаних користувачам зберігати дані в системі індівідалізаціі. При цьому мається на увазі, що для сайту включена можливість ідентифікації анонімних користувачів, тобто в конфігураційному файлі присутній елемент . Значенням по замовчуванням даного атрибута є false.
defaultValue String Значення властивості за замовчуванням. Наприклад, для сайту може бути задана тема.
name String Назва властивості. Використовується як ключ для доступу до значенням властивості, а також з’являється як назва відкритого властивості класу Profile. Є обов’язковим при додаванні нового властивості.
provider String Назва провайдера, використовуваного системою індивідуалізації для взаємодії зі сховищем даних. Якщо не задано явно, то використовується значення за замовчуванням з файлу machine.config.
readOnly Boolean Служить для вказівки того, що властивість є властивістю тільки для читання. Значення за замовчуванням – false.
serializeAs String Визначає метод сериализации даних. Можливі наступні значення:

  • String: значення буде серіалізовать як рядок.
  • Xml: дані серіалізуются в XML, необхідно врахувати, що будуть серіалізовать тільки відкриті (public) поля класу;
  • Binary: двійкова сериализация, найбільш «глибокий» метод – Сериализации піддаються всі поля класу, проте він і найбільш «дорогою», з точки зору споживаних ресурсів. Тип параметра повинен бути серіалізуемим;
  • ProviderSpecific: формат даних на розсуд провайдера даних. Дозволяє постачальнику даних самому визначати формат зберігання даних. Є значенням за замовчуванням.
type String Тип даних зберігається властивості. За замовчуванням використовується тип String, але можна поставити будь-який інший тип (для типу серіаліазаціі Binary можна задавати тільки серіалізуемим тип, то є тип, позначений атрибутом Serializable, а для типу серіаліазаціі String клас повинен мати свого спадкоємця класу TypeConverter). В останньому випадку необхідно вказати повне назва класу, включаючи простір імен.

Нижче наведено найпростіший варіант реалізації власного класу, який задовольняє всім умовам профілю і може бути серіалізовать усіма можливими способами:

using System;
using System.ComponentModel;
using System.Xml.Serialization;
[TypeConverter(typeof(AddressTypeConverter))]
[Serializable]   
public class Address  
{  
    string _country;
    string _city;
    string _street;
    int _building;
    int _room;
    [XmlAttribute]
    public string Country
    {
      get { return _country; }
      set { _country = value; }
    }
    [XmlAttribute]
    public string City
    {
      get { return _city; }
      set { _city = value; }
    }
    [XmlAttribute]
    public string Street
    {
      get { return _street; }
      set { _street = value; }
    }
    [XmlAttribute]
    public int Building
    {
      get { return _building; }
      set { _building = value; }
    }
    [XmlAttribute]
    public int Room
    {
      get { return _room; }
      set { _room = value; }
    }
}

Реалізація класу – спадкоємця TypeConverter, що дозволяє серіалізовать наш клас, як рядок:

using System;
using System.ComponentModel;
using System.Globalization;
public class AddressTypeConverter : TypeConverter
{
    public override bool CanConvertFrom(ITypeDescriptorContext context,
     Type sourceType)
     {
      if (sourceType == typeof(string))
      {
        return true;
      }
      return base.CanConvertFrom(context, sourceType);
    }
    public override object ConvertFrom(ITypeDescriptorContext context,
      CultureInfo culture, object value)
    {
      if (value is string)
      {
        string[] v = ((string)value).Split(new char[] { "|" });
        Address address = new Address();
        address.Country = v[0];
        address.City = v[1];
        address.Street = v[2];
        address.Building = Convert.ToInt32(v[3]);
        address.Room = Convert.ToInt32(v[4]);
        return address;
      }
      return base.ConvertFrom(context, culture, value);
    }
    public override object ConvertTo(ITypeDescriptorContext context,
      CultureInfo culture, object value, Type destinationType)
    {
      if (destinationType == typeof(string))
      {
        Address address = (Address)value;
        return address.Country
          + "|" + address.City
          + "|" + address.Street
          + "|" + address.Building
          + "|" + address.Room;
      }
      return base.ConvertTo(context, culture, value, destinationType);
    }
} 

Зберігання даних Generic-типів

Для опису подібних даних як властивостей профілю використовується спеціальний синтаксис. Розглянемо приклад – як властивості профілю користувача нам потрібно зберігати властивість з назвою Ints має тип даних System.Collections.Generic.List . В даному випадку відповідний параметр у файлі Web.config повинен виглядати так:

        <add name="Ints" type="System.Collections.Generic.List`1[[System.Int32]]" /> 
    

Тобто спочатку вказується повний тип класу – колекції, потім кількість параметрів з префіксом апостроф (‘1), а потім у квадратних дужках йде список типів, кожен з яких також обрамляється квадратними дужками. Для типу даних
System.Collections.Generic.Dictionary<System.String, System.Double> запис в конфіги буде виглядати як

        <add name="Registry" type="System.Collections.Generic.List`2[[System.String],[System.Double]]" /> 

Ідентифікація анонімних користувачів

Даний код буде зберігати налаштування будь-якого користувача, навіть “Анонімного”, тобто незареєстрованої або просто ще не виконав вхід в систему. За замовчуванням профіль зберігається тільки для аутентіфіцированний користувачів. Для того, щоб він почав працювати і для анонімних користувачів необхідно включити модуль розпізнавання анонімних користувачів. За це відповідає розділ Файлу налаштувань web.config. Також необхідно для кожного параметра профілю, який повинен зберігатися і для анонімних користувачів, встановити атрибут allowAnonymous в значення “true” (за замовчуванням значення цього атрибута – брехня). Якщо цього не зробити, то при кожній спробі встановити таку властивість для анонімного користувача буде генеруватися виняток. Рекомендується розумно підходити до даного питання і не перевантажувати профіль анонімного користувача марними для нього властивостями.

Включення розпізнавання анонімних користувачів призводить до того, чnо в ланцюжок обробки вхідного запиту додається ще один модуль – AnonymousIdentificationModule. Працює він таким чином – при надходження запиту від анонімного користувача модуль створює глобально унікальний ідентифікатор (System.Guid) і записує його в постійно зберігається файл cookie з ім’ям за умовчанням. ASPXANONYMOUS. З цього моменту цей Guid і буде тимчасовим ім’ям користувача. Оскільки файл cookie створюється постійний, то система зможе “впізнавати” користувача при кожному його подальшому відвідуванні сайту. Всі параметри модуля настроюється і можуть бути змінені у файлі конфігурації, в розділі анонімної ідентифікації.

Навіщо це потрібно? Припустимо ви створюєте електронний магазин відвідуючи який користувач може сформувати корзину цікавлять його товарів не реєструючись на сайті і не проходячи авторизації. Потім він дивиться у що йому обійдуться його покупки і, якщо сума його влаштовує, входить до систему і завершує оформлення замовлення. При цьому він може відкласти покупку на тиждень або на місяць, весь цей час кошик буде акуратно зберігати всі обрані ним минулого разу товари, незважаючи на те що він навіть не був зареєстрований на сайті. Для “міграції” користувача з анонімного профілю на профіль зареєстрованого користувача в профілі передбачено спеціальне подія – MigrateAnonymous. Воно відбувається в той момент, коли анонімний користувач виконує вхід на сайт. Це подія може бути оброблено в файлі Global.asax за допомогою наступного коду:

void Profile_MigrateAnonymous(object sender, ProfileMigrateEventArgs e)
{ / / Отримуємо профіль анонімного користувача за його ID
   ProfileCommon anonymous = Profile.GetProfile(e.AnonymousID); / / Переносимо дані в профіль поточного зареєстр. користувача
  //if( !isMigrated )
   //{
   Profile.FirstName = anonymous.FirstName;
   Profile.LastName = anonymous.LastName;
   Profile.SiteLook.MasterPage = anonymous.SiteLook.MasterPage;
   Profile.SiteLook.Theme = anonymous.SiteLook.Theme;
   //} / / Стираємо cookie ". ASPXANONYMOUS" з анонімним ідентифікатором
   AnonymousIdentificationModule.ClearAnonymousIdentifier();
}

Особливо важливо виконати видалення cookie з ідентифікатором анонімного користувача. В іншому випадку модуль буде викликати цю подію при кожному новому запиті користувача до сайту.

Слід також врахувати, що подія MigrateAnonymous викликається кожен раз коли користувач авторизується в системі, навіть якщо профіль користувача вже був один раз мігрувати. Тому має сенс додати в профіль ще один параметр “isMigrated” типу System.Boolean, який би мав значенням за замовчуванням брехня, а після міграції виставлявся б у істину. Таким чином міграцію слід було б проводити тільки якщо цей параметр має значення за замовчуванням (тобто профіль ще жодного разу не був мігрував).

Групування параметрів профілю

При великій кількості параметрів допускається їх об’єднання в логічні підгрупи. Це робиться за допомогою елемента , що має єдиний атрибут name, який є обов’язковим і повинен мати значення, унікальне в рамках програми. Розглянемо інший приклад завдання профілю:

<profile>
 <properties>
  <add name="FirstName" allowAnonymous="true" />
  <add name="LastName" allowAnonymous="true" />
  <group name="SiteLook" >
   <add name="Theme" defaultValue="Orange" />
   <add name="MasterPage" defaultValue="Basic.master" />
  </group>
 </properties>
</profile>

Тут параметри, що мають відношення до зовнішнього вигляду сайту, об’єднані в одну групу із загальною назвою SiteLook. Кількість груп не обмежена, однак вкладення груп не допускається. Об’єднання параметрів до групи додає додатковий рівень і в коді, звернення до властивостями групи в нашому випадку буде виглядати так:

Profile.FirstName = "test";
Profile.SiteLook.MasterPage = "Extreme.master";
Profile.SiteLook.Theme = "Yellow";

Робота з профілем довільного користувача

До сих пір ми працювали тільки з профілем поточного користувача, проте в ряді випадків буває необхідно отримати профіль іншого користувача. Це з легкістю може бути виконано за допомогою методу GetProfile () класу HttpProfile, достатньо лише передати йому ім’я користувача, профіль якого ми б хотіли отримати. Даний метод повертає новий екземпляр класу HttpProfile, з яким можна працювати так само, як і з профілем поточного користувача. Можливо також і зміна властивостей профілю, отриманого таким чином. Проте, в цьому випадку, автоматичного збереження змін не відбудеться. Для того щоб зміни вступили в силу, необхідно буде примусово викликати метод Save () змінюваного профілю. При використанні профілю поточного користувача у веб-додатку не потрібно викликати цей метод для збереження профілю, оскільки він викликається автоматично модулем профілю при спрацьовуванні події EndRequest.

ProfileCommon profile = Profile.GetProfile("Nisus"  );
profile.FirstName = "SeaEagle";
profile.Save(); 

Отримати профілі всіх користувачів сайту також не складе великих праці:

public List<ProfileCommon> GetProfiles() 
{ 
  List<ProfileCommon> profiles = new List<ProfileCommon>(); 
  ProfileInfoCollection profilesInfos = ProfileManager.GetAllProfiles( 
    ProfileAuthenticationOption.All 
    ); 
  foreach (ProfileInfo profileInfo in profilesInfos) 
  { 
    profiles.Add(Profile.GetProfile(profileInfo.UserName)); 
  } 
  return profiles; 
}
        

Перерахування ProfileAuthenticationOption, визначене в просторі імен System.Web.Profile включає три елементи:

Доступ до профілю із зовнішніх компонент

Можливо вам буде потрібно доступ до профілю користувача з зовнішніх компонент, наприклад з шару роботи з даними. Якщо просто написати Profile, як ми це робили на сторінці aspx, то код не буде компілюватися, оскільки в зовнішньому додатку ASP.NET не буде створювати ні клас ProfileCommon, ні вже тим більше властивість Profile. Тим Проте така можливість є – доступ до профілю можна отримати через властивість Profile контексту запиту (HttpContext). Контекст – це об’єкт, який містить всі відомості про поточний запиті, відомі ASP.NET. Одне з нових властивостей контексту в ASP.NET 2.0 – це властивість Profile, містить посилання на профіль поточного користувача.

System.Web.HttpContext context = System.Web.HttpContext.Current;
context.Profile["FirstName"] = "Adam";
context.Profile.Save(); 

Іншим, більш зручним для використання варіантом, є створення класу – спадкоємця від класу ProfileBase. Додамо в папку App_Code новий клас, що описує потрібний нам профіль:
 

using System;
using System.Web.Profile;
using System.Collections.Generic;
public class CustomProfile : ProfileBase
{
  [SettingsAllowAnonymous(true)]
   public string FirstName
  {
    get { return base["FirstName"] as string; }
     set { base["FirstName"] = value; }
  }
 
  [SettingsAllowAnonymous(true)]
  public string LastName
  {
     get { return (string)base["LastName"]; }
     set { base["LastName"] = value; }
  }
}

Даний клас є спадкоємцем класу ProfileBase і лише трохи розширює його, описуючи потрібні нам властивості. Всю остальнию чорнову роботу по спілкуванню з провайдером для отримання та збереження значень наших властивостей виполянет базовий клас. Щоб вказати інфраструктурі що в якості базового класу для профілю слід використовувати наш клас змінимо опис профілю в файлі конфігурації, плюс додамо нове властивість – телефон:

<profile inherits="CustomProfile" >
 <properties>
  <add name="Phone" allowAnonymous="true" serializeAs="ProviderSpecific" />
 </properties>
</profile> 

Тепер як і раніше ми зможемо безперешкодно отримувати доступ до властивостями профілю на стрніци нашого сайту:

Profile.FirstName = "John";
Profile.LastName = "Smith";
    

А якщо ми винесемо цей клас в окрему збірку, то зможемо використовувати його в будь-якому проекті використовуючи явне приведення типів:

System.Web.HttpContext context = System.Web.HttpContext.Current;
string firstName = ((CustomProfile)context.Profile).FirstName; 

Мінус такого підходу в тому, що втрачається перевага гнучкої налаштування всіх властивостей профілю через зміну схеми у файлі налаштувань (Базові властивості, захисту в код класу без перекомпіляції змінити вже не вдасться), а плюсом є те, що тепер стає можливим додавання додаткової логіки до об’єкта профілю. Наприклад ми зможемо перевіряти, що ім’я користувача складається тільки з букв.

Управління профілями

Для керування профілями існує спеціальний клас, ProfileManager. В ньому визначено ряд статичних методів, що дозволяють виробляти різноманітні допоміжні операції. Наприклад, видалення невикористовуваних профілів. Видалення зайвих профілів відіграє дуже важливу роль, оскільки при активній роботі сайту кількість збережених профілів буде рости дуже швидко, особливо якщо використовуються профілі для анонімних профілів. Автоматично очищення сховища даних від неактивних профілів не виробляється, ви повинні реалізувати її самостійно. Наприклад можна виконувати очистку при кожному старті програми

void Application_Start(object sender, EventArgs e)
{
  ProfileManager.DeleteInactiveProfiles(
    ProfileAuthenticationOption.Anonymous, DateTime.Now.AddMonths (-2) / / Видалимо всі профілі старше 2-х місяців
  );
}

Також даний клас надає ряд методів для отримання звітів, наприклад метод GetAllProfiles, що дозволяє отримувати список всіх зберігаються профілів посторінково.

Налаштування сховища даних

Microsoft SQL Server

Давайте розглянемо процес створення сховища даних, відмінного від сховища даних за замовчуванням, настройки якого знаходяться у файлі глобальної конфігурації. NET – machine.config.

Щоб створити нове сховище нам потрібно створити базу даних. Робиться це дуже просто за допомогою утиліти aspnet_regsql, яка поставляється в складі. NET Framework 2.0 і, відповідно, знаходиться в папці “C: WINDOWSMicrosoft.NETFrameworkv2.0.50727”. Утиліта працює в двох режимах – в режимі майстра і в режимі командного рядка. Щоб використовувати її в графічному режимі майстра достатньо просто запустити її на виконання або викликати з параметром “-W”. Режим майстра вельми бідний і виконує лише примітивні загальні функції – виконує в базі даних скрипти для створення або видалення всіх нових можливостей, що надаються інфраструктурою ASP.NET (серед них Membership, Role manager, Profile, Personalization, і т.д.). Режим командного рядка дозволяє управляти підтримкою всіх потрібних Вам можливостей. Скористаємося утилітою в режимі графічного інтерфейсу для створення нової бази даних і установки в неї всіх нових можливостей, що надаються ASP.NET. Дана утиліта дозволяє працювати як з новою версією – SQL Server 2005, так і з попередньою версією 2000, також підтримується SQL Server Express Edition (SSE).

Перші два вікна майстра залишаємо без змін, а в третьому нам пропонують вказати назву інстанси SQL Server-а. Далі залишаємо тип аутентифікації в режимі за замовчуванням – Windows і наібіваем в поле вибору бази даних ім’я бажаної нової бази даних – “MyOwnAspnetDB”.

Далі натискаємо два рази кнопку Next і, при невеликій частці везіння, отримуємо повідомлення про те, що скрипти були успішно інстальовані. Залишається тільки скопіювати нову базу даних з папки Data сервера (для SSE її розташування можна дізнатися в реєстрі – гілка
HKEY_LOCAL_MACHINESOFTWAREMicrosoftMicrosoft SQL ServerSQLEXpreSSSetup) в папку App_Data потрібного вам проекту, щоб почати її використовувати в режимі UserInstanse при використанні SSE чи просто вказати коректну рядок підключення в разі використання SQL Server повних редакцій.

Microsoft Access

Щоб використовувати Access в якості сховища даних доведеться скачати

Sample Access Provider Starter Kit з сайту

msdn.microsoft.com/vstudio/downloads/starterkits/. Потім його потрібно буде скомпілювати за допомогою студії або C # Developer Express, отримавши в підсумку ASP.NET Access Providers.dll і файл бази даних ASPNetDB.mdb, який слід покласти в подпаку App_Data свого сайту, а dll-ку провайдера соотвественно в підпапку bin кореневої директорії сайту (якщо у вас немає такої папки створіть її).

Власний провайдер даних

Можливо також використання будь-якого іншого сховища даних, проте в цьому випадку доведеться самостійно його реалізувати. Завдання це в більшості випадків буде нескладною, але в цій статті вона не розглядається.

Налаштування сервісу на роботу з певним сховищем даних.

Спочатку сервіс уже налаштований на роботу з SSE в режимі UserInstance. Налаштування ці задані в глобальному файлі конфігурації machine.config (C: WINDOWSMicrosoft.NETFrameworkv2.0.50727CONFIGmachine.config) і можуть бути перевизначені в файлі налаштувань сайту web.config. Ось як виглядають відповідні налаштування, задані за замовчуванням:

<connectionStrings>
  <add name="LocalSqlServer" connectionString="data source=.SQLEXpreSS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient" />
</connectionStrings>
<system.web>
  <profile>
    <providers>
      <add name="AspNetSqlProfileProvider" connectionStringName="LocalSqlServer" applicationName="/" type="System.Web.Profile.SqlProfileProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    </providers>
  </profile>
</system.web>
            

Тобто сервіс налаштований на використання SSE провайдера, і вважається, що база даних повинна називатися “aspnetdb.mdf” і розташована вона повинна бути в папці даних ASP.NET (це підпапка App_Data кореневої директорії сайту). Якщо провайдер виявляє, що подібна база даних не створена, то він створює її і всі необхідні для роботи об’єкти при першому зверненні.

Використання режиму User Instance надзвичайно зручно при розробці і тестуванні програми, однак навряд чи можна застосувати при релізной роботі сайту, тому будьте готові до того, що при виставленні додатки на бойової сервер доведеться аттачі базу даних до інстанси SQL Server і модифікації рядка з’єднання.

Отже, щоб додаток змогло використовувати сервіс профілю з провайдером даних SSE можна нічого не змінювати у файлі web.config, проте краще продублювати налаштування з глобального файлу конфігурації, відповідно Web.config повинен буде виглядати приблизно от так:

<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
  <connectionStrings>
	<remove name="LocalSqlServer"/>
	<add name="LocalSqlServer" connectionString="Data Source=.SQLExpress;Integrated Security=True;AttachDBFilename=|DataDirectory|aspnetdb.mdf"/>
  </connectionStrings>
  <system.web>
	<profile defaultProvider="AspNetSqlProfileProvider">
	  <properties />
	</profile>
  </system.web>
</configuration>
        

У разі використання

Sample Access Provider Starter Kit файл настройок кілька ускладниться, за рахунок необхідності опису нового провайдера:

<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
	<connectionStrings>
		<add name="AccessFileName" connectionString="~/App_Data/ASPNetDB.mdb" providerName="System.Data.OleDb"/>
	</connectionStrings>
	<system.web>
		<profile enabled="true" defaultProvider="AccessProfileProvider">
			<providers>
				<add name="AccessProfileProvider" type="Samples.AccessProviders.AccessProfileProvider, ASP.NET Access Providers" connectionStringName="AccessFileName" applicationName="SampleSite" description="Stores and retrieves profile data from an ASP.NET_Access_Providers database."/>
			</providers>
			<properties />
		</profile>
		<anonymousIdentification enabled="true" cookieName=".ASPXANONYMOUS" cookieTimeout="100000" cookiePath="/" cookieRequireSSL="false" cookieSlidingExpiration="true" cookieProtection="None" domain=""/>
		<compilation debug="true"/>
	</system.web>
</configuration>

Де “ASP.NET Access Providers” в рядку
type="Samples.AccessProviders.AccessProfileProvider, ASP.NET Access Providers “- це назва збірки (ASP.NET Access Providers.dll у вас може мати іншу назву), яка виходить в результаті компіляції проекту Sample Access Provider Starter Kit і яку слід покласти в підпапку bin кореневої папки вашого сайту. Також потрібно не забути скопіювати файл ASPNetDB.mdb з папки bin проекту провайдера Access в папку App_Data вашого проекту.

Висновок

Дана можливість введена для того, щоб скоротити написання коду для найбільш поширених і общеупотребимих сценаріїв, і вона безсумнівно полегшить життя програмістам, що створює веб-сайти. Все те, що раніше доводилося робити вручну, тепер реалізовано і налагоджено самими творцями ASP.NET. Для використання всіх цих благ не потрібно писати жодного рядка коду – все, що потрібно для початку використання цієї можливість – це описати профіль користувача в файлі конфігурації у вигляді xml-схеми. Далі можна буде присвоювати значення властивостям, і зчитувати їх, не піклуючись про взаємодію з сховищем даних. Всю турботу про це бере на себе інфраструктура ASP.NET. Для вже існуючих складних комплексних рішень, які потрібно безболісно перенести на нову платформу, залишена можливість реалізувати роботу зі сховищем вручну.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*