# Programmeren in ASP.NET/Configuratiebestanden

Alle instellingen in ASP.NET gebeuren met behulp van configuratiebestanden. Dit zijn allemaal tekstbestanden en er zijn er verschillende:
| Naam | Locatie | Bedoeling | Geldig voor |
| web.config | in elke folder | instellingen voor alle code in die folder | de folder (en alle subfolders waar de instelling niet overschreven wordt) |
| global.asax | rootfolder | code om uit te voeren in events die gemeenschappelijk zijn voor de hele applicatie | de gehele applicatie |
| machine.config | binnen de Windows-folder | instellingen voor de hele machine (server) | alle applicaties op de machine |
Het bestand machine.config wordt hier verder niet besproken. Let op als je daar wijzigingen aanbrengt, want een vergissing kan je server helemaal in de war brengen!

## global.asax

In de root van elke webapplicatie kan je een bestand met de naam global.asax plaatsen. Dit bestand bevat de code voor events die gemeenschappelijk zijn voor alle bestanden van de applicatie.
Dit bestand kan er bijvoorbeeld zo uitzien:
global.asax
Je merkt dat het bestand code bevat, met enkele subroutines. Deze subroutines hebben vaste namen, en het zijn eigenlijk events. Ze worden op bepaalde momenten automatisch opgeroepen door de applicatie.
In de lijst hieronder vind je enkele van de beschikbare event procedures:
Event procedures in Global.asax
| Event Procedure | Beschrijving |
| Application_Start | Wordt uitgevoerd wanneer de toepassing start op de server. Dit event kan maar één maal opgeroepen worden. |
| Application_End | Wordt uitgevoerd wanneer de toepassing beëindigd wordt. Wordt gebruikt om indien nodig op te ruimen. |
| Application_Error | Wordt uitgevoerd wanneer een fout optreedt in de toepassing |
| Session_Start | Wordt uitgevoerd wanneer een nieuwe gebruiker op de website binnenkomt |
| Session_End | Wordt uitgevoerd wanneer een gebruikerssessie afgesloten wordt door de gebruiker of door een time-out |
| Application_AuthenticateRequest | Wordt uitgevoerd wanneer een beveiligingsmodule de identiteit van de gebruiker vaststelt |
| Application_AuthorizeRequest | Wordt uitgevoerd wanneer een beveiligingsmodule de gebruikersrechten controleert |
| Application_BeginRequest | Wordt uitgevoerd wanneer ASP.NET start met het verwerken van een request, vooraleer het andere per-request-events verwerkt |
| Application_Disposed | Wordt uitgevoerd wanneer ASP.NET de uitvoering voltooit bij het beantwoorden van een request |
| Application_EndRequest | Wordt uitgevoerd als laatste event na het verwerken van een request na alle andere pre-request-events |
| Application_PreSendRequestContent | Wordt uitgevoerd net voor ASP.NET inhoud naar de client stuurt |
| Application_PreSendRequestHeaders | Wordt uitgevoerd net voor ASP.NET HTTP headers naar de client stuurt |
Geen enkele van deze events is verplicht. Als je ze niet declareert, dan wordt het event gewoon zonder meer uitgevoerd.

## web.config

Een tweede manier om je website in te stellen is via een speciaal bestand in je website, web.config. Dit is een XML-bestand waarin alle instellingen staan die van belang zijn voor je website. Je hoeft dus geen instellingen te doen in de webserver zelf (zoals onder andere bij ASP het geval is). Omdat het een XML-bestand is, kan je het gewoon met Notepad wijzigen.
Voorbeelden van instellingen zijn:
* waarden geven aan constanten die in meerdere pagina's gebruikt worden
* connectiestrengen instellen
* eigen 404-foutpagina's
* aanmelding
* taalinstellingen
* gebruikersrechten
* compilatie-opties
* tracing
* debugging
* enz...
Als je in Visual Studio een web.config-bestand maakt (door daarvoor te kiezen in het New File venster), dan krijg je een bestand met daarin al een hoop uitleg over de verschillende onderdelen van het bestand en de belangrijkste instellingen die je kunt doen.
ASP.NET voorziet een veilige manier om web.config te wijzigen. Ga naar Control Panel-Administrative Tools-Internet Information Services (de configuratie van IIS), rechts-klik op je applicatie en kies properties. Onder de klep “ASP.NET” kan je via “Edit configuration” de instellingen wijzigen.
Op je eigen pc kan je sommige instellingen ook vanuit Visual Studio aanpassen. Kies in het menu Website-ASP.NET configuration-Application.
Alle opties die in een website niet ingesteld zijn worden automatisch overgenomen uit een centrale configuratie voor alle websites op de computer, machine.config. Systeembeheerders kunnen dat bestand eventueel aanpassen om de basisconfiguratie van alle websites aan te passen, en sommige mogelijkheden voor afzonderlijke websites te verbieden.

## Structuur

