custom Profile Provider using CMS API

811 views Asked by At

I have created a custom Profile Provider that is integrated with the API of a CMS. It works fine when pulling data for an authenticated user (Profile.FirstName), but errors when creating a new user's profile.

Here is the section from web.config

<profile enabled="true" defaultProvider="CustomProfileProvider" inherits="objProfile">
  <providers>
    <clear />
    <add name="CustomProfileProvider" type="CustomProfileProvider" />
  </providers>
</profile>

Here is objProfile class

Public Class objProfile
    Inherits ProfileBase

    Public Property FirstName() As String
        Get
            Return Me.GetPropertyValue("FirstName")
        End Get
        Set(ByVal value As String)
            Me.SetPropertyValue("FirstName", value)
        End Set
    End Property

    Public Property LastName() As String
        Get
            Return Me.GetPropertyValue("LastName")
        End Get
        Set(ByVal value As String)
            Me.SetPropertyValue("LastName", value)
        End Set
    End Property

    Public Property Email() As String
        Get
            Return Me.GetPropertyValue("Email")
        End Get
        Set(ByVal value As String)
            Me.SetPropertyValue("Email", value)
        End Set
    End Property

    Public Property Address1() As String
        Get
            Return Me.GetPropertyValue("Address1")
        End Get
        Set(ByVal value As String)
            Me.SetPropertyValue("Address1", value)
        End Set
    End Property

    ...

    Public Property MailList() As Boolean
        Get
            Return Me.GetPropertyValue("Mailing List")
        End Get
        Set(ByVal value As Boolean)
            Me.SetPropertyValue("Mailing List", value)
        End Set
    End Property

End Class

Here is the custom ProfileProvider. The only function that is implemented right now is GetPropertyValues because that is the only one that is used when stepping through with the debugger. I will implement the others as I need them.

Public Class CustomProfileProvider
    Inherits ProfileProvider

    Public Overrides Property ApplicationName() As String
        Get
            Return ConfigurationManager.AppSettings("ApplicationName")
        End Get
        Set(ByVal value As String)
            Return
        End Set
    End Property

    Public Overrides Sub Initialize(ByVal name As String, ByVal config As System.Collections.Specialized.NameValueCollection)
        MyBase.Initialize(name, config)
    End Sub

    Public Overrides Function DeleteInactiveProfiles(ByVal authenticationOption As System.Web.Profile.ProfileAuthenticationOption, ByVal userInactiveSinceDate As Date) As Integer

    End Function

    Public Overloads Overrides Function DeleteProfiles(ByVal usernames() As String) As Integer

    End Function

    Public Overloads Overrides Function DeleteProfiles(ByVal profiles As System.Web.Profile.ProfileInfoCollection) As Integer

    End Function

    Public Overrides Function FindInactiveProfilesByUserName(ByVal authenticationOption As System.Web.Profile.ProfileAuthenticationOption, ByVal usernameToMatch As String, ByVal userInactiveSinceDate As Date, ByVal pageIndex As Integer, ByVal pageSize As Integer, ByRef totalRecords As Integer) As System.Web.Profile.ProfileInfoCollection

    End Function

    Public Overrides Function FindProfilesByUserName(ByVal authenticationOption As System.Web.Profile.ProfileAuthenticationOption, ByVal usernameToMatch As String, ByVal pageIndex As Integer, ByVal pageSize As Integer, ByRef totalRecords As Integer) As System.Web.Profile.ProfileInfoCollection

    End Function

    Public Overrides Function GetAllInactiveProfiles(ByVal authenticationOption As System.Web.Profile.ProfileAuthenticationOption, ByVal userInactiveSinceDate As Date, ByVal pageIndex As Integer, ByVal pageSize As Integer, ByRef totalRecords As Integer) As System.Web.Profile.ProfileInfoCollection

    End Function

    Public Overrides Function GetAllProfiles(ByVal authenticationOption As System.Web.Profile.ProfileAuthenticationOption, ByVal pageIndex As Integer, ByVal pageSize As Integer, ByRef totalRecords As Integer) As System.Web.Profile.ProfileInfoCollection

    End Function

    Public Overrides Function GetNumberOfInactiveProfiles(ByVal authenticationOption As System.Web.Profile.ProfileAuthenticationOption, ByVal userInactiveSinceDate As Date) As Integer

    End Function

    Public Overrides Function GetPropertyValues(ByVal cotext As System.Configuration.SettingsContext, ByVal collection As System.Configuration.SettingsPropertyCollection) As System.Configuration.SettingsPropertyValueCollection
        Dim PropertyValueCollection As New System.Configuration.SettingsPropertyValueCollection
        ... (get user properties from cms and put into PropertyValueCollection) ...
        'return the PropertyValueCollection
        Return PropertyValueCollection
    End Function

    Public Overrides Sub SetPropertyValues(ByVal context As System.Configuration.SettingsContext, ByVal collection As System.Configuration.SettingsPropertyValueCollection)

    End Sub

End Class

On a page with a logged in user, Profile.FirstName works fine. But when I create a new user, and then use objProfile.Create(UserName) to create the profile, all the properties have an error like The settings property 'Mailing List' was not found.

1

There are 1 answers

0
Alpha Codemonkey On BEST ANSWER

I found the problem. I was sick all last week, so I blame that.

When getting the profile in the GetPropertyValues function, I was using the HttpContext.Current instead of the context parameter that is passed in.

Public Overrides Function GetPropertyValues(ByVal context As System.Configuration.SettingsContext, ByVal collection As System.Configuration.SettingsPropertyCollection) As System.Configuration.SettingsPropertyValueCollection
    Dim PropertyValueCollection As New System.Configuration.SettingsPropertyValueCollection

    'get username from parameter, context.Item("UserName"), not HttpContext.Current.User.Identity.Name.ToString()

    ...get user properties from CMS and put into PropertyValueCollection...

    'return the PropertyValueCollection
    Return PropertyValueCollection
End Function