Профили, не работающие с веб-приложением в ASP.NET

Я работаю с профилями в веб-приложении ASP.NEt. Я перепробовал все безрезультатно.

первый: мой файл web.config выглядит следующим образом:

<system.web>
    <anonymousIdentification enabled="true" />
...
<profile  defaultProvider="DovoCosmeticFashionProfileProvider" automaticSaveEnabled="false">
      <providers>
        <add name="DovoCosmeticFashionProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="LocalSqlServer" applicationName="DovoCosmeticFashionMembership" />
      </providers>
      <properties>
        <add name="FirstName" type="String" allowAnonymous="true"/>
        <add name="LastName" type="String" allowAnonymous="true"/>
        <add name="Birthdate" type="DateTime" allowAnonymous="true"/>
        <add name="Mobile" type="String" allowAnonymous="true"/>
        <add name="Address" type="DovoCosmeticFashion.Entities.Address" allowAnonymous="true"/>
        <add name="Cart" type="DovoCosmeticFashion.Entities.ShoppingCart" allowAnonymous="true"/>
      </properties>
    </profile>

и у меня есть CreateUserWizard с тремя шагами: мой собственный шаг (для сбора информации о профиле), CreateUserWizardStep и CompleteWizardStep.

Первая проблема заключается в том, что когда я сохраняю информацию о профиле в моем объекте пользовательского профиля:

public class ProfileCommon : ProfileBase
{
    public String FirstName
    {
        get
        {
            return (String)HttpContext.Current.Profile.GetPropertyValue("FirstName");
        }
        set
        {
            HttpContext.Current.Profile.SetPropertyValue("FirstName", value);
        }
    }
    public String LastName
    {
        get
        {
            return (String)HttpContext.Current.Profile.GetPropertyValue("LastName");
        }
        set
        {
            HttpContext.Current.Profile.SetPropertyValue("LastName", value);
        }
    }
    public DateTime Birthdate
    {
        get
        {
            return (DateTime)HttpContext.Current.Profile.GetPropertyValue("Birthdate");
        }
        set
        {
            HttpContext.Current.Profile.SetPropertyValue("Birthdate", value);
        }
    }
    public String Mobile
    {
        get
        {
            return (String)HttpContext.Current.Profile.GetPropertyValue("Mobile");
        }
        set
        {
            HttpContext.Current.Profile.SetPropertyValue("Mobile", value);
        }
    }
    public Address address
    {
        get
        {
            return (Address)HttpContext.Current.Profile.GetPropertyValue("Address");
        }
        set
        {
            HttpContext.Current.Profile.SetPropertyValue("Address", value);
        }
    }
    public ShoppingCart Cart
    {
        get
        {
            return (ShoppingCart)HttpContext.Current.Profile.GetPropertyValue("Cart");
        }
        set
        {
            HttpContext.Current.Profile.SetPropertyValue("Cart", value);
        }
    }
}

Все работало нормально до тех пор, пока не сработало событие Profile_MigrateAnonymous, вы знаете, что оно сохранило информацию профиля и дало мне много исключений. Случилось так, что это событие сработало как последнее событие в жизненном цикле веб-страницы (после выполнения кода на странице просмотра) и я не смог получить доступ к какой-либо переменной в анонимном профиле или даже в сеансе (они недоступны, и, кстати, я был удивлен, что пользователь еще не прошел аутентификацию), и вы знаете, что при использовании веб-приложения вы можете получить доступ к профилю, используя метод "Создать", а не метод "GetProfile", например: ProfileBase profileBase = ProfileBase.Create(pe.AnonymousID); или HttpContext.Current.Profile;

Во-вторых: после многих попыток и из-за того, что пользователь еще не прошел аутентификацию, как упоминалось ранее, я заменяю первый и второй шаги элемента управления CreateUserWizard следующим образом: сначала "CreateUserWizardStep", а затем мой собственный шаг (для сбора информации профиля), и я удалил Profile_MigrateAnonymous и обработал событие FinishButtonClick:

protected void RegisterUser_FinishButtonClick(object sender, WizardNavigationEventArgs e)
{
    if (User.Identity.IsAuthenticated)
    {
       .....

        Profile.Save();

    }

}

теперь он работал без каких-либо исключений, но ничего не было сохранено в таблицу aspnet_Profile OOOOOOOPs.

я изменил ProfileCommon следующим образом:

public class ProfileCommon : ProfileBase
{

    private ProfileBase Profile = null;
    public ProfileCommon()
    {
        GetProfile();
    }
    public ProfileCommon(string username)
    {
        GetProfile(username);
    }

    public ProfileBase GetProfile()
    {
        if (Profile == null)
        {
            Profile = ProfileBase.Create(HttpContext.Current.User.Identity.Name);
            return Profile;
        }
        else
        {
            return Profile;
        }
    }

    public ProfileBase GetProfile(string username)
    {
        if (Profile == null)
        {
            Profile = ProfileBase.Create(username);
            return Profile;
        }
        else
        {
            return Profile;
        }
    }

    public String FirstName
    {
        get
        {
            return (String)Profile.GetPropertyValue("FirstName");
        }
        set
        {
           Profile.SetPropertyValue("FirstName", value);
        }
    }
    public String LastName
    {
        get
        {
            return (String)Profile.GetPropertyValue("LastName");
        }
        set
        {
            Profile.SetPropertyValue("LastName", value);
        }
    }
    public DateTime Birthdate
    {
        get
        {
            return (DateTime)Profile.GetPropertyValue("Birthdate");
        }
        set
        {
            Profile.SetPropertyValue("Birthdate", value);
        }
    }
    public String Mobile
    {
        get
        {
            return (String)Profile.GetPropertyValue("Mobile");
        }
        set
        {
            Profile.SetPropertyValue("Mobile", value);
        }
    }
    public Address address
    {
        get
        {
            return (Address)Profile.GetPropertyValue("Address");
        }
        set
        {
            Profile.SetPropertyValue("Address", value);
        }
    }
    public ShoppingCart Cart
    {
        get
        {
            return (ShoppingCart)Profile.GetPropertyValue("Cart");
        }
        set
        {
            Profile.SetPropertyValue("Cart", value);
        }
    }

}

и снова напрасно.

Третье: я не знаю, лучше ли использовать: HttpContext.Current.Profile или ProfileBase.Create(HttpContext.Current.User.Identity.Name) в случае аутентификации пользователя. потому что если вы сохраните информацию в одном из них (используя метод SetPropertyValue), она не будет передана другому объекту.

Может ли какой-либо орган ответить на мои вопросы выше и сказать, есть ли способ сохранить информацию в профиле. Также, если есть лучший способ сохранить информацию профиля, например, сохранить ее в другой таблице, в которой в качестве первичного ключа используется "UserId", особенно если мне нужна разная информация (свойства) для разных ролей.

любая помощь будет оценена.

1 ответ

Кажется, никто не заботится об этих вопросах:-) У меня есть этот открытый провайдер профиля SQL и пока нет ответа..

Другие вопросы по тегам