Profile i Web Application Projects
I ett pågående projekt där vi implementerar en custom membership provider stötte jag på ett problem som först verkade helt irrationellt men som sedan visade sig vara fullt logiskt och försvarbart (som vanligt). Uppgiften vid tillfället var att skapa ett par egna properties för ASP.NET Profile, som adress och flagga för nyhetsbrev. Så jag satte upp detta efter konstens alla regler men upptäckte direkt att något inte stämde. Min förvirring visade sig bero på olikheter i de två projekttyperna Web Application Project och Web Site i Visual Studio - mer specifikt att en Web Site gör en dynamisk kompilering medan ett Web Application Project inte gör det.
Om du jobbar med en Web Site så definieras egna egenskaper i profilen i Web.config och Visual Studio skapar metoden GetProfile() i klassen Profile, vilken kommer att returnera ett ProfileCommon-objekt (nedärvt från ProfileBase) som innehåller alla dina nya properties. Det var detta jag försökte göra, men med ett Web Application Project!
Hur yttrade sig då mitt problem? Jo, Profile hade ingen GetProfile(). Detta kan också vara ett symptom på att du satt upp dina properties felaktigt för Web Site-lösningen ovan, men så var det inte i detta fallet.
En vanlig lösning i äldre versioner av Visual Studio (2005) verkar vara att leta upp ett plugin till Visual Studio som löser problemet åt dig. Men nog så enkelt, och dessutom snyggt och prydligt, är att skapa en proxyklass för dina properties och skippa hela definitionen i web.config. Dessutom har du i en egen klass möjligheten att lägga in annan logik för att hantera andra krav på din profil, vilket du saknar vid definition i web.config. Värt att nämna är att den här metoden fungerar utmärkt också om du har en Web Site men vill lägga logiken för Profile i ett separat klassbibliotek.
Din klass kan t ex se ut så här:
Som du ser ovan har jag lagt till en property för Address som kommer att hålla adressinformation för profilen samt en NewsletterSubscription som är en enkel flagga för att hålla koll på om användaren vill ha nyhetsbrev eller inte. På samma vis hanterar du övrig information som din Profile ska hålla. Klassen har även två metoder:
- GetProfile() – returnerar den nuvarande användarens profil. Det som sker är att den gör en cast på HttpContext.Current.Profile till en MyCustomProfile och returnerar den.
- GetProfile(string userName) – returnerar en profil med ett specifikt användarnamn (userName). Den använder sig av basklassens (ProfileBase) metod Create() och castar resultatet (ProfileBase) till MyCustomProfile.
Din proxyklass lägger du sedan till i web.config för att profilhanteringen i ASP.NET ska hitta den.
I MyCustomProfile har vi nu tillgång till våra custom properties samt den vanliga Profile-funktionaliteten såsom Save().
Länktips (på engelska):
- En bra genomgång av Profile i .NET: http://odetocode.com/articles/440.aspx
- Web Application Projects vs. Web sites: http://msdn.microsoft.com/en-us/library/aa730880%28VS.80%29.aspx
- Understanding .NET Dynamic Compilation: http://msdn.microsoft.com/en-us/library/ms366723.aspx
- Exempel på proxyklass, mer beskrivet i detalj: http://leedumond.com/blog/asp-net-profiles-in-web-application-projects/
Johanna Gustafsson
2010-05-27