Dawno temu opisałem w jaki sposób zintegrować Membershipa z własną bazą danych (tutaj). W tym artykule chciałbym skupić się na innym, bardzo ciekawym mechanizmie, a mianowicie na profilach.
Profile służą do przechowywania i przywracania ustawień użytkownika odwiedzającego aplikację. Ustawienia, które chcemy przechowywać, konfigurujemy w pliku konfiguracyjnym aplikacji (web.config) w sekcji profile. Kiedy aplikacja startuje oraz mechanizm profili jest włączony, ASP.NET buduje klasę ProfileCommon, która to dziedziczy po ProfileBase. Klasa ta zawiera wszystkie niezbędne mechanizmy do operacji na profilach użytkowników. Przejdźmy do praktyki.
W pierwszej kolejności dodajemy wymagane tabele do schematu własnej bazy. W tym celu otwieramy Visual Studio Command Prompt z prawami administratora i wpisujemy:
aspnet_regsql /S "localhost\sqlexpress" /E /A p /d ProfileSampleDB
Uzyskujemy oczekiwany efekt:
Następnie konfigurujemy profil w pliku web.config – odnajdujemy sekcję system.web i wpisujemy w niej ustawienia profilu. Przykład może wyglądać następująco:
<anonymousIdentification enabled="true" /> <profile defaultProvider="ProfileProvider" enabled="true" automaticSaveEnabled="true" inherits="ProfileSample.Classes.CustomProfile"> <providers> <clear /> <add name="ProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ProfileSample" applicationName="/" /> </providers> <properties> <add name="SampleText" type="string" defaultValue="abecadło" allowAnonymous="true" /> <add name="SampleInt" type="int" defaultValue="1" allowAnonymous="true" /> <add name="SampleList" type="System.Collections.Specialized.StringCollection" serializeAs="Xml" allowAnonymous="false" /> <add name="SampleClass" type="ProfileSample.Classes.MySampleClass" serializeAs="Xml" /> </properties> </profile>
Element anonymousIdentification jest odpowiedzialny za ustawienia identyfikacji anonimowych użytkowników aplikacji. Poniżej tego elementu znajduje się właściwa definicja profilu – w pierwszej kolejności dostawca (oczywiście można pokusić się o własną implementację), a następnie property z typami, które ma zawierać profil. Przykład zawiera elementy/property dla zalogowanych i anonimowych użytkowników, a więc koniecznością staje się włączenie mechanizmu identyfikacji anonimowych użytkowników.
Po wykonaniu powyższych operacji, w aplikacji mamy już dostęp do zadeklarowanych ustawień:
Można je pobrać w następujący sposób:
string text = HttpContext.Current.Profile["SampleText"].ToString(); //lub string text = (string)HttpContext.Current.Profile.GetPropertyValue("SampleText");
Powyższy przykład pokazuje jednak, że korzystanie z tego mechanizmu jest dość problematyczne i mało estetyczne. Spowodowane jest to brakiem dostępu do zadeklarowanych ustawień bezpośrednio w kodzie. Wyjściem z sytuacji jest utworzenie własnej klasy, która zawierać będzie property naszego profilu. Klasa ta dziedziczyć będzie po ProfileBase, aby dostępne były mechanizmy profilu. Należy ją wskazać w pliku web.config w elemencie profile w atrybucie inherits. Po zaimplementowaniu owej klasy, a w niej ustawień, koniecznością staje się wyrzucenie/zakomentowanie ustawień z pliku konfiguracyjnego aplikacji, ponieważ w przeciwnym wypadku dostaniemy wyjątek o ponownej deklaracji elementów profilu. Przykładowa implementacja może wyglądać następująco:
public class CustomProfile : ProfileBase { #region Static public static CustomProfile GetProfile() { return (CustomProfile)HttpContext.Current.Profile; } public static CustomProfile GetProfile(string userName) { return (CustomProfile)Create(userName); } #endregion #region Properties [SettingsAllowAnonymous(true)] public string SampleText { get { return base["SampleText"].ToString(); } set { base["SampleText"] = value; } } [SettingsAllowAnonymous(false)] public int SampleInt { get { return (int)GetPropertyValue("SampleInt"); } set { base["SampleInt"] = value; } } [SettingsAllowAnonymous(false)] public System.Collections.Specialized.StringCollection SampleList { get { return (System.Collections.Specialized.StringCollection)base["SampleList"]; } set { base["SampleList"] = value; } } [SettingsAllowAnonymous(false)] public MySampleClass SampleClass { get { return (MySampleClass)base["SampleClass"]; } set { base["SampleClass"] = value; } } #endregion }
A oto mały przykład wykorzystania:
CustomProfile.GetProfile().SampleText = "abecadło"; //CustomProfile.GetProfile().SampleInt = 2; //Error: This property cannot be set for anonymous users. string text = HttpContext.Current.Profile["SampleText"].ToString(); text = CustomProfile.GetProfile().SampleText; text = (HttpContext.Current.Profile as CustomProfile).SampleText; text = CustomProfile.GetProfile().SampleClass.DateTimeValue.ToShortDateString();
Możliwości implementacji tej klasy jest naprawdę wiele, a co za tym idzie – to indywidualna kwestia doboru rozwiązania. Artykuł prezentuje tylko podstawy działania mechanizmu profili w ASP.NET i tym samym zachęca do korzystania z tegoż dobrodziejstwa.
Dzięki! Trick z własną klasą pewnie mi się to przyda.