Lab 6: ASP.NET 2.0 Providermodellen Den stora finessen med Providermodellen är enkelheten att skapa sin egna provider för att kunna anpassa en tjänst utefter de behov man har. Den gör tillståndshantering väldigt enkelt och flexibelt. Exempelvis kanske man vill att användarinformation ska lagras i en XML fil istället för i en databas. Man skapar då en egen "provider" som hanterar detta och konfigurerar webbapplikationen att nyttja den skräddarsydda versionen. Beräknad tid för att slutföra labben ca: 60 minuter I den här labben skall du skapa en egen site map provider som hämtar s site map data från MyComics databasen istället för från en XML fil. Detta möjliggör att site map data lagras i MyComics database till sammans med data om böckerna. Syfte med labben är dubbelt, dels att få prova på att skapa egna providers, dels att skapa en bättre förståelse för providermodellen I ASP.NET. Redovisning Redovisning av uppgiften sker i form av en enkel laborationsrapport med koden bifogad som text. Labbförberedelser Kopiera katalogen där filerna från föregående labb finns till en ny katalog. Döp om katalogen till Lab6
Sida 2 Övning 1 Review the SiteMap table in the MyComics database I den hör övningen skall vi granska en tabell eom heter SiteMap i MyComics databasen. Varje rad i tabellen representerar en nod i site mappen. Uppgift 1. Se till så att säkerhetsdata basen är Ok 2. Granska tabellen Beskrivnig Kontrolera så att säkerhetsdatabasen har följt med vid kopieringen enligt instruktionerna I labb 5 a. Starta Visual Studio 2005 och öppna Server Explorer fönstret. b. Om du saknar anslutning till MyComics databasen, lägg till en anslutning med Microsoft SQL Server Data source enligt nedan: c. Expandera MyComics anslutningen MyComics database Tables. d. Högerklicka på tabellen SiteMap och välj Show Table Data. Du skall nu ha data som ser ut, beroende på ditt val av sidor och namn, ungefär så här:
Sida 3
Sida 4 Övning 2 Skriv en egen site map provider I den hör övningen skall du skapa en egen map provider klass med namnet MyComicsSiteMapProvider. Den skapar en site map av data i SiteMap tabellen i MyComics databasen. uppgift 1. Oppna webbsiten 2. Skapa MyComicsSite MapProvider klassen Beskrivning a. Starta Microsoft Visual Studio 2005 och öppna labb6 med File Open Web Site a. Högerklicka på App_Code mappen och välj Add New Item. b. I dialogen välj Class som template och ange MyComicsSiteMapProvider som filnamn. c. Klicka på Add. d. Lägg till using uttryck till de som redan finns i MyComicsSiteMapProvider: using System.Data.SqlClient; using System.Collections.Specialized; e. Modifiera klassdeklarationen så att MyComicsSiteMapProvider ärver från System.Web.StaticSiteMapProvider: public class MyComicsSiteMapProvider : StaticSiteMapProvider 3. Lägg till privata fält a. Lägg till följande fält till MyComicsSiteMapProvider klassen static readonly string _errmsg1 = "Missing attribute: connectionstringname"; string _connect; SiteMapNode _root; 4. Gör Override på Initialize Metoden a. Lägg till följande metod til MyComicsSiteMapProvider klassen: public override void Initialize (string name, NameValueCollection attributes) { base.initialize (name, attributes); if (attributes == null) { throw new ConfigurationException (_errmsg1);
Sida 5 _connect = attributes["connectionstringname"]; if (String.IsNullOrEmpty (_connect)) throw new ConfigurationException (_errmsg1); Initierar SiteMapProvider implementationen, inklusive eventuella resurser som kan behövas för att ladda site map data från källan. Metoden skapar inte någon site map utan förbereder bara SiteMapProvider objektet för att göra det. 5. Gör Override på BuildSiteMap Metoden a. Lägg till följande metod till MyComicsSiteMapProvider klassen: public override SiteMapNode BuildSiteMap () { // Return immediately if this method has been called before if (_root!= null) return _root; // Create the root SiteMapNode _root = new SiteMapNode (this, "Default.aspx", "Default.aspx", "Home"); AddNode(_root, null); // Query the database for other SiteMapNodes SqlConnection connection = new SqlConnection (ConfigurationManager.ConnectionStrings[_connect].ConnectionString); try { connection.open (); SqlCommand command = new SqlCommand ("SELECT Title, Url, Roles FROM SiteMap", connection); SqlDataReader reader = command.executereader (); int url = reader.getordinal ("Url"); int title = reader.getordinal ("Title"); int roles = reader.getordinal ("Roles"); // Add the nodes to the site map while (reader.read ()) {
Sida 6 SiteMapNode node = new SiteMapNode (this, reader.getstring(url), reader.getstring(url), reader.getstring(title)); if (!reader.isdbnull (roles)) { string rolenames = reader.getstring (roles); if (!String.IsNullOrEmpty (rolenames)) { string[] rolelist = rolenames.split (new char[] { ',', ';', 512); node.roles = rolelist; AddNode (node, _root); finally { connection.close (); // Return the root SiteMapNode return _root; BuildSiteMap metoden anropas för att ladda och bygga site map noderna från källan. 6. Gör override på IsAccessibleTo User metoden a. Lägg till följande metod till MyComicsSiteMapProvider klassen: public override bool IsAccessibleToUser (HttpContext context, SiteMapNode node) { if (!SecurityTrimmingEnabled node.roles == null node.roles.count == 0) return true; foreach (string role in node.roles) {
Sida 7 if (string.equals (role, "*", StringComparison.InvariantCultureIgnoreCase) context.user.isinrole (role)) return true; return false; IsAccessibleToUser metoden tar ett Boolskt värde som indikerar hur vida ett SiteMapNode objekt skall visas för användaren i ett visst kontext. Klippt från MSDN webben SiteMapProvider s IsAccessibleToUser method takes an optimistic approach to security trimming: it assumes nodes that lack roles information are accessible to everyone. In practice, you might want to take the opposite approach and assume that no one has access to nodes that lack roles information if security trimming is enabled. 7. Gör override på GetRootNode Core metoden a. Lägg till följande metod till MyComicsSiteMapProvider klassen: protected override SiteMapNode GetRootNodeCore() { BuildSiteMap (); return _root; GetRootNodeCore metoden ger en parent provider i en provider herarki möjlighet att extrahera ett SiteMapNode objekt.
Sida 8 Övning 3 Prova MyComicsSiteMapProvider I denna övning skall du registrera den site map provider som du skapat och testa den med MyComics Webb siten. Uppgift 1. Avregistrera den nuvarande site map providern beskrivning a. Högerklicka på Web.sitemap och välj Delete för att ta bort den. b. Öppna Web.config och radera följande sektion: <sitemap> <providers> <remove name="aspnetxmlsitemapprovider" /> <add name="aspnetxmlsitemapprovider" type="system.web.xmlsitemapprovider, securitytrimmingenabled="true" sitemapfile="web.sitemap" /> </providers> </sitemap> c. Starta applikationen. Vad händer? 2. Registrera MyComicsSite MapProvider a. Lägg till följande section till <system.web> sektionen i Web.config, för att ersätta det du nyss raderat: <sitemap defaultprovider="mycomicssitemapprovider" enabled="true"> <providers> <add name="mycomicssitemapprovider" type="mycomicssitemapprovider" securitytrimmingenabled="true" connectionstringname="mycomicsconnectionstring" /> </providers> </sitemap> b. Spara och stäng Web.config. 3. Testa MyComicsSite a. Starta applikationen för att verifiera att inga fel uppstår. b. Kontrollera så att navigationen ser ut som i föregående labb och Admin länken saknas
Sida 9 MapProvider (p.g.a. de säkerhets inställningar du gjorde I labb 4). c. Klicka på Login länken I sidans överkant och logga in som Administratör. d. Kolla så att Admin åter igen dyker upp I navigationen. e. Prova länkarna I navigationen så att de fungerar.
Sida 10 Sammanfattning I den här labben har vi tittat på: Hur man skapar en egen site map provider Hur man registrerar en egen site map provider Sätt dig en stund och gå igenom koden för MyComicsSiteMapProvider. Fundera över följande frågor: Wad är ändamålet med följande kod i MyComicsSiteMapProvider.Initialize? if (attributes == null) throw new ConfigurationException (_errmsg2); _connect = attributes["connectionstringname"]; if (String.IsNullOrEmpty (_connect)) throw new ConfigurationException (_errmsg2); Finns det någon begränsning I hur många rollnamn (role names)som MyComicsSiteMapProvider kan ansluta till en enskild site map node? (Tipps: Svaret finns i BuildSiteMap metoden.)