{"id":491,"date":"2011-11-09T08:29:49","date_gmt":"2011-11-09T06:29:49","guid":{"rendered":"http:\/\/www.kristiansborg.dk\/bibliotek\/?page_id=491"},"modified":"2011-11-09T08:33:10","modified_gmt":"2011-11-09T06:33:10","slug":"kapitel-4-videregaende-asp-programmering","status":"publish","type":"page","link":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/active-server-pages\/kapitel-4-videregaende-asp-programmering\/","title":{"rendered":"Kapitel 4 Videreg\u00e5ende ASP-programmering"},"content":{"rendered":"<p>I dette kapitel vil flere videreg\u00e5ende teknikker indenfor ASP-programmering blive beskrevet. Det drejer sig blandt andet om at udvide ASP-serveren med egne komponenter eller komponenter fra tredjepart. I kapitlet vil det ogs\u00e5 blive beskrevet, hvordan man l\u00e6ser og skriver filer fra ASP-programmer. Kapitlet omhandler ogs\u00e5 transaktioner, som er en udvidelse af det almindelige sessionsbegreb. Endelig gennemg\u00e5s ogs\u00e5, hvordan man kan lave indstillinger, der g\u00e6lder for alle ens ASP-sider ved hj\u00e6lp af filen global.asa.<\/p>\n<div style=\"border: 1px solid red; color: red\">\n<p><b>Du l\u00e6ser en gammel bog<\/b><\/p>\n<p>Den bog, du l\u00e6ser her, er fra 1999, og mange ting kan have \u00e6ndret sig siden da.<br \/>\nVi h\u00e5ber, at du stadig kan finde relevant information i den.<br \/>\nHvis du vil l\u00e6se aktuelle oplysninger om den aktuelle version af ASP.NET, anbefaler vi<br \/>\nbogen <a href=\"http:\/\/clk.tradedoubler.com\/click?p(197229)a(2029446)g(19172914)url(http:\/\/www.adlibris.com\/dk\/product.aspx?isbn=0735643385)\" onclick=\"javascript:pageTracker._trackPageview('\/outbound\/article\/http:\/\/clk.tradedoubler.com\/click?p(197229)a(2029446)g(19172914)url(http:\/\/www.adlibris.com\/dk\/product.aspx?isbn=0735643385)');\"  target=\"_blank\">Programming ASP.NET 4.0<\/a><img decoding=\"async\" src=\"http:\/\/impdk.tradedoubler.com\/imp?type(inv)g(19172914)a(2029446)\" \/>\n<\/div>\n<h1>Filer<\/h1>\n<p>Filh\u00e5ndtering blev kort introduceret i kapitel 3. Introduktionen i kapitel 3 var imidlertid blot en teoretisk forklaring af de forskellige fil-begreber, der findes inden for ASP. I dette afsnit bliver teorien suppleret med praksis, og det bliver gennemg\u00e5et, hvordan man anvender filer fra ASP. Det vil sige, hvordan man l\u00e6ser og skriver filer fra ASP-programmer. Filadgang er en v\u00e6sentlig del af det at udvikle applikationer \u2013 har man ikke mulighed for at gemme oplysninger, er det umuligt at lave omfattende og anvendelige programmer. Selv om ASP ogs\u00e5 giver adgang til at gemme oplysninger i databaser, er det ofte lettere \u2013 og hurtigere \u2013 at gemme oplysninger i en fil i stedet for at oprette en database.<\/p>\n<p>Selv om begrebet <em>fil<\/em> altid angiver en fil, der er lagret p\u00e5 medie, findes der i ASP-terminologi flere forskellige former for filer. Det er dog ikke selve filerne, der er forskellige, men blot den m\u00e5de, man angiver deres navn p\u00e5.<\/p>\n<p>De forskellige former for filer er gennemg\u00e5et i kapitel 3, og i dette afsnit vil de blot kort blive resumeret. Et <em>fysisk filnavn<\/em> er angivelse af en fil med det filnavn, den har p\u00e5 computeren, og som man kan finde den med i f.eks. Windows Stifinder. Et <em>virtuelt filnavn<\/em> er angivelse af en fil med det navn, den har p\u00e5 web-serveren. Det er det navn, man bruger, til at finde filen fra sin web-browser.<\/p>\n<p>Uafh\u00e6ngigt af om man bruger et fysisk eller et virtuelt filnavn, kan man v\u00e6lge at angive en fil med dens <em>relative<\/em> eller <em>absolutte<\/em> filnavn. Med et relativt filnavn angiver man navnet p\u00e5 filen i forhold til placeringen af det dokument, man refererer filen fra. Angiver man s\u00e5ledes det relative filnavn minfil.asp fra filen \/dokumenter\/enandenfil.asp, vil det angive filen \/dokumenter\/enandenfil.asp. V\u00e6lger man derimod at angive filnavnet absolut som \/filer\/enandenfil.asp, vil det altid v\u00e6re filen i biblioteket \/filer, der bliver refereret \u2013 ligegyldigt hvilket bibliotek den aktuelle fil befinder sig i.<\/p>\n<h2>Filsystemet<\/h2>\n<p>For at kunne l\u00e6se og skrive filer p\u00e5 web-serveren er det en god ide at kunne f\u00e5 oplysninger om det filsystem, der indeholder filerne. Til at give oplysninger om filsystemet findes komponenten FileSystemObject. Man f\u00e5r et objekt af den ved at skrive<\/p>\n<p>&nbsp;<\/p>\n<p>Server.CreateObject(&#8220;Scripting.FileSystemObject&#8221;);<\/p>\n<p>&nbsp;<\/p>\n<p>FileSystem-objektet har kun et element. Det hedder Drives og indeholder oplysninger om de drev, der er tilsluttet ASP-serveren. Bem\u00e6rk, at man kun kan f\u00e5 oplysninger om filsystemet p\u00e5 serveren \u2013 ASP giver ikke mulighed for at f\u00e5 oplysninger om filsystemet p\u00e5 de bes\u00f8gendes computere.<\/p>\n<p>Drives-elementet i FileSystem-objektet indeholder en r\u00e6kke Drive-objekter, som indeholder oplysninger om det p\u00e5g\u00e6ldende drev. Oplysningerne ses af nedenst\u00e5ende tabel.<\/p>\n<p>&nbsp;<\/p>\n<table border=\"1\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td width=\"326\" valign=\"top\"><strong>Navn<\/strong><\/td>\n<td width=\"326\" valign=\"top\"><strong>Beskrivelse<\/strong><\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">AvailableSpace<\/td>\n<td width=\"326\" valign=\"top\">Angiver hvor meget ledig   plads, der er p\u00e5 drevet (i bytes).<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">DriveLetter<\/td>\n<td width=\"326\" valign=\"top\">Angiver det bogstav, drevet   har i filsystemet.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">DriveType<\/td>\n<td width=\"326\" valign=\"top\">Angiver typen af drevet.   Mulige v\u00e6rdier er&nbsp;<\/p>\n<p>0: Ukendt<\/p>\n<p>1: Flytbar<\/p>\n<p>2: Lokal (fixed)<\/p>\n<p>3: Netv\u00e6rksdrev<\/p>\n<p>4: CD-ROM<\/p>\n<p>5: RAM-drev<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">FileSystem<\/td>\n<td width=\"326\" valign=\"top\">Angiver filsystemet (for   eksempel FAT, FAT32, NTFS eller CDFS).<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">FreeSpace<\/td>\n<td width=\"326\" valign=\"top\">Angiver hvor meget ledig   plads der er p\u00e5 drevet.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">IsReady<\/td>\n<td width=\"326\" valign=\"top\">Angiver om drevet er klar   til at blive l\u00e6st.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">Path<\/td>\n<td width=\"326\" valign=\"top\">Angiver stien til drevet.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">RootFolder<\/td>\n<td width=\"326\" valign=\"top\">Returnerer et Folder-objekt, der repr\u00e6senterer   rodfolderen p\u00e5 drevet.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">SerialNumber<\/td>\n<td width=\"326\" valign=\"top\">Angiver serienummeret p\u00e5   drevet.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">ShareName<\/td>\n<td width=\"326\" valign=\"top\">Angiver drevets   netv\u00e6rksnavn.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">TotalSize<\/td>\n<td width=\"326\" valign=\"top\">Angiver st\u00f8rrelsen p\u00e5   drevet (i bytes).<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">VolumeName<\/td>\n<td width=\"326\" valign=\"top\">Angiver drevets navn.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Tabel 4.1:.Oplysninger i Drive-objektet.<\/p>\n<p>&nbsp;<\/p>\n<p>RootFolder-objektet giver adgang til en ny type objekt: Folder-objektet. Ligesom Drive-objektet, indeholder Folder-objektet en r\u00e6kke oplysninger. De ses af nedenst\u00e5ende tabel.<\/p>\n<p>&nbsp;<\/p>\n<table border=\"1\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td width=\"326\" valign=\"top\"><strong>Navn<\/strong><\/td>\n<td width=\"326\" valign=\"top\"><strong>Beskrivelse<\/strong><\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">Attributes<\/td>\n<td width=\"326\" valign=\"top\">Angiver   folderens egenskaber. Disse kan v\u00e6re en kombination af&nbsp;<\/p>\n<p>0:   Normal<\/p>\n<p>1:   Skrivebeskyttet<\/p>\n<p>2:   Skjult<\/p>\n<p>4:   System<\/p>\n<p>8:   Drev<\/p>\n<p>16:   Bibliotek<\/p>\n<p>32:   Arkiv<\/p>\n<p>64:   Alias<\/p>\n<p>128:   Komprimeret<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">DateCreated<\/td>\n<td width=\"326\" valign=\"top\">Angiver   det tidspunkt, folderen blev oprettet.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">DateLastAccessed<\/td>\n<td width=\"326\" valign=\"top\">Angiver   hvorn\u00e5r folderen sidst blev \u00e5bnet.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">DateLastModified<\/td>\n<td width=\"326\" valign=\"top\">Angiver   hvorn\u00e5r folderen sidst blev \u00e6ndret.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">Drive<\/td>\n<td width=\"326\" valign=\"top\">Angiver   det drev, folderen ligger p\u00e5.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">Files<\/td>\n<td width=\"326\" valign=\"top\">En   liste over de filer, der findes i folderen.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">Folders<\/td>\n<td width=\"326\" valign=\"top\">En   liste over de foldere, der findes i folderen, med mulighed for at tilf\u00f8je   foldere.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">IsRootFolder<\/td>\n<td width=\"326\" valign=\"top\">Angiver   om folderen er roden af drevet.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">Name<\/td>\n<td width=\"326\" valign=\"top\">Angiver   folderens navn.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">ParentFolder<\/td>\n<td width=\"326\" valign=\"top\">Returnerer   et Folder-objekt, der repr\u00e6senterer den folder, denne folder   er i.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">Path<\/td>\n<td width=\"326\" valign=\"top\">Angiver   stien til folderen.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">ShortName<\/td>\n<td width=\"326\" valign=\"top\">Angiver   folderens korte navn (8.3-navn).<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">ShortPath<\/td>\n<td width=\"326\" valign=\"top\">Angiver   stien til folderen med korte navne.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">Size<\/td>\n<td width=\"326\" valign=\"top\">Angiver   st\u00f8rrelsen p\u00e5 folderen og alle foldere i folderen.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">SubFolders<\/td>\n<td width=\"326\" valign=\"top\">En   liste over de foldere, der findes i folderen.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Tabel 4.2: Oplysninger i Folder-objektet.<\/p>\n<p>&nbsp;<\/p>\n<p>Folder-objektet g\u00f8r det ogs\u00e5 muligt at kopiere, slette og flytte folderen \u2013 det sket med metoderne Copy, Delete og Move.<\/p>\n<p>Som n\u00e6vnt kan man f\u00e5 en oversigt over de filer, en mappe indeholder, med Files. Denne liste indeholder en r\u00e6kke File-objekter. Ligesom Drive og Folder indeholder File en r\u00e6kke oplysninger.<\/p>\n<p>&nbsp;<\/p>\n<table border=\"1\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td width=\"326\" valign=\"top\"><strong>Navn<\/strong><\/td>\n<td width=\"326\" valign=\"top\"><strong>Beskrivelse<\/strong><\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">Attributes<\/td>\n<td width=\"326\" valign=\"top\">Angiver   filens egenskaber efter samme system som ved Folder-objektet.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">DateCreated<\/td>\n<td width=\"326\" valign=\"top\">Angiver   det tidspunkt filen blev oprettet.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">DateLastAccessed<\/td>\n<td width=\"326\" valign=\"top\">Angiver   hvorn\u00e5r filen sidst blev tilg\u00e5et.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">DateLastModified<\/td>\n<td width=\"326\" valign=\"top\">Angiver   hvorn\u00e5r filen sidst blev \u00e6ndret.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">Drive<\/td>\n<td width=\"326\" valign=\"top\">Angiver   drevbogstavet p\u00e5 det drev, filen ligger p\u00e5.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">Name<\/td>\n<td width=\"326\" valign=\"top\">Angiver   navnet p\u00e5 filen.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">ParentFolder<\/td>\n<td width=\"326\" valign=\"top\">Returnerer   et Folder-objekt, som angiver den folder, der indeholder   filen.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">Path<\/td>\n<td width=\"326\" valign=\"top\">Angiver filens sti.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">ShortName<\/td>\n<td width=\"326\" valign=\"top\">Angiver   filens korte navn.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">ShortPath<\/td>\n<td width=\"326\" valign=\"top\">Angiver   filens sti med korte navne.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">Size<\/td>\n<td width=\"326\" valign=\"top\">Angiver   filens st\u00f8rrelse.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">Type<\/td>\n<td width=\"326\" valign=\"top\">Angiver   filens type.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Tabel 4.3: Oplysninger i File-objektet.<\/p>\n<p>&nbsp;<\/p>\n<p>Med de tre objekter er det muligt at lave en total oversigt over filsystemet p\u00e5 serveren. Normalt vil man naturligvis ikke give bes\u00f8gende fra hele verden oplysninger om filsystemet, men det kan v\u00e6re s\u00e6rdeles anvendeligt, hvis man selv har behov for at fjernstyre serveren. Nedenst\u00e5ende eksempel viser, hvordan man kan lave en s\u00e5dan oversigt.<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;% @Language=JavaScript %&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;body&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;ul&gt;<\/p>\n<p>&lt;%<\/p>\n<p>drivetype = new Array();<\/p>\n<p>drivetype[0] = &#8220;Ukendt&#8221;;<\/p>\n<p>drivetype[1] = &#8220;Flytbar&#8221;;<\/p>\n<p>drivetype[2] = &#8220;Lokal&#8221;;<\/p>\n<p>drivetype[3] = &#8220;Netv\u00e6rksdrev&#8221;;<\/p>\n<p>drivetype[4] = &#8220;CD-ROM&#8221;;<\/p>\n<p>drivetype[5] = &#8220;RAM-drev&#8221;;<\/p>\n<p>stack = new Array();<\/p>\n<p>&nbsp;<\/p>\n<p>filsystem = Server.CreateObject(&#8220;Scripting.FileSystemObject&#8221;);<\/p>\n<p>drev = new Enumerator(filsystem.Drives);<\/p>\n<p>while (!drev.atEnd()) {<\/p>\n<p>Response.write(&#8220;&lt;li&gt;&#8221; + drev.item().DriveLetter);<\/p>\n<p>Response.write(&#8221; &#8211; &#8221; + drev.item().VolumeName);<\/p>\n<p>Response.write(&#8221; [&#8221; + drivetype[drev.item().DriveType] + &#8220;]&#8221;);<\/p>\n<p>Response.write(&#8221; (&#8221; + Math.round((drev.item().FreeSpace * 100 \/ drev.item().TotalSize)) + &#8220;% ledig)&#8221;);<\/p>\n<p>if (!drev.item().IsReady) {<\/p>\n<p>Response.write(&#8221; ikke klar&#8221;);<\/p>\n<p>} else {<\/p>\n<p>printFolders(drev.item().RootFolder, 0);<\/p>\n<p>}<\/p>\n<p>drev.moveNext();<\/p>\n<p>&nbsp;<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>function printFolders(folder, sp) {<\/p>\n<p>Response.write(&#8220;&lt;ul&gt;&#8221;);<\/p>\n<p>Response.write(&#8220;&lt;li&gt;&#8221;);<\/p>\n<p>if (folder.Name != &#8220;&#8221;) {<\/p>\n<p>Response.write(folder.Name);<\/p>\n<p>} else {<\/p>\n<p>Response.write(&#8220;\\\\&#8221;);<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>subfolders = new Enumerator(folder.SubFolders);<\/p>\n<p>while (!subfolders.atEnd()) {<\/p>\n<p>stack[sp] = subfolders;<\/p>\n<p>printFolders(subfolders.item(), sp+1);<\/p>\n<p>subfolders=stack[sp];<\/p>\n<p>subfolders.moveNext();<\/p>\n<p>}<\/p>\n<p>files = new Enumerator(folder.Files);<\/p>\n<p>while (!files.atEnd()) {<\/p>\n<p>Response.write(&#8220;&lt;li&gt;&#8221; + files.item().Name);<\/p>\n<p>files.moveNext();<\/p>\n<p>}<\/p>\n<p>Response.write(&#8220;&lt;\/ul&gt;&#8221;);<\/p>\n<p>}<\/p>\n<p>%&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;\/ul&gt;<\/p>\n<p>&lt;\/body&gt;<\/p>\n<h2>At l\u00e6se en fil<\/h2>\n<p>Filsystem-objektet g\u00f8r det muligt at \u00e5bne en fil for l\u00e6sning. Det g\u00f8res ved hj\u00e6lp af metoden OpenTextFile. N\u00e5r man skal l\u00e6se en fil, er det nok at angive navnet p\u00e5 filen som parameter. Det vil sige, at en fil kan \u00e5bnes med nedenst\u00e5ende linier:<\/p>\n<p>&nbsp;<\/p>\n<p>filsystem = Server.CreateObject(&#8220;Scripting.FileSystemObject&#8221;);<\/p>\n<p>in = filsystem.OpenTextFile(&#8220;c:\\\\autoexec.bat&#8221;);<\/p>\n<p>&nbsp;<\/p>\n<p>OpenTextFile-metoden returnerer en TextStream. TextStream-objekter indeholder f\u00f8lgende metoder:<\/p>\n<p>&nbsp;<\/p>\n<table border=\"1\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td width=\"326\" valign=\"top\">Metode<\/td>\n<td width=\"326\" valign=\"top\">Beskrivelse<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">Close()<\/td>\n<td width=\"326\" valign=\"top\">Lukker   den \u00e5bne fil efter endt l\u00e6sning.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">Read(<em>antal tegn<\/em>)<\/td>\n<td width=\"326\" valign=\"top\">L\u00e6ser   et antal tegn fra filen.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">ReadAll()<\/td>\n<td width=\"326\" valign=\"top\">L\u00e6ser   hele filen.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">ReadLine()<\/td>\n<td width=\"326\" valign=\"top\">Indl\u00e6ser   en linie fra filen.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">Skip(<em>antal tegn<\/em>)<\/td>\n<td width=\"326\" valign=\"top\">Springer   over et bestemt antal tegn ved l\u00e6sning fra filen.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">SkipLine()<\/td>\n<td width=\"326\" valign=\"top\">Springer   over en linie ved l\u00e6sning fra filen.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Tabel 4.4: Metoder i TextStream-objektet..<\/p>\n<p>&nbsp;<\/p>\n<p>TextStream-objektet indeholder ogs\u00e5 nogle metoder, der kan bruges til at skrive til en fil \u2013 disse bliver gennemg\u00e5et senere.<\/p>\n<p>N\u00e5r man l\u00e6ser fra filen, er det rart at kunne se, hvorn\u00e5r hele filen er indl\u00e6st. Til det kan man bruge variablen AtEndOfStream. N\u00e5r den er true, er hele filen indl\u00e6st. TextStream-objektet indeholder ogs\u00e5 v\u00e6rdierne AtEndOfLine, Column og Line, der henholdsvis angiver, om indl\u00e6sningen er ved slutningen af en linie, positionen p\u00e5 linien og liniens nummer.<\/p>\n<p>Nedenst\u00e5ende eksempel viser, hvordan man kan l\u00e6se indholdet af en fil p\u00e5 serveren og returnere det i et HTML-dokument til brugeren.<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;% @language=JavaScript %&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;body&gt;<\/p>\n<p>&lt;b&gt;Indholdet af filen er:&lt;\/b&gt;<\/p>\n<p>&lt;p&gt;<\/p>\n<p>&lt;%<\/p>\n<p>filsystem = Server.CreateObject(&#8220;Scripting.FileSystemObject&#8221;);<\/p>\n<p>stream = filsystem.OpenTextFile(&#8220;f:\\\\tf\\\\asp\\\\eksempler\\\\kapitel4\\\\data\\\\liste.txt&#8221;);<\/p>\n<p>&nbsp;<\/p>\n<p>while (!stream.AtEndOfStream) {<\/p>\n<p>tekst = stream.readLine();<\/p>\n<p>Response.write(tekst + &#8220;&lt;br&gt;&#8221;);<\/p>\n<p>}<\/p>\n<p>stream.close();<\/p>\n<p>%&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;\/body&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>Da det er en tekstfil, der bliver indl\u00e6st, er det n\u00f8dvendigt at tilf\u00f8je HTML-kommandoen &lt;br&gt; efter hver linie \u2013 ellers ville alle linierne i tekstfilen blive vist p\u00e5 \u00e9n linie i HTML -dokumentet.<\/p>\n<p>Afvikling af ovenst\u00e5ende eksempel vil give en HTML -side svarende til nedenst\u00e5ende billede:<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/04011.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-501\" title=\"0401\" src=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/04011.png\" alt=\"\" width=\"377\" height=\"435\" srcset=\"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/04011.png 377w, https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/04011-260x300.png 260w\" sizes=\"auto, (max-width: 377px) 100vw, 377px\" \/><\/a><\/p>\n<p>Figur 4.1: Visning af indholdet af en fil.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h2>At skrive en fil<\/h2>\n<p>Metoden OpenTextFile kan ogs\u00e5 bruges til at \u00e5bne en fil for skrivning. Her skal man blot bruge flere parametre. Den komplette syntaks for OpenTextFile er:<\/p>\n<p>&nbsp;<\/p>\n<p>OpenTextFile(<em>filnavn<\/em>, <em>tilstand<\/em>, <em>opret<\/em>, <em>format<\/em>);<\/p>\n<p>&nbsp;<\/p>\n<p><em>Filnavn<\/em> er navnet p\u00e5 den fil, der skal \u00e5bnes. <em>Tilstand<\/em> angiver den tilstand, filen skal \u00e5bnes i. 1 angiver l\u00e6sning, 2 angiver skrivning, mens 8 angiver tilf\u00f8jelse. <em>Opret<\/em> er enten sand (true) eller falsk (false) afh\u00e6ngig af, om filen skal oprettes, hvis den ikke allerede eksisterer. Hvis denne parameter ikke er true, bliver der <em>ikke<\/em> oprettet en ny fil, hvis der ikke allerede eksisterer en fil med samme navn. <em>Format<\/em> angiver filens format. Her kan man v\u00e6lge mellem 0, der angiver ASCII-format, -1 der angiver unicode-format og -2 der angiver styresystemets normale format.<\/p>\n<p>Bem\u00e6rk, at man ikke beh\u00f8ver angive alle parametrene.<\/p>\n<p>N\u00e5r man har \u00e5bnet filen for skrivning, har man adgang til yderligere metoder i TextStream-objektet. Disse metoder ses i nedenst\u00e5ende tabel.<\/p>\n<p>&nbsp;<\/p>\n<table border=\"1\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td width=\"326\" valign=\"top\"><strong>Metode<\/strong><\/td>\n<td width=\"326\" valign=\"top\"><strong>Beskrivelse<\/strong><\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">Close()<\/td>\n<td width=\"326\" valign=\"top\">Lukker   filen efter endt skrivning.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">Write(<em>streng<\/em>)<\/td>\n<td width=\"326\" valign=\"top\">Skriver   strengen.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">WriteLine(<em>streng<\/em>)<\/td>\n<td width=\"326\" valign=\"top\">Skriver   strengen og tilf\u00f8jer et linieskift. Hvis man blot vil skrive et linieskift   til filen, beh\u00f8ver man ikke angive en streng.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">WriteBlankLines(<em>antal<\/em>)<\/td>\n<td width=\"326\" valign=\"top\">Skriver   et antal tomme linier til filen.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Tabel 4.5: Skrive-relaterede metoder i TextStream-objektet.<\/p>\n<p>&nbsp;<\/p>\n<p>Nedenst\u00e5ende eksempel viser, hvordan man kan skrive en fil fra et ASP-dokument.<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;% @language=JavaScript %&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;body&gt;<\/p>\n<p>&lt;%<\/p>\n<p>filsystem = Server.CreateObject(&#8220;Scripting.FileSystemObject&#8221;);<\/p>\n<p>stream = filsystem.OpenTextFile(&#8220;f:\\\\tf\\\\asp\\\\eksempler\\\\kapitel4\\\\data\\\\nyfil.txt&#8221;, 2, true);<\/p>\n<p>stream.writeLine(&#8220;linie 1&#8221;);<\/p>\n<p>stream.writeLine(&#8220;linie 2&#8221;);<\/p>\n<p>stream.writeLine(&#8220;linie 3&#8221;);<\/p>\n<p>&nbsp;<\/p>\n<p>stream.close();<\/p>\n<p>%&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>Filen er nu skrevet. Klik &lt;a href = &#8220;data\/nyfil.txt&#8221;&gt;her&lt;\/a&gt; for at se den.<\/p>\n<p>&lt;\/body&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>N\u00e5r ASP-programmet er afviklet, kan man se indholdet af den nye fil i browseren \u2013 som forventet ser det s\u00e5ledes ud:<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/04021.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-500\" title=\"0402\" src=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/04021.png\" alt=\"\" width=\"377\" height=\"435\" srcset=\"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/04021.png 377w, https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/04021-260x300.png 260w\" sizes=\"auto, (max-width: 377px) 100vw, 377px\" \/><\/a><\/p>\n<p>Figur 4.2: Indholdet af en fil oprettet fra ASP.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h2>En simpel t\u00e6ller<\/h2>\n<p>N\u00e5r man har mulighed for at l\u00e6se og skrive filer, kan man gemme information persistent. Det vil sige, at man kan gemme oplysninger, s\u00e5 de kan bruges af flere forskellige brugere, og bliver husket selv om serveren bliver genstartet.<\/p>\n<p>En typisk \u2013 og simpel \u2013 anvendelse er en t\u00e6ller. Selv om de fleste bes\u00f8gende er forholdsvis ligeglade med, hvor mange der har v\u00e6ret der f\u00f8r dem, er det rart for indehaveren af web-stedet at vide, hvor mange bes\u00f8gende der er. Derfor kan man s\u00e6tte en t\u00e6ller p\u00e5 sin side. T\u00e6lleren bliver talt en op for hver gang siden bliver vist.<\/p>\n<p>Ved at gemme t\u00e6llerens v\u00e6rdi i en fil sikrer man, at t\u00e6lleren ikke bliver nulstillet, n\u00e5r serveren bliver lukket.<\/p>\n<p>F\u00f8lgende eksempel viser, hvordan man kan lave en simpel t\u00e6ller. Eksemplet indl\u00e6ser t\u00e6llerens v\u00e6rdi fra en fil, t\u00e6ller den op og viser v\u00e6rdien p\u00e5 siden. Herefter bliver den nye v\u00e6rdi gemt i filen.<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;body&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;% @Language = JavaScript %&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%<\/p>\n<p>filsystem = Server.CreateObject(&#8220;Scripting.FileSystemObject&#8221;);<\/p>\n<p>instream = filsystem.OpenTextFile(&#8220;f:\\\\tf\\\\asp\\\\eksempler\\\\kapitel4\\\\data\\\\counter.txt&#8221;);<\/p>\n<p>count = instream.ReadLine();<\/p>\n<p>instream.close();<\/p>\n<p>&nbsp;<\/p>\n<p>count = Math.floor(count) + 1;<\/p>\n<p>&nbsp;<\/p>\n<p>out = filsystem.OpenTextFile(&#8220;f:\\\\tf\\\\asp\\\\eksempler\\\\kapitel4\\\\data\\\\counter.txt&#8221;, 2, true);<\/p>\n<p>out.WriteLine(count);<\/p>\n<p>out.close();<\/p>\n<p>%&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>Denne side er blevet bes\u00f8gt &lt;%=count%&gt; gange.<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;\/body&gt;<\/p>\n<h1>Inkludering af filer<\/h1>\n<p>Udover at kunne l\u00e6se og skrive filer kan man ogs\u00e5 inkludere dem i sine ASP-filer. Den eller de inkluderede filer bliver indsat p\u00e5 en bestemt position i ASP-filen pr\u00e6cis som de er \u2013 det vil sige ufortolkede.<\/p>\n<p>Ved at bruge denne teknik kan man genbruge sin ASP-kode. Det vil sige, at man kan flytte de dele af ASP-koden, der bliver brugt flere steder, ud i selvst\u00e6ndige filer og inkludere disse, de steder de skal bruges. Det har den fordel, at man kan n\u00f8jes med at have koden \u00e9t sted \u2013 s\u00e5 sparer man diskplads, og man kan n\u00f8jes med at \u00e6ndre \u00e9t sted, hvis der skal \u00e6ndres noget i koden.<\/p>\n<p>Typiske anvendelser af inkluderede filer er menuer, der skal v\u00e6re p\u00e5 alle sider, og ASP-kode, der skal v\u00e6re p\u00e5 alle sider \u2013 eksempelvis statistik-kode.<\/p>\n<p>Man kan inkludere filer p\u00e5 to forskellige m\u00e5der. Man kan enten inkludere fysiske filer eller virtuelle filer. Vil man inkludere en fysisk fil, skriver man<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;!&#8211; #include file=&#8221;<em>filnavn&#8221; &#8212;<\/em>&gt;<\/p>\n<p>&nbsp;<\/p>\n<p><em>Filnavn<\/em> angiver et fysisk navn p\u00e5 en fil \u2013 eksempelvis c:\\web\\includefil.asp.<\/p>\n<p>Man kan ogs\u00e5 v\u00e6lge at inkludere en fil med dens virtuelle navn \u2013 s\u00e5 skriver man<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;!&#8211; #include virtual=&#8221;<em>filnavn<\/em>&#8221; &#8211;&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>I dette tilf\u00e6lde angiver <em>filnavn<\/em> et virtuelt filnavn, som for eksempel \/web\/includefil.asp.<\/p>\n<h1>Globale oplysninger<\/h1>\n<p>Den HTTP-protokol, som bruges til at kommunikere mellem web-serveren og brugerens browser, indeholder ingen oplysninger om tilstand. Det vil sige, at man ikke ud af protokollen kan se, om den samme bruger henter adskillige sider fra samme web-sted. Dette giver en r\u00e6kke problemer, idet det kan v\u00e6re essentielt at vide, hvilken bruger der henter en bestemt side. Man kan eksempelvis forestille sig en side, der viser indholdet af brugerens indk\u00f8bskurv i en e-butik. Hvis serveren ikke ved, hvilken bruger, der sender foresp\u00f8rgslen, hvordan skal den s\u00e5 kunne vise indholdet af den rigtige indk\u00f8bskurv?<\/p>\n<p>Version 1.1 af HTTP-protokollen \u2013 som blandt andet bruges i IIS 4.0 \u2013 indeholder dog nogle muligheder for at tilf\u00f8je tilstandsoplysninger til foresp\u00f8rgslerne.<\/p>\n<p>Selv om der tales om at tilf\u00f8je tilstand til HTTP-protokollen og til foresp\u00f8rgslerne skal det holdes klart, at det er web-applikationens tilstand, der er interessant. Applikationer kan indeholder megen funktionalitet, og en applikations tilstand angiver s\u00e5ledes, hvor i denne funktionalitet applikationen befinder sig i \u00f8jeblikket. Det kan eksempelvis v\u00e6re et e-handelssystem, hvor applikationen befinder sig mellem tilf\u00f8jelse af varer til indk\u00f8bskurven og indsendelse af den endelige ordre.<\/p>\n<p>En applikation kan imidlertid v\u00e6re i forskellige tilstande overfor forskellige brugere p\u00e5 samme tid. En applikations tilstand skal derfor ikke opfattes som \u00e9n fast tilkendegivelse af applikations status, men snarere som en dynamisk m\u00e6ngde af oplysninger om forskellige statuser applikationen i \u00f8jeblikket befinder sig i.<\/p>\n<p>Ydermere skal man v\u00e6re opm\u00e6rksom p\u00e5, at en tilstand ikke lever evigt. En tilstand b\u00f8r kun leve lige s\u00e5 l\u00e6nge, som brugeren er p\u00e5 web-stedet. Det er normalt at bruge begrebet <em>session<\/em> til at d\u00e6kke den periode, en bruger befinder sig p\u00e5 web-stedet \u2013 det vil sige, fra hun f\u00e5r vist den f\u00f8rste side, til hun f\u00e5r vist den sidste. Applikationens tilstand afh\u00e6nger af denne session, idet sessionen afg\u00f8r tilstandens levetid. P\u00e5 den anden side er sessionen selv en del af applikationens tilstand.<\/p>\n<p>Applikationens tilstand skal s\u00e5ledes opdeles i to omr\u00e5der. Den globale del, som vedr\u00f8rer hele applikationen og alle dens brugere, og den sessionsafh\u00e6ngige del, der kun ber\u00f8rer en enkelt bruger. Et eksempel p\u00e5 sessionsafh\u00e6ngig tilstand kan v\u00e6re en brugers indk\u00f8bskurv.<\/p>\n<p>ASP h\u00e5ndterer disse forskellige tilstande med objekterne Application og Session, der henholdsvis indeholder applikationsafh\u00e6ngige oplysninger og sessionsafh\u00e6ngige oplysninger.<\/p>\n<h2>Begivenheder<\/h2>\n<p>Objekterne Application og Session kan starte en r\u00e6kke begivenheder. Disse begivenheder kan eksempelvis optr\u00e6de, n\u00e5r en bruger bes\u00f8ger web-stedet for f\u00f8rste gang. I filen global.asa kan man skrive metoder, der automatisk bliver udf\u00f8rt, n\u00e5r disse begivenheder optr\u00e6der. Det drejer sig om metoderne Application_onStart, Application_onEnd, Session_onStart og Session_onEnd.<\/p>\n<p>Metoden Application_onStart udf\u00f8res automatisk, n\u00e5r applikationen startes. Det er altid web-serveren, der s\u00f8rger for opstart af en applikation. I denne metode kan man l\u00e6gge initialiseringskode, som kun skal udf\u00f8res en gang for hele applikationen. Det kan eksempelvis dreje sig om initialisering af variable, der er f\u00e6lles p\u00e5 tv\u00e6rs af sessioner.<\/p>\n<p>Application_onEnd udf\u00f8res, n\u00e5r applikationen stoppes. Det er ogs\u00e5 web-serveren, der s\u00f8rger for at stoppe en applikation \u2013 alt efter hvilken web-server, man har, kan der v\u00e6re mulighed for at stoppe en applikation gennem web-serverens brugergr\u00e6nseflade. I Application_onEnd-metoden vil man typiske l\u00e6gge kode, der rydder op efter applikationen. Har man allokeret hukommelse til sin applikation, b\u00f8r man frigive den her.<\/p>\n<p>Session_onStart-metoden bliver udf\u00f8rt, n\u00e5r en session p\u00e5begyndes. Det vil sige, n\u00e5r en ny bruger tilg\u00e5r web-stedet. I Session_onStart kan man initialisere de variable, der bruges p\u00e5 sessionsbasis. Det vil sige oplysninger, der er knyttet til hver session, og derigennem til hver bruger af web-stedet. Det kan eksempelvis dreje sig om en indk\u00f8bskurv, som typisk vil blive nulstillet i Session_onStart.<\/p>\n<p>Den sidste af de fire begivenheder er Session_onEnd. Denne begivenhed opst\u00e5r, n\u00e5r en session oph\u00f8rer med at eksistere. Der kan v\u00e6re flere grunde til, at en session skal stoppes. Det kan skyldes, at metoden Session.Abandon er blevet udf\u00f8rt. Det kan ogs\u00e5 skyldes, at brugeren har v\u00e6ret inaktiv s\u00e5 l\u00e6nge, at hendes session er udl\u00f8bet. Dette sker s\u00e6dvanligvis efter 20 minutters inaktivitet, men kan \u00e6ndres ved hj\u00e6lp af Session.Timeout, som vil blive gennemg\u00e5et senere i dette kapitel. Afbrydelse af en session med Session.Abandon-metoden anvendes typisk, hvis brugeren direkte beder om at f\u00e5 sin session stoppet. Det kan v\u00e6re, at brugeren har bedt om at forlade web-stedet, eller at ordren er blevet indsendt, og der derfor ikke l\u00e6ngere er grund til at opretholde den eksisterende session.<br \/>\n<script type=\"text\/javascript\"><!--\ngoogle_ad_client = \"ca-pub-3400894606969585\";\n\/* Bibliotek - ASP *\/\ngoogle_ad_slot = \"2386722770\";\ngoogle_ad_width = 336;\ngoogle_ad_height = 280;\n\/\/-->\n<\/script><br \/>\n<script type=\"text\/javascript\"\nsrc=\"http:\/\/pagead2.googlesyndication.com\/pagead\/show_ads.js\">\n<\/script><\/p>\n<h2>Variabler<\/h2>\n<p>Udover at h\u00e5ndtere begivenheder indeholder Session-objektet en r\u00e6kke variabler, som man kan bruge til at tilpasse sessionen. Det drejer sig om variablerne CodePage, SessionID og Timeout.<\/p>\n<p>CodePage angiver hvilken <em>code page<\/em>, de genererede HTML-dokumenter skal benytte. En code page er en tabel, som indeholder de tegn, der findes i et bestemt sprog. Ved at tildele CodePage-variablen en v\u00e6rdi, kan man angive, hvilken code page, browseren skal bruge, n\u00e5r indholdet af siden vises. Nedenst\u00e5ende eksempel s\u00e6tter code page til 1252.<\/p>\n<p>&nbsp;<\/p>\n<p>Session.CodePage = 1252;<\/p>\n<p>&nbsp;<\/p>\n<p>Variablen SessionID bruges til at identificere den igangv\u00e6rende session. Man kan bruge SessionID til at identificere brugeren af web-stedet. Man skal dog v\u00e6re opm\u00e6rksom p\u00e5, at v\u00e6rdien af SessionID kun er garanteret at v\u00e6re unik inden for en enkelt instans af applikationen. Hvis applikationen bliver genstartet, kan det forekomme, at en session tildeles den samme v\u00e6rdi som en tidligere session.<\/p>\n<p>Timeout-variablen angiver, hvor mange minutter brugeren m\u00e5 v\u00e6re inaktiv, f\u00f8r sessionen afbrydes. Standardv\u00e6rdien for denne variabel er 20 minutter. Hvilken v\u00e6rdi, der er den rigtige for et web-sted, afh\u00e6nger i h\u00f8j grad af p\u00e5g\u00e6ldende web-steds type. Hvis et web-sted har megen trafik, kan det v\u00e6re n\u00f8dvendigt at neds\u00e6tte timeout-tiden, s\u00e5 man undg\u00e5r, at der bruges alt for mange ressourcer i sessioner.<\/p>\n<h2>Applikations- og sessionsvariable<\/h2>\n<p>Man kan ogs\u00e5 bruge Application og Session-objekterne til at opbevare oplysninger for sig. Det g\u00f8r man ved hj\u00e6lp af de s\u00e5kaldte applikations- og sessionsvariable. En applikationsvariabel er tilg\u00e6ngelig i hele applikationen, mens en sessionsvariabel kun er tilg\u00e6ngelig indenfor en bestemt session.<\/p>\n<p>Man s\u00e6tter en applikationvariabel ved at skrive<\/p>\n<p>&nbsp;<\/p>\n<p>Application(&#8220;<em>variabelnavn<\/em>&#8220;) = <em>v\u00e6rdi<\/em>;<\/p>\n<p>&nbsp;<\/p>\n<p>hvor <em>variabelnavn<\/em> er navnet p\u00e5 applikationsvariablen, og <em>v\u00e6rdi<\/em> er den v\u00e6rdi, variablen skal tildeles. N\u00e5r man skal bruge v\u00e6rdien af en applikationsvariabel, skriver man blot<\/p>\n<p>&nbsp;<\/p>\n<p>Application(&#8220;<em>variabelnavn<\/em>&#8220;);<\/p>\n<p>&nbsp;<\/p>\n<p>S\u00e5ledes vil nedenst\u00e5ende eksempel udskrive v\u00e6rdien af applikationsvariablen navn.<\/p>\n<p>&nbsp;<\/p>\n<p>Response.Write(Application(&#8220;navn&#8221;));<\/p>\n<p>&nbsp;<\/p>\n<p>Sessionsvariabler h\u00e5ndteres p\u00e5 samme m\u00e5de. Her skriver man blot Session i stedet for Application. Det vil sige at<\/p>\n<p>&nbsp;<\/p>\n<p>Session(&#8220;<em>variabelnavn<\/em>&#8220;) = <em> v\u00e6rdi<\/em>;<\/p>\n<p>&nbsp;<\/p>\n<p>tildeler en sessionsvariabel en v\u00e6rdi, mens<\/p>\n<p>&nbsp;<\/p>\n<p>Response.Write(Session(&#8220;navn&#8221;));<\/p>\n<p>&nbsp;<\/p>\n<p>udskriver indholdet af sessionsvariablen navn.<\/p>\n<p>&nbsp;<\/p>\n<p>Nedenst\u00e5ende eksempel viser, hvordan man kan bruge applikations- og sessionsvariable.<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;% @Language = JavaScript %&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%<\/p>\n<p>if (Request.QueryString(&#8220;abandon&#8221;) == &#8220;true&#8221;) {<\/p>\n<p>Session.abandon();<\/p>\n<p>Response.Redirect(&#8220;sessioncount.asp&#8221;);<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>if (Session(&#8220;antal&#8221;) == null) {<\/p>\n<p>Session(&#8220;antal&#8221;) = 0;<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>if (Application(&#8220;antal&#8221;) == null) {<\/p>\n<p>Application(&#8220;antal&#8221;) = 0;<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>appAntal = Application(&#8220;antal&#8221;);<\/p>\n<p>appAntal = appAntal + 1;<\/p>\n<p>Application (&#8220;antal&#8221;) = appAntal;<\/p>\n<p>&nbsp;<\/p>\n<p>sesAntal = Session(&#8220;antal&#8221;);<\/p>\n<p>sesAntal = sesAntal + 1;<\/p>\n<p>Session(&#8220;antal&#8221;) = sesAntal;<\/p>\n<p>%&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;body&gt;<\/p>\n<p>Du har bes\u00f8gt denne side &lt;%=sesAntal%&gt; gang(e) i denne session.&lt;br&gt;<\/p>\n<p>Siden er blevet vist &lt;%=appAntal%&gt; gang(e), mens applikationen har k\u00f8rt.<\/p>\n<p>&lt;p&gt;<\/p>\n<p>Klik &lt;a href = &#8220;sessioncount.asp?abandon=true&#8221;&gt;her&lt;\/a&gt; for at slette din session og starte en ny.<\/p>\n<p>&lt;\/body&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>Eksemplet viser, hvordan man kan t\u00e6lle, hvor mange gange brugeren har bes\u00f8gt siden i den nuv\u00e6rende session, ligesom man kan t\u00e6lle, hvor mange gange siden er blevet vist, mens applikationen har k\u00f8rt. Af hensyn til afpr\u00f8vningen af eksemplet er der tilf\u00f8jet en mulighed for, at brugeren selv kan v\u00e6lge at afslutte sin session.<\/p>\n<h2>Tr\u00e5dsikkerhed<\/h2>\n<p>Man skal v\u00e6re opm\u00e6rksom p\u00e5, at der er en omkostning ved at anvende sessioner. Ikke alene tager h\u00e5ndteringen af sessionerne tid \u2013 sessioner medf\u00f8rer ogs\u00e5, at det kun er \u00e9n foresp\u00f8rgsel, der bliver behandlet ad gangen. Normalt vil web-serveren pr\u00f8ve at behandle s\u00e5 mange foresp\u00f8rgsler som muligt p\u00e5 samme tid, s\u00e5 man kan s\u00f8rge for, at web-serveren altid arbejder, ogs\u00e5 n\u00e5r den for eksempel venter p\u00e5 oplysninger fra databasen \u2013 s\u00e5 vil den benytte lejligheden til at behandle en anden foresp\u00f8rgsel imens. N\u00e5r der anvendes sessioner, er dette ikke muligt, da der i s\u00e5 fald kan opst\u00e5 inkonsistens.<\/p>\n<p>Man kan derfor v\u00e6lge at vurdere, om der m\u00e5ske er dele af ens web-sted, der ikke beh\u00f8ver sessionsh\u00e5ndteringen. Hvis der er det, kan man sl\u00e5 sessionsh\u00e5ndteringen fra p\u00e5 de sider. Det g\u00f8r man ved at skrive<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;% @EnableSessionState=False %&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>i starten af ASP-dokumentet.<\/p>\n<p>Et andet omr\u00e5de, man skal v\u00e6re opm\u00e6rksom p\u00e5, er de problemer, der kan opst\u00e5, n\u00e5r flere sessioner k\u00f8rer samtidigt i samme applikation. Hvis to ASP-programmer fors\u00f8ger at \u00e6ndre den samme variabel p\u00e5 samme tid, kan der opst\u00e5 problemer, idet variablen kun kan holde en v\u00e6rdi, og derfor bliver n\u00f8dt til at se bort fra den ene opdatering. Problemet eksisterer ogs\u00e5, hvis en ASP-side fors\u00f8ger at l\u00e6se en variabel, mens en anden ASP-side fors\u00f8ger at \u00e6ndre den. Det kan betyde, at den forkerte v\u00e6rdi, bliver indl\u00e6st, og at de beregninger, der foretages med den p\u00e5g\u00e6ldende v\u00e6rdi, derfor bliver forkerte. Hvis v\u00e6rdien \u00e6ndres midt i en beregning, kan det desuden betyde, at resultatet af beregningen bliver inkonsistent.<\/p>\n<p>Derfor kan man l\u00e5se applikationsvariabler. Det g\u00f8r man ved at skrive<\/p>\n<p>&nbsp;<\/p>\n<p>Application.Lock();<\/p>\n<p>&nbsp;<\/p>\n<p>N\u00e5r man har l\u00e5st applikationsvariblerne, er man sikker p\u00e5, at man er den eneste, der tilg\u00e5r dem. Man kan herefter foretage sine opdateringer eller l\u00e6sninger, hvorefter man kan frigive applikationsvariablerne ved at skrive<\/p>\n<p>&nbsp;<\/p>\n<p>Application.Unlock();<\/p>\n<p>&nbsp;<\/p>\n<p>Form\u00e5let med at l\u00e5se applikationsvariablerne er at sikre, at andre ikke kan tilg\u00e5 dem. Dette betyder dog ogs\u00e5, at man ikke skal holde dem l\u00e5st l\u00e6ngere tid end h\u00f8jst n\u00f8dvendigt. S\u00e5 l\u00e6nge man selv har l\u00e5st applikationsvaraiblerne, har andre ikke mulighed for at tilg\u00e5 dem, og andre ASP-sider kan s\u00e5ledes ikke behandles imens.<\/p>\n<h1>Cookies<\/h1>\n<p>Cookies er sm\u00e5 m\u00e6ngder data, der kan gemmes p\u00e5 klientens computer. Cookies er indf\u00f8rt i HTTP 1.1-protokollen, og browsere, der underst\u00f8tter denne standard, kan s\u00e5ledes bruge cookies.<\/p>\n<p>Cookies fungerer ved, at web-serveren beder browseren <em>s\u00e6tte en cookie<\/em>. Denne cookie returneres, som en del af svaret til browseren. Ved alle senere kald til den samme server, vil browseren inkludere cookien. Det betyder, at man p\u00e5 denne m\u00e5de kan identificere brugeren. Derfor bruges cookies ofte til at h\u00e5ndtere sessioner.<\/p>\n<p>Man kan imidlertid ogs\u00e5 bruge cookies til at gemme oplysninger, som skal opbevares l\u00e6ngere end en session. Man kan for eksempel forestille sig, at man gerne vil give brugeren mulighed for at gemme indholdet af sin indk\u00f8bskurv og afslutte bestillingen senere.<\/p>\n<p>Man skal dog v\u00e6re opm\u00e6rksom p\u00e5 nogle ting, hvis man v\u00e6lger at bruge cookies. Nogle brugere v\u00e6lger at sl\u00e5 cookies fra, s\u00e5 deres browser ikke sender cookies til serveren. Der har v\u00e6ret skrevet meget om, at cookies udg\u00f8r en sikkerhedsrisiko. Cookies kan dog ikke bruges til at tr\u00e6kke oplysninger fra computeren \u2013 det eneste, der kan gemmes, er de oplysninger, brugeren selv indtaster. Cookies kan heller ikke bruges til at f\u00e5 afviklet farlige eller virusinficerede programmer p\u00e5 brugerens computer. Cookies bliver blot gemt \u2013 de bliver aldrig udf\u00f8rt. Derfor kan det regnes som ufarligt at gemme cookies \u2013 det eneste problem, brugeren har, er, at de optager en smule plads p\u00e5 harddisken.<\/p>\n<h2>At s\u00e6tte en cookie<\/h2>\n<p>I ASP befinder cookies sig b\u00e5de i Response- og Request-objektet. Response-objektet indeholder de cookies, man vil s\u00e6tte, mens Request-objektet indeholder de cookies, der i forvejen er sat, og som sendes til web-stedet.<\/p>\n<p>Vil man s\u00e6tte en ny cookie, skal man s\u00e5ledes g\u00f8re det i Response-objektet. Dette objekt indeholder en samling af cookies \u2013 denne samling har navnet Response.cookies. For at s\u00e6tte en cookie beh\u00f8ver man blot at skrive<\/p>\n<p>&nbsp;<\/p>\n<p>Response.cookies(&#8220;<em>navn<\/em>&#8220;) = <em>v\u00e6rdi;<\/em><\/p>\n<p>&nbsp;<\/p>\n<p>Der h\u00f8rer imidlertid mere til en cookie end dens v\u00e6rdi. Man kan ogs\u00e5 angive, hvor l\u00e6nge cookien skal eksistere. Som det blev n\u00e6vnt tidligere, er nogle cookies kun interessante i et kort stykke tid, mens andre kan v\u00e6re interessante l\u00e6nge. Derfor kan man bruge variablen expires til at angive, hvorn\u00e5r cookien skal udl\u00f8be \u2013 det vil sige holde op med at v\u00e6re gyldig. N\u00e5r en cookie ikke l\u00e6ngere er gyldig, vil den ikke blive sendt med i en request fra browseren. Angiver man ikke noget udl\u00f8bstidspunkt p\u00e5 en cookie, vil den udl\u00f8be, n\u00e5r browseren lukkes.<\/p>\n<p>En cookies udl\u00f8bstidspunkt kan s\u00e6ttes s\u00e5ledes:<\/p>\n<p>&nbsp;<\/p>\n<p>Response.cookies(&#8220;<em>navn<\/em>&#8220;).expires = <em>tidspunkt<\/em>;<\/p>\n<p>&nbsp;<\/p>\n<p>Cookies kan v\u00e6re tilg\u00e6ngelige p\u00e5 forskellige m\u00e5der. Nogle cookies er kun tilg\u00e6ngelige for den side, der s\u00e6tter dem, mens andre cookies er tilg\u00e6ngelige for hele web-stedet. En cookies tilg\u00e6ngelighed kontrolleres af variablerne domain og path. Domain-variablen angiver det dom\u00e6ne, cookien skal v\u00e6re tilg\u00e6ngelig p\u00e5. Dette vil typisk v\u00e6re navnet p\u00e5 web-stedet \u2013 eksempelvis www.tekniskforlag.dk. P\u00e5 denne m\u00e5de vil alle sider p\u00e5 www.tekniskforlag.dk f\u00e5 cookien tilsendt. Man kan v\u00e6re mere specifik og ogs\u00e5 angive en sti \u2013 det g\u00f8res med path-variablen. Ved at s\u00e6tte den til eksempelvis bog, vil det kun v\u00e6re sider i stien www.tekniskforlag.dk\/bog, der vil modtage cookien. Nedenst\u00e5ende eksempel viser, hvordan man kan s\u00e6tte cookien som beskrevet i det ovenst\u00e5ende.<\/p>\n<p>&nbsp;<\/p>\n<p>Response.cookie(&#8220;mincookie&#8221;) = &#8220;minv\u00e6rdi&#8221;;<\/p>\n<p>Response.cookie(&#8220;mincookie&#8221;).domain = &#8220;www.tekniskforlag.dk&#8221;;<\/p>\n<p>Response.cookie(&#8220;mincookie&#8221;).path = &#8220;\/bog&#8221;;<\/p>\n<p>&nbsp;<\/p>\n<p>Hvis man har et sikkert web-sted, kan man ogs\u00e5 angive, at cookien kun skal sendes over en sikker forbindelse \u2013 typisk en SSL-forbindelse. Det kan man angive ved at s\u00e6tte variablen secure til true. For at angive, at cookien fra ovenst\u00e5ende eksempel kun m\u00e5 sendes over en sikker forbindelse, kan man skrive<\/p>\n<p>&nbsp;<\/p>\n<p>Response.cookie(&#8220;mincookie&#8221;).secure = true;<\/p>\n<p>&nbsp;<\/p>\n<p>N\u00e5r man bruger cookies, skal man v\u00e6re opm\u00e6rksom p\u00e5, at man skal s\u00e6tte alle cookies, f\u00f8r man begynder at generere HTML-kode. Det skyldes, at cookies skal angives i starten af HTTP-svaret.<\/p>\n<h2>At l\u00e6se en cookie<\/h2>\n<p>Der er imidlertid ikke meget ved at kunne s\u00e6tte en cookie, hvis man ikke kan l\u00e6se den igen. Det g\u00f8res gennem Request-objektet, der som n\u00e6vnt indeholder de cookies, der sendes fra browseren. Fremgangsm\u00e5den er stort set den samme som ved Response-objektet. For at l\u00e6se en cookie skriver man<\/p>\n<p>&nbsp;<\/p>\n<p>Request.cookies(&#8220;cookie&#8221;);<\/p>\n<p>&nbsp;<\/p>\n<p>Fremgangsm\u00e5den kan ogs\u00e5 bruges til at kontrollere, om en cookie er sat. Hvis man f\u00e5r v\u00e6rdien undefined, n\u00e5r man sp\u00f8rger om v\u00e6rdien af en cookie, betyder det, at cookien ikke er sat.<\/p>\n<h1>Integration af komponenter<\/h1>\n<p>Selv om scriptsprogene giver mange muligheder for at skrive avancerede ASP-programmer, og de komponenter, der er indbygget i IIS, giver yderligere muligheder, kan man komme i en situation, hvor man ikke kan klare sig med de eksisterende muligheder.<\/p>\n<p>For at afhj\u00e6lpe denne situation er der i IIS mulighed for at bruge andre komponenter end de indbyggede. Dette kan v\u00e6re komponenter, man selv har udviklet, eller komponenter fra tredjepart. De komponenter, der kan integreres i IIS, skal v\u00e6re COM-komponenter. Disse komponenter skrives typisk i programmeringssprog som C++ eller Delphi. Udvikling af disse komponenter er en forholdsvis kompliceret sag, og det ligger uden for rammerne af denne bog at beskrive det. Dette afsnit vil i stedet koncentrere sig om, hvor man kan finde komponenter, der allerede er udviklet, og hvordan man kan bruge disse og egenudviklede komponenter fra ASP.<\/p>\n<h2>Komponenter fra tredjepart<\/h2>\n<p>Der er mange, som har udviklet komponenter, der kan bruges i ASP. Det g\u00e6lder b\u00e5de store, kommercielle virksomheder, hvis kerneomr\u00e5de er komponentudvikling, og hobbyprogramm\u00f8rer, der g\u00f8r det for at l\u00f8se deres egne problemer, og derudover g\u00f8r komponenterne tilg\u00e6ngelige for andre. Komponenterne kan typisk \u2013 ligesom andet programmel \u2013 inddeles i tre kategorier: kommercielle komponenter, <em>shareware<\/em>-komponenter og\u00a0 <em>freeware<\/em>-komponenter. De kommercielle komponenter koster penge at bruge, mens shareware-komponenter er gratis at pr\u00f8ve, men koster penge, hvis man vil bruge dem. Freeware-komponenterne er fuldst\u00e6ndigt gratis. Man kan finde en lang r\u00e6kke shareware- og freeware-komponenter p\u00e5 Internet. Man kan eksempelvis kigge p\u00e5 adressen<\/p>\n<p>&nbsp;<\/p>\n<p>http:\/\/msdn.microsoft.com\/workshop\/server\/components\/catalog.asp.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0403.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-medium wp-image-499\" title=\"0403\" src=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0403-300x224.png\" alt=\"\" width=\"300\" height=\"224\" srcset=\"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0403-300x224.png 300w, https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0403.png 780w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Figur 4.3: P\u00e5 Internet kan man finde mange ActiveX-komponenter.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>Man skal imidlertid t\u00e6nke p\u00e5, at det er en tillidssag at installere programmel fra tredjepart. Typisk har man ikke andre end programm\u00f8rens ord for, hvad programmet g\u00f8r. Langt de fleste komponentprogramm\u00f8rer er naturligvis h\u00e6derlige mennesker, men man kan sagtens forestille sig, at en ondsindet programm\u00f8r vil forkl\u00e6de en virus som en ASP-komponent. Derudover skal man ogs\u00e5 t\u00e6nke p\u00e5, at ASP-programm\u00f8rer ogs\u00e5 er mennesker, og at det er menneskeligt at fejle. Det kr\u00e6ver ikke en s\u00e6rlig stor fejl i en ASP-komponent at l\u00e6gge web-serveren ned, hvorefter hele web-stedet ikke l\u00e6ngere er tilg\u00e6ngeligt. Hvis man driver et stort web-sted, som skal v\u00e6re tilg\u00e6ngeligt d\u00f8gnet rundt, \u00e5ret rundt, er det derfor vigtigt at v\u00e6lge en komponent, der er udviklet af en programm\u00f8r eller en virksomhed, som man har tillid til. Kan man ikke f\u00e5 tilstr\u00e6kkelig tillid til udvikleren af\u00a0 komponenten, er man n\u00f8dt til at lade komponenten gennemg\u00e5 en grundig test for at sikre, at komponenten er stabil og ikke har u\u00f8nskede bivirkninger.<\/p>\n<p>Netop risiciene ved at installere komponenter fra ukendte kilder har gjort, at mange web-hoteller ikke vil lade deres klienter installere komponenter. Til geng\u00e6ld har mange web-hoteller installeret en del komponenter, som ikke normalt er en del af IIS.<\/p>\n<h2>Installation<\/h2>\n<p>For at IIS kan finde de komponenter, der skal bruges, skal de v\u00e6re installeret korrekt. Det vil sige, at der skal findes en registrering af dem i Windows\u2019 registreringsdatabase. Anvender man en komponent fra tredjepart, vil registreringen ske som en naturlig del af installationen af den p\u00e5g\u00e6ldende komponent.<\/p>\n<p>Hvis man selv udvikler komponenter, vil der typisk v\u00e6re en funktion i udviklingsv\u00e6rkt\u00f8jet, der foretager registreringen.<\/p>\n<h2>Implementering i ASP<\/h2>\n<p>De komponenter, man selv har installeret, tilg\u00e5s p\u00e5 pr\u00e6cis samme m\u00e5de, som de komponenter, der er pr\u00e6installeret. Det vil sige, at man kan lave en instans af komponenten ved at skrive<\/p>\n<p>&nbsp;<\/p>\n<p>obj = Server.CreateObject(<em>navn<\/em>);<\/p>\n<p>&nbsp;<\/p>\n<p><em>Navn<\/em> skal v\u00e6re det navn, man har valgt at registrere komponenten under. Herefter kan man kalde de metoder, som komponenten indeholder p\u00e5 objektet obj. Hvis komponenten eksempelvis indeholder en metode, der hedder evaluate, kan man kalde den ved blot at skrive<\/p>\n<p>&nbsp;<\/p>\n<p>obj.evaluate();<\/p>\n<h2>Et eksempel<\/h2>\n<p>I dette eksempel vil det blive gennemg\u00e5et, hvordan man kan bruge komponenten JMail fra Dimac. Denne komponent g\u00f8r det muligt at afsende meddelelser fra ASP. I IIS er der indbygget en tilsvarende komponent, men JMail har v\u00e6sentligt flere muligheder, hvilket g\u00f8r den interessant.<\/p>\n<p>JMail kan hentes p\u00e5 HTTP:\/\/tech.dimac.net.<\/p>\n<p>N\u00e5r man har hentet Jmail, kan man installere komponenten ved at afvikle installationsprogrammet. Dette installerer den dll-fil, der indeholder komponenten, og opretter en registrering af komponenten i registreringsdatabasen i Windows. Herefter er man klar til at bruge komponenten fra ASP.<\/p>\n<p>I dette eksempel vil en HTML-side blive anvendt. P\u00e5 denne side kan brugeren udfylde en formular, der svarer til en e-mail. Brugeren har mulighed for at indtaste e-mail-adresse p\u00e5 modtageren, egen e-mail-adresse, overskrift, beskeden, samt at v\u00e6lge om hun vil modtage en kvittering, n\u00e5r beskeden bliver modtaget.<\/p>\n<p>HTML-koden, der generer siden, ser s\u00e5ledes ud:<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;html&gt;<\/p>\n<p>&lt;body&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;h1&gt;Afsend post&lt;\/h1&gt;<\/p>\n<p>&lt;form name = mail action=sendmail.asp method=post&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;table&gt;<\/p>\n<p>&lt;tr&gt;<\/p>\n<p>&lt;td&gt;Modtager&lt;\/td&gt;<\/p>\n<p>&lt;td&gt;&lt;input type=text name=modtager&gt;&lt;\/td&gt;<\/p>\n<p>&lt;\/tr&gt;<\/p>\n<p>&lt;tr&gt;<\/p>\n<p>&lt;td&gt;Afsender&lt;\/td&gt;<\/p>\n<p>&lt;td&gt;&lt;input type=text name=afsender&gt;&lt;\/td&gt;<\/p>\n<p>&lt;\/tr&gt;<\/p>\n<p>&lt;tr&gt;<\/p>\n<p>&lt;td&gt;Overskrift&lt;\/td&gt;<\/p>\n<p>&lt;td&gt;&lt;input type=text name=overskrift&gt;&lt;\/td&gt;<\/p>\n<p>&lt;\/tr&gt;<\/p>\n<p>&lt;tr&gt;<\/p>\n<p>&lt;td valign=top&gt;Besked&lt;\/td&gt;<\/p>\n<p>&lt;td&gt;&lt;textarea name=besked cols=40 rows=10&gt;&lt;\/textarea&gt;<\/p>\n<p>&lt;\/tr&gt;<\/p>\n<p>&lt;tr&gt;<\/p>\n<p>&lt;td&gt;Kvittering?&lt;\/td&gt;<\/p>\n<p>&lt;td&gt;&lt;input type=checkbox value=kvittering&gt;Ja&lt;\/td&gt;<\/p>\n<p>&lt;\/tr&gt;<\/p>\n<p>&lt;tr&gt;<\/p>\n<p>&lt;td colspan=2 align=center&gt;&lt;input type=submit value=Afsend&gt;&lt;\/td&gt;<\/p>\n<p>&lt;\/tr&gt;<\/p>\n<p>&lt;\/table&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;\/body&gt;<\/p>\n<p>&lt;\/html&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>I Internet Explorer f\u00e5r man siden vist som nedenst\u00e5ende figur.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0404.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-498\" title=\"0404\" src=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0404.png\" alt=\"\" width=\"513\" height=\"609\" srcset=\"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0404.png 513w, https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0404-252x300.png 252w\" sizes=\"auto, (max-width: 513px) 100vw, 513px\" \/><\/a><\/p>\n<p>Figur 4.4: Formular til afsendelse af post.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>P\u00e5 Dimacs hjemmeside kan man se dokumentationen af komponenten. Denne dokumentation indeholder blandt andet beskrivelse af den lange r\u00e6kke metoder og variabler, JMail indeholder. Det betyder, at man let kan skrive et ASP-dokument, som kalder komponentens metoder. Nedenst\u00e5ende ASP-program modtager dataene fra formularen og afsender en besked ved hj\u00e6lp af JMail. Som det fremg\u00e5r af eksemplet, er det uhyre let at benytte tredjepartskomponenter med ASP.<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;% @language=javascript %&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%<\/p>\n<p>mailer = Server.CreateObject(&#8220;JMail.SMTPMail&#8221;);<\/p>\n<p>&nbsp;<\/p>\n<p>mailer.ServerAddress = &#8220;post.tele.dk&#8221;;<\/p>\n<p>&nbsp;<\/p>\n<p>mailer.Sender = Request.Form(&#8220;afsender&#8221;);<\/p>\n<p>mailer.Subject = Request.Form(&#8220;overskrift&#8221;);<\/p>\n<p>mailer.Body = Request.Form(&#8220;besked&#8221;);<\/p>\n<p>&nbsp;<\/p>\n<p>if (Request.Form(&#8220;kvittering&#8221;) != null) {<\/p>\n<p>mailer.ReturnReceipt = true;<\/p>\n<p>} else {<\/p>\n<p>mailer.ReturnReceipt = false;<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>mailer.addRecipient(Request.Form(&#8220;modtager&#8221;));<\/p>\n<p>&nbsp;<\/p>\n<p>if (mailer.execute()) {<\/p>\n<p>Response.write(&#8220;Beskeden er afsendt.&#8221;);<\/p>\n<p>} else {<\/p>\n<p>Response.write(&#8220;Der opstod en fejl. &#8220;);<\/p>\n<p>Response.write(mailer.ErrorMessage);<\/p>\n<p>}<\/p>\n<p>%&gt;<\/p>\n<h1>Transaktioner<\/h1>\n<p>Dette afsnit omhandler transaktioner. Transaktioner er en s\u00e6rdeles central del af at bygge en omfattende web-applikation, der kan samarbejde med eksisterende systemer. Man kan eksempelvis forestille sig en Internet-bank, hvor selve web-stedet arbejder sammen med bankens eksisterende systemer.<\/p>\n<p>F\u00f8r teorien bag transaktioner bliver gennemg\u00e5et er det imidlertid en god id\u00e9 at starte med at definere, hvad en transaktion egentligt er. En transaktion er en m\u00e6ngde opgaver, som enten bliver fuldf\u00f8rt eller ikke fuldf\u00f8rt \u2013 det er ikke muligt at udf\u00f8re en transaktion delvis. Man kan s\u00e5ledes sige, at en transaktion er atomar, da den ikke kan deles. En transaktion kan dog best\u00e5 af mange delopgaver, men det g\u00e6lder, at alle delopgaver skal v\u00e6re fuldf\u00f8rt, for at transaktionen er fuldf\u00f8rt. Er alle delopgaver <em>ikke<\/em> fuldf\u00f8rt, er transaktionen ikke fuldf\u00f8rt, og det skal betyde, at <em>ingen<\/em> delopgaver er udf\u00f8rt. Det skal s\u00e5ledes v\u00e6re muligt at fortryde udf\u00f8relsen af en eller flere delopgaver, hvis det viser sig, at en efterf\u00f8lgende delopgave ikke kan udf\u00f8res. Denne teknik kaldes <em>rollback<\/em>. N\u00f8dvendigheden af rollback kan for eksempel ses i et banksystem. Hvis en transaktion er \u201coverf\u00f8r 100 kroner fra konto 1 til konto 2\u201d, kan den deles op i delopgaverne \u201ch\u00e6v 100 kroner fra konto 1\u201d og \u201cs\u00e6t 100 kroner ind p\u00e5 konto 2\u201d. Hvis den f\u00f8rste delopgave g\u00e5r godt (100 kroner h\u00e6ves fra konto 1), men delopgave 2 fejler (pengene kan ikke inds\u00e6ttes p\u00e5 konto 2), bliver indehaveren af konto 1 nok ret utilfreds, hvis han opdager, at pengene er h\u00e6vet fra hans konto, men ikke indsat p\u00e5 modtagerens. Derfor skal det v\u00e6re muligt at s\u00e6tte systemet tilbage i den tilstand, det havde, f\u00f8r transaktionen startede, hvis en delopgave fejler.<\/p>\n<p>Applikationer, der arbejder sammen med transaktionssystemer, best\u00e5r oftest af komponenter. I den forbindelse findes der to forskellige slags komponenter: <em>applikationskomponenter<\/em> og <em>datakomponenter<\/em>.<\/p>\n<p>Applikationskomponenter indeholder forretningslogik. Det vil sige, at det er applikationskomponenterne, der ved, hvordan tingene skal g\u00f8re. For at blive ved bankeksemplet kan et eksempel p\u00e5 en applikationskomponent v\u00e6re en renteberegningskomponent, der tilskriver renter. Komponenten ved, hvordan sammenh\u00e6ngen mellem indskud og rente er, ligesom den ved, at rentesatserne kan afh\u00e6nge af, om kunden er aktion\u00e6r i banken.<\/p>\n<p>Datakomponenter giver adgang til de virkelige data. Det kan for eksempel v\u00e6re kunder og konti. En kundekomponent kunne s\u00e5ledes v\u00e6re ansvarlig for at indl\u00e6se kundens oplysninger fra en database og pr\u00e6sentere dem p\u00e5 en fornuftig m\u00e5de for resten af systemet.<\/p>\n<p>For at h\u00e5ndtere transaktioner har man et transaktionsh\u00e5ndteringssystem. Microsoft Transaction Server (MTS) er et eksempel p\u00e5 et s\u00e5dant system \u2013 MTS vil blive beskrevet yderligere senere. Transaktionsh\u00e5ndteringssystemet sikrer, at transaktionerne har nogle bestemte egenskaber. Disse egenskab kaldes ACID-egenskaberne, der er et akronym af de engelske ord <em>atomicity<\/em>, <em>consistency<\/em>, <em>isolation<\/em> og <em>durability<\/em>.<\/p>\n<p><em>Atomicity<\/em> betyder, at transaktionen er <em>atomar<\/em> \u2013 det vil sige at den enten er fuld\u00f8rt eller slet ikke p\u00e5begyndt.<\/p>\n<p><em>Consistency<\/em> betyder, at fuldf\u00f8relsen af en transaktion altid efterlader systemet i en gyldig tilstand. Hvis systemet er i en gyldig tilstand, n\u00e5r transaktionen starter, skal det ogs\u00e5 v\u00e6re i en gyldig tilstand, n\u00e5r transaktionen er udf\u00f8rt, da transaktionen enten vil v\u00e6re udf\u00f8rt korrekt eller slet ikke p\u00e5begyndt.<\/p>\n<p><em>Isolation<\/em> betyder, at transaktionen har den opfattelse, at den er den eneste, der er under udf\u00f8rsel. Det betyder, at transaktionen ikke beh\u00f8ver at tage h\u00f8jde for, at der kan v\u00e6re andre transaktioner, der arbejder p\u00e5 de samme data. Dette er vigtigt, da det ikke kan garanteres, at systemet har en gyldig tilstand, mens en transaktion er under udf\u00f8rsel. Derfor skal de \u00e6ndringer, en transaktion foretager, holdes skjult for andre transaktioner, indtil man ved, at transaktionen er fuldf\u00f8rt korrekt, og at \u00e6ndringerne derfor er permanente. Havde man ikke denne garanti, kunne man risikere, at transaktion 1 \u00e6ndrede nogle data, som transaktion 2 herefter indl\u00e6ste og arbejdede p\u00e5. Herefter fejler transaktion 1, hvilket som n\u00e6vnt betyder, at de data, transaktionen har \u00e6ndret, skal \u00e6ndres tilbage til de v\u00e6rdier, de havde f\u00f8r. Det vil sige, at de data, transaktion 2 har indl\u00e6st, ikke l\u00e6ngere er korrekte, men det er transaktion 2 ikke klar over. Derfor arbejder denne transaktion videre, og fuldf\u00f8res korrekt, hvorefter transaktionens data gemmes, selv om de egentlig er baserede p\u00e5 forkerte oplysninger. N\u00e5r alle transaktioner er isolerede, kan dette ikke ske.<\/p>\n<p><em>Durability<\/em> betyder, at de \u00e6ndringer, en transaktion foretager, er varende. Det vil sige, at der findes teknikker, som sikrer, at der ikke mistes oplysninger \u2013 heller ikke ved systemnedbrud.<\/p>\n<h2>Microsoft Transaction Server<\/h2>\n<p>Som det fremg\u00e5r af ovenst\u00e5ende, er det ikke en simpel proces at implementere transaktionsstyring. Heldigvis er det meste af arbejdet gjort i programmet Microsoft Transaction Server (MTS). MTS er en del af Microsoft Internet Information Server.<\/p>\n<p>Ved installationen af Microsoft Transaction Server bliver der installeret en genvej ved navn Transaction Server Explorer. Denne genvej starter Microsoft Management Console (MMC). Det er gennem dette program, transaktionsserveren administreres.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0405.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-medium wp-image-497\" title=\"0405\" src=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0405-300x250.png\" alt=\"\" width=\"300\" height=\"250\" srcset=\"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0405-300x250.png 300w, https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0405.png 651w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Figur 4.5: Microsoft Management Console.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>En af transaktionsserverens opgaver er at h\u00e5ndtere komponenter, der kan tilg\u00e5s fra transaktionerne. Man skal derfor tilf\u00f8je komponenterne til transaktionsserveren \u2013 dette g\u00f8res gennem MMC.<\/p>\n<p>I MTS er alle komponenter organiseret i pakker. En pakke komponenter er en gruppe komponenter, der h\u00f8rer logisk sammen \u2013 typisk vil man v\u00e6lge at lade alle komponenter til en applikation ligge i den samme pakke. Vil man oprette en ny applikation, skal man f\u00f8rst oprette en ny pakke. En ny pakke oprettes i MMC ved at h\u00f8jreklikke p\u00e5 punktet Installerede komponenter i venstre del af hovedvinduet i MMC og v\u00e6lge Ny pakke.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0406.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-496\" title=\"0406\" src=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0406.png\" alt=\"\" width=\"465\" height=\"431\" srcset=\"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0406.png 465w, https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0406-300x278.png 300w\" sizes=\"auto, (max-width: 465px) 100vw, 465px\" \/><\/a><\/p>\n<p>Figur 4.6: Tilf\u00f8jelse af en ny pakke i MMC.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>Man bliver herefter spurgt, om man vil oprette en ny pakke eller installere komponenter fra tredjepart. V\u00e6lger man at oprette en tom pakke, bliver man bedt om at indtaste det navn, der skal identificere pakken. Det n\u00e6ste skridt er at v\u00e6lge den bruger, pakken skal afvikles af. Her kan man v\u00e6lge mellem Interaktiv bruger og en bestemt bruger. V\u00e6lger man interaktiv bruger, bliver pakken afviklet under den bruger, der er logget ind p\u00e5 systemet p\u00e5 k\u00f8rselstidspunktet.<\/p>\n<p>N\u00e5r disse sp\u00f8rgsm\u00e5l er besvaret, bliver pakken tilf\u00f8jet til listen over installerede pakker. Den nye pakke indeholder nu to mapper: Komponenter og roller.<\/p>\n<p>For at tilf\u00f8je komponenter skal man h\u00f8jreklikke p\u00e5 mappen komponenter og v\u00e6lge Ny komponent. Dette vil starte guiden Komponent.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0407.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-495\" title=\"0407\" src=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0407.png\" alt=\"\" width=\"465\" height=\"431\" srcset=\"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0407.png 465w, https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0407-300x278.png 300w\" sizes=\"auto, (max-width: 465px) 100vw, 465px\" \/><\/a><\/p>\n<p>Figur 4.7: Guiden Komponent.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>Komponenten giver mulighed for at v\u00e6lge at tilf\u00f8je nye komponenter eller for at importere komponenter, der allerede er registrerede. V\u00e6lger man at tilf\u00f8je en ny komponent, vil man blive bedt om at angive den eller de filer, der indeholder de komponenter, der skal tilf\u00f8jes. Hver gang man tilf\u00f8jer en fil, vil indholdet af filen blive vist i guidens vindue.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0408.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-494\" title=\"0408\" src=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0408.png\" alt=\"\" width=\"465\" height=\"431\" srcset=\"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0408.png 465w, https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0408-300x278.png 300w\" sizes=\"auto, (max-width: 465px) 100vw, 465px\" \/><\/a><\/p>\n<p>Figur 4.8: Tilf\u00f8jelse af en komponent.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>V\u00e6lger man i stedet at tilf\u00f8je komponenter, der allerede er registreret, til ens pakke, bliver man pr\u00e6senteret for en liste over de komponenter, der er registreret p\u00e5 computeren, og man kan v\u00e6lge en eller flere af disse komponenter.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0409.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-493\" title=\"0409\" src=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0409.png\" alt=\"\" width=\"465\" height=\"431\" srcset=\"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0409.png 465w, https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0409-300x278.png 300w\" sizes=\"auto, (max-width: 465px) 100vw, 465px\" \/><\/a><\/p>\n<p>Figur 4.9: Import af komponenter.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>N\u00e5r komponenten er blevet tilf\u00f8jet, kan man se dens navn i tr\u00e6et i venstre side af vinduet. Hvis man g\u00e5r dybere ind i tr\u00e6et, vil man se, at MMC giver mulighed for at se de forskellige komponenters gr\u00e6nseflade \u2013 det vil sige, hvilke metoder de underst\u00f8tter. Denne funktionalitet kan v\u00e6re praktisk, n\u00e5r man skal skrive programmer eller ASP-sider, der anvender komponenterne.<\/p>\n<p>Efter at man har installeret de \u00f8nskede komponenter, kan man konfigurere dem. Det g\u00f8r man ved at v\u00e6lge pakken i venstre side af vinduet, og derefter h\u00f8jreklikke p\u00e5 komponenten i h\u00f8jre side af vinduet. Fra den lokalmenu, der vises, skal man v\u00e6lge Egenskaber. Egenskabsvinduet indeholder tre faner, hvor fanen Transaktion er den mest interessante. Her kan man v\u00e6lge komponentens forhold til transaktioner. Betydningen af de forskellige indstillingsmuligheder bliver gennemg\u00e5et grundigere i n\u00e6ste afsnit \u2013 i dette afsnit er det tilstr\u00e6kkeligt at konkludere, at komponenterne som standard har den indstilling, at de ikke underst\u00f8tter transaktioner. Man b\u00f8r derfor \u00e6ndre denne indstilling, hvis man planl\u00e6gger at bruge komponenten i forbindelse med transaktioner.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0410.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-492\" title=\"0410\" src=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0410.png\" alt=\"\" width=\"404\" height=\"448\" srcset=\"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0410.png 404w, https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/0410-270x300.png 270w\" sizes=\"auto, (max-width: 404px) 100vw, 404px\" \/><\/a><\/p>\n<p>Figur 4.10: Egenskaber for en komponent.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h2>Transaktioner og ASP<\/h2>\n<p>For at en ASP-side kan blive betragtet som en komponent i transaktionssammenh\u00e6ng, er der en r\u00e6kke krav, som skal v\u00e6re opfyldt. Disse krav h\u00e6nger sammen med de ACID-egenskaber, der blev beskrevet tidligere. For at sikre at transaktionerne har disse egenskaber, er det n\u00f8dvendigt, at enhver komponenet i transaktionen angiver, hvorn\u00e5r den er succesfuldt afsluttet. Dette er for at sikre, at transaktionen kan rulles korrekt tilbage.<\/p>\n<p>Som det blev beskrevet i ovenst\u00e5ende afsnit, er MTS bygget op omkring komponenter. Bruger man ASP til at implementere transaktioner, kan man opfatte ASP-siden som en komponent. Det er imidlertid ikke alle ASP-sider, der automatisk bliver til transaktionskomponenter. For at angive, at en side skal v\u00e6re en komponent, skal siden indledes med linien<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;% @TRANSACTION = <em>type<\/em> %&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>Typen angiver den form for komponent, siden skal v\u00e6re. Nedenst\u00e5ende tabel viser, hvilke forskellige typer der findes, og hvad de angiver.<\/p>\n<p>&nbsp;<\/p>\n<table border=\"1\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td width=\"326\" valign=\"top\"><strong>Type<\/strong><\/td>\n<td width=\"326\" valign=\"top\"><strong>Beskrivelse<\/strong><\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">Required<\/td>\n<td width=\"326\" valign=\"top\">Angiver at denne ASP-side   skal afvikles i en transaktion. Hvis der ikke allerede er en transaktion   aktiv, vil MTS oprette en transaktion.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">Requires_New<\/td>\n<td width=\"326\" valign=\"top\">Angiver at ASP-siden skal   afvikles i en ny transaktion. MTS opretter automatisk en ny transaktion.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">Supported<\/td>\n<td width=\"326\" valign=\"top\">Angiver at ASP-siden kan   v\u00e6re en del af en transaktion, men at den ikke n\u00f8dvendigvis skal v\u00e6re det.   MTS starter ikke en ny transaktion, hvis der ikke allerede er en transaktion.<\/td>\n<\/tr>\n<tr>\n<td width=\"326\" valign=\"top\">Not_Supported<\/td>\n<td width=\"326\" valign=\"top\">Angiver at ASP-siden ikke   underst\u00f8tter transaktioner. Hvis siden bliver afviklet som en del af en   transaktion, vil den blive afviklet p\u00e5 samme m\u00e5de, som hvis den ikke var del   af en transaktion.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Tabel 4.6: Oversigt over transaktionstyper<\/p>\n<p>&nbsp;<\/p>\n<p>Almindelige transaktionskomponenter f\u00e5r en lang r\u00e6kke oplysninger af MTS. ASP-sider har ogs\u00e5 mulighed for at f\u00e5 disse oplysninger \u2013 det sker gennem den komponent, der hedder ObjectContext.<\/p>\n<p>ObjectContext-objektet indeholder de metoder, man skal bruge til at angive, at en ASP-side er blevet udf\u00f8rt. Objektet indeholder to metoder: SetComplete og SetAbort. SetComplete-metoden bruges til at angive, at komponenten ikke vil blokere for udf\u00f8rslen for hele transaktionen. Metoden b\u00f8r s\u00e5ledes kaldes, n\u00e5r ASP-siden har udf\u00f8rt sin opgave uden at opdage nogen fejl. SetComplete bliver automatisk udf\u00f8rt, n\u00e5r alle kommandoerne i ASP-siden er blevet udf\u00f8rt, og SetAbort ikke er blevet kaldt. SetAbort bruges nemlig til at angive, at komponenten har opdaget en fejl, som g\u00f8r, at transaktionen skal stoppes og rulles tilbage. Nedenst\u00e5ende eksempel viser, hvordan man kan skrive en simpel ASP-side, som g\u00f8r brug af ObjectContext-objektet.<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;% @transaction = required language = javascript %&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;html&gt;<\/p>\n<p>&lt;body&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%<\/p>\n<p>\/\/ T\u00e6l hvor mange transaktioner der er udf\u00f8rt<\/p>\n<p>Application.lock();<\/p>\n<p>&nbsp;<\/p>\n<p>count = Application(&#8220;transactioncount&#8221;);<\/p>\n<p>if (count == null) {<\/p>\n<p>count = 0;<\/p>\n<p>}<\/p>\n<p>count++;<\/p>\n<p>Application(&#8220;transactioncount&#8221;) = count;<\/p>\n<p>&nbsp;<\/p>\n<p>Application.unlock();<\/p>\n<p>&nbsp;<\/p>\n<p>\/\/ Udf\u00f8r transaktionen<\/p>\n<p>&nbsp;<\/p>\n<p>obj = Server.createObject(&#8220;test.MinKomponent&#8221;);<\/p>\n<p>obj.execute();<\/p>\n<p>&nbsp;<\/p>\n<p>\/\/ Angiv om transaktionen blev udf\u00f8rt korrekt<\/p>\n<p>if (obj.successful()) {<\/p>\n<p>ObjectContext.SetComplete();<\/p>\n<p>Response.write(&#8220;Transaktion fuldf\u00f8rt!&#8221;);<\/p>\n<p>} else {<\/p>\n<p>ObjectContext.SetAbort();<\/p>\n<p>Response.write(&#8220;Transaktionen fejlede!&#8221;);<\/p>\n<p>}<\/p>\n<p>%&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;\/body&gt;<\/p>\n<p>&lt;\/html&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>Eksemplet g\u00f8r brug af en testkomponent \u2013 test.MinKomponent \u2013 som har to metoder: execute og successful. Metoden execute k\u00f8rer komponenten, der udf\u00f8rer selve transaktionen, mens successful angiver, om transaktionen blev udf\u00f8rt korrekt.<\/p>\n<p>Selv om MTS g\u00f8r det muligt at f\u00e5 ASP-sider behandlet som komponenter, er der dog nogle forskelle p\u00e5 den m\u00e5de, ASP-sider og rigtige komponenter behandles p\u00e5. Den v\u00e6sentligste er, at de \u00e6ndringer, siden foretager, ikke automatisk bliver rullet tilbage, hvis transaktionen fejler. For at en transaktion, der indeholder ASP-sider, kan garanteres at have ACID-egenskaberne, er det s\u00e5ledes n\u00f8dvendigt selv at implementere tilbagerulning. De \u00e6ndringer, man foretager gennem objekter oprettet med Server.CreateObject, bliver overv\u00e5get af MTS, og disse \u00e6ndringer bliver derfor automatisk tilbagerullet, hvis transaktionen fejler. Foretager man derimod \u00e6ndringer i sessions- eller applikationsvariabler, er man n\u00f8dt til selv at tilbagerulle \u00e6ndringerne i tilf\u00e6lde af en transaktionsfejl.<\/p>\n<p>For at kunne h\u00e5ndtere tilbagerulning er det n\u00f8dvendigt at vide, om transaktionen er fejlet. N\u00e5r det er afgjort, om en transaktion fejler eller bliver fuldf\u00f8rt, kontrolleres det, om ASP-siden indeholder en af to metoder. Hvis transaktionen bliver fuldf\u00f8rt, bliver metoden OnTransactionCommit udf\u00f8rt. Implementerer man denne metode i sin ASP-side, bliver indeholdet af den automatisk udf\u00f8rt, hvis transaktionen fuldf\u00f8res. Hvis transaktionen derimod fejler, er det metoden OnTransactionAbort, som bliver udf\u00f8rt. I denne metode kan man skrive de kommandoer, der tilbageruller eventuelle \u00e6ndringer foretaget i ASP-siden.<\/p>\n<p>Nedenst\u00e5ende eksempel viser, hvordan man kan lave en ASP-side, der h\u00e5ndterer fuldf\u00f8relse og afbrydelse af en transaktion.<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;% @transaction = supported language = javascript %&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%<\/p>\n<p>\/\/ T\u00e6l hvor mange transaktioner der er udf\u00f8rt<\/p>\n<p>Application.lock();<\/p>\n<p>&nbsp;<\/p>\n<p>count = Application(&#8220;transactioncount&#8221;);<\/p>\n<p>if (count == null) {<\/p>\n<p>count = 0;<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>count++;<\/p>\n<p>Application(&#8220;transactioncount&#8221;) = count;<\/p>\n<p>&nbsp;<\/p>\n<p>Application.unlock();<\/p>\n<p>&nbsp;<\/p>\n<p>\/\/ &#8230;<\/p>\n<p>&nbsp;<\/p>\n<p>function OnTransactionCommit() {<\/p>\n<p>\/\/ registrer at endnu en transaktion er fuldf\u00f8rt<\/p>\n<p>Application.lock();<\/p>\n<p>&nbsp;<\/p>\n<p>count = Application(&#8220;commitcount&#8221;);<\/p>\n<p>count++;<\/p>\n<p>Application(&#8220;commitcount&#8221;) = count;<\/p>\n<p>&nbsp;<\/p>\n<p>Application.unlock();<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>function OnTransactionAbort() {<\/p>\n<p>\/\/ rollback transactioncount<\/p>\n<p>Application.lock();<\/p>\n<p>&nbsp;<\/p>\n<p>count = Application(&#8220;transactioncount&#8221;);<\/p>\n<p>count&#8211;;<\/p>\n<p>Application(&#8220;transactioncount&#8221;) = count;<\/p>\n<p>&nbsp;<\/p>\n<p>Application.unlock();<\/p>\n<p>}<\/p>\n<p>%&gt;<\/p>\n<h1>Sammenfatning<\/h1>\n<p>I dette kapitel er en r\u00e6kke videreg\u00e5ende ASP-teknikker blevet forklaret. Det drejer sig blandt andet om persistent dataopbevaring med anvendelse af filer p\u00e5 serveren, samt midlertidig opbevaring p\u00e5 serveren med sessions- og applikationsbaserede variable.<\/p>\n<p>I kapitlet er det ogs\u00e5 blevet gennemg\u00e5et, hvordan man kan integrere ActiveX-komponenter med sine ASP-programmer. Anvendelse af komponenter i forbindelse med transaktionsstyring er ogs\u00e5 et af de emner, der er blevet forklaret i dette kapitel.<\/p>\n<div style=\"border: 1px solid red; color: red\">\n<p><b>Du l\u00e6ser en gammel bog<\/b><\/p>\n<p>Den bog, du l\u00e6ser her, er fra 1999, og mange ting kan have \u00e6ndret sig siden da.<br \/>\nVi h\u00e5ber, at du stadig kan finde relevant information i den.<br \/>\nHvis du vil l\u00e6se aktuelle oplysninger om den aktuelle version af ASP.NET, anbefaler vi<br \/>\nbogen <a href=\"http:\/\/clk.tradedoubler.com\/click?p(197229)a(2029446)g(19172914)url(http:\/\/www.adlibris.com\/dk\/product.aspx?isbn=0735643385)\" onclick=\"javascript:pageTracker._trackPageview('\/outbound\/article\/http:\/\/clk.tradedoubler.com\/click?p(197229)a(2029446)g(19172914)url(http:\/\/www.adlibris.com\/dk\/product.aspx?isbn=0735643385)');\"  target=\"_blank\">Programming ASP.NET 4.0<\/a><img decoding=\"async\" src=\"http:\/\/impdk.tradedoubler.com\/imp?type(inv)g(19172914)a(2029446)\" \/>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>I dette kapitel vil flere videreg\u00e5ende teknikker indenfor ASP-programmering blive beskrevet. Det drejer sig blandt andet om at udvide ASP-serveren med egne komponenter eller komponenter fra tredjepart. I kapitlet vil det ogs\u00e5 blive beskrevet, hvordan man l\u00e6ser og skriver filer fra ASP-programmer. Kapitlet omhandler ogs\u00e5 transaktioner, som er en udvidelse af det almindelige sessionsbegreb. Endelig [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"parent":452,"menu_order":40,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_monsterinsights_skip_tracking":false,"footnotes":""},"class_list":["post-491","page","type-page","status-publish","hentry"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.0.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"I dette kapitel vil flere videreg\u00e5ende teknikker indenfor ASP-programmering blive beskrevet. Det drejer sig blandt andet om at udvide ASP-serveren med egne komponenter eller komponenter fra tredjepart. I kapitlet vil det ogs\u00e5 blive beskrevet, hvordan man l\u00e6ser og skriver filer fra ASP-programmer. Kapitlet omhandler ogs\u00e5 transaktioner, som er en udvidelse af det almindelige sessionsbegreb. Endelig gennemg\u00e5s ogs\u00e5, hvordan man kan lave indstillinger, der g\u00e6lder for alle ens ASP-sider ved hj\u00e6lp af filen global.asa.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"keywords\" content=\"asp,html,programmering,javascript,tags,active server pages,komponenter,e-mail,asa,microsoft transaction manager,microsoft management console\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/active-server-pages\/kapitel-4-videregaende-asp-programmering\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Biblioteket | Samling af artikler og b\u00f8ger\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Videreg\u00e5ende ASP-programmering | Active Server Pages | Biblioteket\" \/>\n\t\t<meta property=\"og:description\" content=\"I dette kapitel vil flere videreg\u00e5ende teknikker indenfor ASP-programmering blive beskrevet. Det drejer sig blandt andet om at udvide ASP-serveren med egne komponenter eller komponenter fra tredjepart. I kapitlet vil det ogs\u00e5 blive beskrevet, hvordan man l\u00e6ser og skriver filer fra ASP-programmer. Kapitlet omhandler ogs\u00e5 transaktioner, som er en udvidelse af det almindelige sessionsbegreb. Endelig gennemg\u00e5s ogs\u00e5, hvordan man kan lave indstillinger, der g\u00e6lder for alle ens ASP-sider ved hj\u00e6lp af filen global.asa.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/active-server-pages\/kapitel-4-videregaende-asp-programmering\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2011-11-09T06:29:49+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2011-11-09T06:33:10+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Videreg\u00e5ende ASP-programmering | Active Server Pages | Biblioteket\" \/>\n\t\t<meta name=\"twitter:description\" content=\"I dette kapitel vil flere videreg\u00e5ende teknikker indenfor ASP-programmering blive beskrevet. Det drejer sig blandt andet om at udvide ASP-serveren med egne komponenter eller komponenter fra tredjepart. I kapitlet vil det ogs\u00e5 blive beskrevet, hvordan man l\u00e6ser og skriver filer fra ASP-programmer. Kapitlet omhandler ogs\u00e5 transaktioner, som er en udvidelse af det almindelige sessionsbegreb. Endelig gennemg\u00e5s ogs\u00e5, hvordan man kan lave indstillinger, der g\u00e6lder for alle ens ASP-sider ved hj\u00e6lp af filen global.asa.\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/active-server-pages\\\/kapitel-4-videregaende-asp-programmering\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/#listItem\",\"name\":\"B\\u00f8ger\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/#listItem\",\"position\":2,\"name\":\"B\\u00f8ger\",\"item\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/active-server-pages\\\/#listItem\",\"name\":\"Active Server Pages\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/active-server-pages\\\/#listItem\",\"position\":3,\"name\":\"Active Server Pages\",\"item\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/active-server-pages\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/active-server-pages\\\/kapitel-4-videregaende-asp-programmering\\\/#listItem\",\"name\":\"Kapitel 4 Videreg\\u00e5ende ASP-programmering\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/#listItem\",\"name\":\"B\\u00f8ger\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/active-server-pages\\\/kapitel-4-videregaende-asp-programmering\\\/#listItem\",\"position\":4,\"name\":\"Kapitel 4 Videreg\\u00e5ende ASP-programmering\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/active-server-pages\\\/#listItem\",\"name\":\"Active Server Pages\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/#organization\",\"name\":\"Biblioteket\",\"description\":\"Samling af artikler og b\\u00f8ger\",\"url\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/active-server-pages\\\/kapitel-4-videregaende-asp-programmering\\\/#webpage\",\"url\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/active-server-pages\\\/kapitel-4-videregaende-asp-programmering\\\/\",\"name\":\"Videreg\\u00e5ende ASP-programmering | Active Server Pages | Biblioteket\",\"description\":\"I dette kapitel vil flere videreg\\u00e5ende teknikker indenfor ASP-programmering blive beskrevet. Det drejer sig blandt andet om at udvide ASP-serveren med egne komponenter eller komponenter fra tredjepart. I kapitlet vil det ogs\\u00e5 blive beskrevet, hvordan man l\\u00e6ser og skriver filer fra ASP-programmer. Kapitlet omhandler ogs\\u00e5 transaktioner, som er en udvidelse af det almindelige sessionsbegreb. Endelig gennemg\\u00e5s ogs\\u00e5, hvordan man kan lave indstillinger, der g\\u00e6lder for alle ens ASP-sider ved hj\\u00e6lp af filen global.asa.\",\"inLanguage\":\"da-DK\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/active-server-pages\\\/kapitel-4-videregaende-asp-programmering\\\/#breadcrumblist\"},\"datePublished\":\"2011-11-09T08:29:49+02:00\",\"dateModified\":\"2011-11-09T08:33:10+02:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/#website\",\"url\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/\",\"name\":\"Biblioteket\",\"description\":\"Samling af artikler og b\\u00f8ger\",\"inLanguage\":\"da-DK\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Videreg\u00e5ende ASP-programmering | Active Server Pages | Biblioteket","description":"I dette kapitel vil flere videreg\u00e5ende teknikker indenfor ASP-programmering blive beskrevet. Det drejer sig blandt andet om at udvide ASP-serveren med egne komponenter eller komponenter fra tredjepart. I kapitlet vil det ogs\u00e5 blive beskrevet, hvordan man l\u00e6ser og skriver filer fra ASP-programmer. Kapitlet omhandler ogs\u00e5 transaktioner, som er en udvidelse af det almindelige sessionsbegreb. Endelig gennemg\u00e5s ogs\u00e5, hvordan man kan lave indstillinger, der g\u00e6lder for alle ens ASP-sider ved hj\u00e6lp af filen global.asa.","canonical_url":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/active-server-pages\/kapitel-4-videregaende-asp-programmering\/","robots":"max-image-preview:large","keywords":"asp,html,programmering,javascript,tags,active server pages,komponenter,e-mail,asa,microsoft transaction manager,microsoft management console","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BreadcrumbList","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/active-server-pages\/kapitel-4-videregaende-asp-programmering\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek#listItem","position":1,"name":"Home","item":"https:\/\/www.kristiansborg.dk\/bibliotek","nextItem":{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/#listItem","name":"B\u00f8ger"}},{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/#listItem","position":2,"name":"B\u00f8ger","item":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/","nextItem":{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/active-server-pages\/#listItem","name":"Active Server Pages"},"previousItem":{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/active-server-pages\/#listItem","position":3,"name":"Active Server Pages","item":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/active-server-pages\/","nextItem":{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/active-server-pages\/kapitel-4-videregaende-asp-programmering\/#listItem","name":"Kapitel 4 Videreg\u00e5ende ASP-programmering"},"previousItem":{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/#listItem","name":"B\u00f8ger"}},{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/active-server-pages\/kapitel-4-videregaende-asp-programmering\/#listItem","position":4,"name":"Kapitel 4 Videreg\u00e5ende ASP-programmering","previousItem":{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/active-server-pages\/#listItem","name":"Active Server Pages"}}]},{"@type":"Organization","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/#organization","name":"Biblioteket","description":"Samling af artikler og b\u00f8ger","url":"https:\/\/www.kristiansborg.dk\/bibliotek\/"},{"@type":"WebPage","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/active-server-pages\/kapitel-4-videregaende-asp-programmering\/#webpage","url":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/active-server-pages\/kapitel-4-videregaende-asp-programmering\/","name":"Videreg\u00e5ende ASP-programmering | Active Server Pages | Biblioteket","description":"I dette kapitel vil flere videreg\u00e5ende teknikker indenfor ASP-programmering blive beskrevet. Det drejer sig blandt andet om at udvide ASP-serveren med egne komponenter eller komponenter fra tredjepart. I kapitlet vil det ogs\u00e5 blive beskrevet, hvordan man l\u00e6ser og skriver filer fra ASP-programmer. Kapitlet omhandler ogs\u00e5 transaktioner, som er en udvidelse af det almindelige sessionsbegreb. Endelig gennemg\u00e5s ogs\u00e5, hvordan man kan lave indstillinger, der g\u00e6lder for alle ens ASP-sider ved hj\u00e6lp af filen global.asa.","inLanguage":"da-DK","isPartOf":{"@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/#website"},"breadcrumb":{"@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/active-server-pages\/kapitel-4-videregaende-asp-programmering\/#breadcrumblist"},"datePublished":"2011-11-09T08:29:49+02:00","dateModified":"2011-11-09T08:33:10+02:00"},{"@type":"WebSite","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/#website","url":"https:\/\/www.kristiansborg.dk\/bibliotek\/","name":"Biblioteket","description":"Samling af artikler og b\u00f8ger","inLanguage":"da-DK","publisher":{"@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/#organization"}}]},"og:locale":"da_DK","og:site_name":"Biblioteket | Samling af artikler og b\u00f8ger","og:type":"article","og:title":"Videreg\u00e5ende ASP-programmering | Active Server Pages | Biblioteket","og:description":"I dette kapitel vil flere videreg\u00e5ende teknikker indenfor ASP-programmering blive beskrevet. Det drejer sig blandt andet om at udvide ASP-serveren med egne komponenter eller komponenter fra tredjepart. I kapitlet vil det ogs\u00e5 blive beskrevet, hvordan man l\u00e6ser og skriver filer fra ASP-programmer. Kapitlet omhandler ogs\u00e5 transaktioner, som er en udvidelse af det almindelige sessionsbegreb. Endelig gennemg\u00e5s ogs\u00e5, hvordan man kan lave indstillinger, der g\u00e6lder for alle ens ASP-sider ved hj\u00e6lp af filen global.asa.","og:url":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/active-server-pages\/kapitel-4-videregaende-asp-programmering\/","article:published_time":"2011-11-09T06:29:49+00:00","article:modified_time":"2011-11-09T06:33:10+00:00","twitter:card":"summary","twitter:title":"Videreg\u00e5ende ASP-programmering | Active Server Pages | Biblioteket","twitter:description":"I dette kapitel vil flere videreg\u00e5ende teknikker indenfor ASP-programmering blive beskrevet. Det drejer sig blandt andet om at udvide ASP-serveren med egne komponenter eller komponenter fra tredjepart. I kapitlet vil det ogs\u00e5 blive beskrevet, hvordan man l\u00e6ser og skriver filer fra ASP-programmer. Kapitlet omhandler ogs\u00e5 transaktioner, som er en udvidelse af det almindelige sessionsbegreb. Endelig gennemg\u00e5s ogs\u00e5, hvordan man kan lave indstillinger, der g\u00e6lder for alle ens ASP-sider ved hj\u00e6lp af filen global.asa."},"aioseo_meta_data":{"post_id":"491","title":"Videreg\u00e5ende ASP-programmering | Active Server Pages | #site_title","description":"I dette kapitel vil flere videreg\u00e5ende teknikker indenfor ASP-programmering blive beskrevet. Det drejer sig blandt andet om at udvide ASP-serveren med egne komponenter eller komponenter fra tredjepart. I kapitlet vil det ogs\u00e5 blive beskrevet, hvordan man l\u00e6ser og skriver filer fra ASP-programmer. Kapitlet omhandler ogs\u00e5 transaktioner, som er en udvidelse af det almindelige sessionsbegreb. Endelig gennemg\u00e5s ogs\u00e5, hvordan man kan lave indstillinger, der g\u00e6lder for alle ens ASP-sider ved hj\u00e6lp af filen global.asa.","keywords":[{"label":"ASP","value":"ASP"},{"label":"HTML","value":"HTML"},{"label":"programmering","value":"programmering"},{"label":"Javascript","value":"Javascript"},{"label":"tags","value":"tags"},{"label":"Active Server Pages","value":"Active Server Pages"},{"label":"komponenter","value":"komponenter"},{"label":"e-mail","value":"e-mail"},{"label":"asa","value":"asa"},{"label":"Microsoft Transaction Manager","value":"Microsoft Transaction Manager"},{"label":"Microsoft Management Console","value":"Microsoft Management Console"}],"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[],"defaultGraph":"","defaultPostTypeGraph":""},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"location":null,"local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":null,"created":"2020-12-21 06:59:15","updated":"2025-06-04 02:18:23","seo_analyzer_scan_date":null,"focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.kristiansborg.dk\/bibliotek\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/\" title=\"B\u00f8ger\">B\u00f8ger<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/active-server-pages\/\" title=\"Active Server Pages\">Active Server Pages<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tKapitel 4 Videreg\u00e5ende ASP-programmering\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/www.kristiansborg.dk\/bibliotek"},{"label":"B\u00f8ger","link":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/"},{"label":"Active Server Pages","link":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/active-server-pages\/"},{"label":"Kapitel 4 Videreg\u00e5ende ASP-programmering","link":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/active-server-pages\/kapitel-4-videregaende-asp-programmering\/"}],"_links":{"self":[{"href":"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-json\/wp\/v2\/pages\/491","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-json\/wp\/v2\/comments?post=491"}],"version-history":[{"count":4,"href":"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-json\/wp\/v2\/pages\/491\/revisions"}],"predecessor-version":[{"id":506,"href":"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-json\/wp\/v2\/pages\/491\/revisions\/506"}],"up":[{"embeddable":true,"href":"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-json\/wp\/v2\/pages\/452"}],"wp:attachment":[{"href":"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-json\/wp\/v2\/media?parent=491"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}