De root van het XML-bestand is de <configuration>-tag. De basisstructuur voor een web.config bestand zie je hieronder.
De configuratie voor een website bestaat in feite uit drie delen, <connectionStrings>, <appSettings> en <system.web>. Het <connectionStrings>-element geeft de mogelijkheid om connectiestrings in te stellen voor de hele web site. Hierin kan je strings toevoegen door de <add ... /> tag te gebruiken.
Zo kun je bijvoorbeeld de verbindingsstreng voor de database hierin opslaan, zoals ook in het voorbeeld in de web.config die Visual Studio maakt.
Als je deze wilt gebruiken in een pagina, kan je ze met de volgende code opvragen en in een variabele plaatsen:
Declaratief kan je ze ook opvragen:
Het <appSettings>- element geeft de mogelijkheid om waardes of instellingen in de website beschikbaar te maken onder bepaalde namen voor de hele folder. Hierin kan je instellingen toevoegen door de <add ... /> tag te gebruiken.
Zo kun je bijvoorbeeld het e-mail-adres van de administrator instellen:
Als je dit adres wilt gebruiken in een pagina, kan je dit met de volgende code opvragen en in een variabele plaatsen:
Dim strAdres As String = ConfigurationManager.AppSettings("adresAdmin")
Declaratief kan je het ook opvragen:
Het voordeel hiervan is natuurlijk dat je deze instelling maar op één plaats moet wijzigen, maar dat de wijziging ineens voor alle pagina's geldt. De pagina's moeten zelfs niet opnieuw gecompileerd worden, ze halen de nieuwe waarde automatisch op. Het gedeelte <system.web> bevat de daadwerkelijke instellingen van de website. Voor de verschillende instellingen zijn er aparte elementen die alleen bepaalde waardes kunnen hebben. Wijzigingen in web.config worden opgepikt zodra de eerstvolgende pagina opgevraagd wordt.
Opmerkingen
* Elke wijziging in web.config doet de applicatie herstarten. Dit betekent onder andere dat op dat moment alle gebruikers hun Session-instellingen verliezen.
* Zoals alle XML-bestanden is web.config hoofdlettergevoelig.
* Zoals bij alle XML-bestanden heeft witte ruimte geen belang.
Voor meer informatie over deze instellingen: http://msdn.microsoft.com/library/en-us/cpguide/html/cpconaspnetconfiguration.asp Een volledige beschrijving van alle elementen die mogelijk zijn vind je hier: http://msdn.microsoft.com/library/en-us/cpgenref/html/gngrfaspnetconfigurationsectionschema.asp.

## Delen van een website instellen

Bepaalde instellingen die je met web.config kan doen kan je ook toepassen op slechts een deel van de website. In iedere subfolder van de website kan je een web.config bestand plaatsen met daarin instellingen voor die subfolder. Instellingen die niet gemaakt worden in die subfolder, worden overgenomen van de instellingen die gelden voor een folder hoger. Je kunt dus voor iedere subfolder in de website bepaalde instellingen overschrijven. Een voorbeeld hiervan zie je hier: http://www.microsoft.com/netherlands/msdn/aspnet/security.asp. Bovendien kan je sommige instellingen ook nog eens per pagina overschrijven. Dit doe je dan in het Page-directief van die pagina. Deze instellingen hebben dus voorrang op de instellingen in web.config.
Dit is de orde van voorrang (hoe meer naar rechts hoe meer voorrang): machine.config -> web.config root -> web.config subfolder -> Page-directief
Let er wel op dat sommige instellingen alleen in web.config van de rootfolder gedaan kunnen worden (zoals bv. het soort authenticatie). Je krijgt een foutmelding als je deze instelling toch in een submap van de website probeert te gebruiken.

## Een virtuele map maken

Binnen IIS (Internet Information Server) kan je virtuele directory's aanmaken. Een virtuele directory werkt als een snelkoppeling naar een bepaalde folder (die zelfs niet binnen wwwroot hoeft te staan). Bovendien kan je in IIS vele instellingen (zoals beveiliging, default document, enz...) per virtuele directory instellen.
Voorbeeld:
* Maak in de map My Documents een map om je ASPX-bestanden in te zetten, bijvoorbeeld MijnASP.
* Open Control Panel-Administrative Tools-Internet Information Services
* Selecteer het snelmenu van de default Web Site en kies New, Virtual Directory. De Virtual Directory Creation Wizard start op.
* Geef als alias "virtueel" en blader naar de folder MijnASP op je harde schijf. Selecteer de Read- en Script-permissons
* Kopieer een testbestand test.aspx in MijnASP
* Open je browser en typ in: http://localhost/virtueel/test.aspx
* Als het goed is zie je de pagina.
Normaal gezien kan je webserver alleen pagina's tonen die binnen wwwroot staan, maar dankzij de virtuele directory zijn andere folders ook te bereiken (bijvoorbeeld bestanden die in My Documents staan).
Merk op dat de echte folder MijnASP heet, maar in de URL moet je de alias "virtueel" gebruiken! Je zou ook een folder "virtueel2" kunnen maken binnen wwwroot, en die dan ook nog eens instellen als virtuele folder "virtueel2". De virtuele directory verwijst dan niet naar een andere folder, maar het voordeel is dat die folder zijn eigen instellingen kan hebben binnen de website. Soms is dit nodig. Als het geen virtuele folder is, neemt de folder de instellingen over van de "default website" in IIS.

## De website overzetten op de productieserver

Het overzetten van je website van de ontwikkelserver naar de productieserver is heel eenvoudig. Het enige dat je moet doen is alle bestanden die je gemaakt hebt kopiëren naar de productieserver. Je kan dit doen met FTP. Je moet ook alle submappen (bin, images, enz...) kopiëren naar dezelfde submappen op de server (men noemt dit ook wel de XCOPY-overdracht).
Let op: databanken zoals MSDE en SQL Server 2000 bewaren hun bestanden apart, niet binnen de gewone wwwroot. Je kan deze bestanden niet gewoon kopiëren. Deze databanken moet je zelf aanmaken (of laten aanmaken) op de productieserver met behulp van SQL-commando's. Volg daarvoor de instructies van de hostingfirma. SQL Server 2005 ondersteunt wel de XCOPY-overdracht.