16 февраля 2011 г.

ASP.NET работа с профилем пользователя

Если в своём проекте на ASP.NET вы используете стандартную систему авторизации пользователей, то, возможно, вам требуется поддержка профилей для пользователей. В профиле можно указывать дополнительную информацию, например, номер ICQ или адрес сайта.

Получить доступ к значению любого свойства профиля можно по его имени:

ProfileBase pb = ProfileBase.Create(User.Identity.Name);
string FirstName = pb.GetPropertyValue("FirstName").ToString();

В первой строке создается объект профиля ProfileBase для текущего авторизованного пользователя. А во второй происходит доступ к значению этого свойства. Обратите внимание, что любое значение профиля имеет тип object, поэтому требуется явное приведение типа. Но в данном случае для получения строки можно воспользоваться методом ToString(), который предопределен для любого объекта по умолчанию.

Пример изменения значения одного из параметров профиля:

pb.SetPropertyValue("FirstName", FirstName);

Здесь, разумеется, никакого приведения не нужно, т.к. любой тип в .NET наследуется от object.

Теперь немного о конфигурировании. Для поддержки профилей в основном файле web.config должна быть следующая секция:

    <profile defaultProvider="AspNetSqlProfileProvider">
      <properties>
        <add name="Phone" />
        <add name="FirstName" />
        <add name="SubwayStation" />
      </properties>
      <providers>
        <clear/>
        <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/"/>
      </providers>
    </profile>

Сведения о полях, которые должен поддерживать профиль, содержатся внутри тэга <properties>. Чаще всего бывает достаточно указать только имя свойства. По умолчанию свойство сохраняется в БД в виде строки и имеет тип string.

Физически профили хранятся в БД в таблице aspnet_Profile. Все свойства профиля для одного пользователя хранятся в одной строке этой таблицы. Можно их хранить как в бинарном, так и в текстовом виде. Также большую часть объектов можно хранить в формате xml, например, тип DateTime.

Вот как следует конфигурировать свойство, чтобы хранить его в бинарном виде:

<add name="Phone" serializeAs="Binary" />

А вот как сохранить другой тип в формате xml:

<add name="BirthDate" type="DateTime" serializeAs="Xml" />

В таблице aspnet_Profile есть только два поля, которые непосредственно хранят значения свойств. Это PropertyValuesString и PropertyValuesBinary. В каждом из этих полей соответствующие данные профиля хранятся вместе. Для отделения одного значения от другого, а также указания имени свойства и в каком из двух полей оно хранится, используется поле PropertyNames. Значения в PropertyNames имеют следующий вид:

SubwayStation:S:0:20:FirstName:S:20:7:Phone:S:27:10:

Каждый раз при загрузке хотя бы одного параметра из профиля пользователя, инициируется полная инициализация всех свойств профиля. Указанная строка разбивается на отдельные значения. Отсюда можно сделать вывод, что лучше не хранить в профилях информацию, которая используется абсолютно на каждой странице при каждом запросе, т.к. требуются дополнительные ресурсы на парсинг отдельных свойств профиля.

2 комментария:

  1. Хорошо написано. Было бы интересно почитать еще о свойствах вроде списка или массива...

    ОтветитьУдалить
  2. Зашебись. А у меня вот нифига не видит в коде Profile.MyProperty чо я делаю н етак?

    ОтветитьУдалить