De bedoeling van dit topic is om een aantal tips en best practises over ASP.NET met elkaar te sharen.
Vul dit topic gerust aan en lever gerust (onderbouwde) kritiek op de items die hier geplaatst zijn.
Laad en bewaar sessie-variabelen op een gecentraliseerde plaats
Aangezien sessie-variabeles case-sensitive zijn, kunnen er wel eens problemen opduiken als je niet nauwgezet bezig bent. Stel bv, dat je een sessie-variabele maakt met de naam "MySessionVar".
Op een later ogenblik wil je die variabele opnieuw uitlezen, maar je typed het volgende:
Hier zit je dus met een probleem. MySessionVar en MySessionvar zijn nl. niet hetzelfde. De compiler gaat hier ook niet over klagen.
Om dit probleem binnen de perken te houden, ga je dus best je sessie-variabelen op een centrale plaats gaan ophalen en opnieuw bewaren.
Je kunt je sessie-variabelen dus het best ophalen in je Page.OnLoad event omdat dit event altijd getriggered wordt als er een pagina geladen wordt.
De sessie-variabelen opnieuw bewaren kan je best doen in de Page.OnUnLoad event. Deze event wordt nl. getriggered als andere events uitgevoerd zijn.
Maak gebruik van Stored Procedures
Gebruik zoveel mogelijk gebruik van stored procedures om data op te halen en te bewerken.
Aangezien het DBMS het beste execution plan voor die procedure bewaart (en dus niet steeds opnieuw hoeft na te gaan wat het beste execution plan voor die query is), is dat dus een zeer snelle manier om queries uit te voeren.
Je kan ook verschillende bij elkaar horende queries groeperen in 1 procedure. Op die manier spaar je een aantal roundtrips naar de DB server uit, wat de performance ook zeker ten goede komt.
Naast de performance winst, kunnen Stored Procedures ook de veiligheid ten goede komen. Door gebruik te maken van parameters kan je nl. al SQL injection attacks voorkomen, en hoef je de waarden die je aan je query meegeeft niet meer te controleren op illegal characters.
bv:
Zal geen problemen opleveren, en zal gewoon een nieuw record maken met een Naam "1;delete from tblPersons;".
Maak gebruik van caching
Er zijn verschillende manier om caching te implementeren:
Page Output Caching
Fragment Caching
Caching van variabelen/objecten
Als je een aspx pagina hebt waarvan je weet dat de inhoud niet erg onderhevig is aan verandering, dan kan je die pagina cachen. Het cachen van de pagina zorgt ervoor dat bij een volgende request de webserver geen diskaccess of processing meer moet doen om de pagina naar de client te sturen. Hij wordt gewoon vanuit z'n geheugen aan de client geserveerd.
Page Caching implementeren doe je door volgende directive aan je page toe te voegen:
Bovenstaande regel zorgt ervoor dat de pagina gedurende 5 seconden gecached wordt.
Je kan ook variabelen en objecten cachen. Dit doe je door gebruik te maken van het Cache object.
Aan zo'n gecachede variabele kan je ook een dependency toekennen. Stel bv dat je een configuratie file hebt die je inleest en die je graag in je cache zou willen hebben om zo snel bepaalde instellingen te kunnen uitlezen.
Als je iets aan die configuratie-file veranderd, dan is je gecachede object natuurlijk waardeloos. Je kan dit oplossen door van die config-file een dependency te maken van je gecachede object. Als er dan iets aan die config-file veranderd, dan wordt het gecachete object weggegooid.
Je kan ook data uit een databank gaan cachen. Echter, je kan niet zomaar een dependency maken op een tabel in je databank. Als de data in je databank dan veranderd, dan is de gecachete data eigenlijk waardeloos.
Je kan dit echter oplossen door gebruik te maken van triggers en extended stored procedures. Jeff Prosise heeft er een interessant artikel over geschreven dat je hier vindt.
Connection pooling
Het maken van een connectie naar een databank is een expensive cost die op de performance van je site kan wegen.
Je kan echter gebruik maken van connection pooling om deze kost tot een minimum te herleiden.
.NET kan automatisch voor connection pooling zorgen. Er moet dan wel aan een tweetal voorwaarden voldaan worden:
Connecties kunnen pas in eenzelfde connection-pool ondergebracht worden als ze identieke connectionstrings hebben. Zelfs een klein verschil kan er al toe leiden dat een connection niet gepooled kan worden. Om dit dus te voorkomen ga je het best je connectionstring in een centrale plaats gaan opslaan.
De web.config is daar ideaal voor.
Je kan een sectie <appSettings> in je web.config maken waar je een aantal keys in kwijt kunt:
Als je nu een nieuwe connectie moet aanmaken, kan je dat eenvoudig doen:
Een bijkomend voordeel van deze aanpak is, dat je je connectionstring slechts op 1 plaats hoeft te wijzigen mocht dat nodig zijn.
Een andere vereiste om gebruik te kunnen maken van connection pooling is, dat je je connectie sluit van zodra je ze niet meer nodig hebt. Op die manier kan ze aan een connection-pool toegevoegd worden.
Een bijkomend voordeel van deze 'disconnected' aanpak is dat je code veel schaalbaarder zal zijn.
Vul dit topic gerust aan en lever gerust (onderbouwde) kritiek op de items die hier geplaatst zijn.
Laad en bewaar sessie-variabelen op een gecentraliseerde plaats
Aangezien sessie-variabeles case-sensitive zijn, kunnen er wel eens problemen opduiken als je niet nauwgezet bezig bent. Stel bv, dat je een sessie-variabele maakt met de naam "MySessionVar".
code:
1
| Session["MySessionVar"] = 1; |
Op een later ogenblik wil je die variabele opnieuw uitlezen, maar je typed het volgende:
code:
1
| int i = (int)Session["MySessionvar"]; |
Hier zit je dus met een probleem. MySessionVar en MySessionvar zijn nl. niet hetzelfde. De compiler gaat hier ook niet over klagen.
Om dit probleem binnen de perken te houden, ga je dus best je sessie-variabelen op een centrale plaats gaan ophalen en opnieuw bewaren.
Je kunt je sessie-variabelen dus het best ophalen in je Page.OnLoad event omdat dit event altijd getriggered wordt als er een pagina geladen wordt.
De sessie-variabelen opnieuw bewaren kan je best doen in de Page.OnUnLoad event. Deze event wordt nl. getriggered als andere events uitgevoerd zijn.
Maak gebruik van Stored Procedures
Gebruik zoveel mogelijk gebruik van stored procedures om data op te halen en te bewerken.
Aangezien het DBMS het beste execution plan voor die procedure bewaart (en dus niet steeds opnieuw hoeft na te gaan wat het beste execution plan voor die query is), is dat dus een zeer snelle manier om queries uit te voeren.
Je kan ook verschillende bij elkaar horende queries groeperen in 1 procedure. Op die manier spaar je een aantal roundtrips naar de DB server uit, wat de performance ook zeker ten goede komt.
Naast de performance winst, kunnen Stored Procedures ook de veiligheid ten goede komen. Door gebruik te maken van parameters kan je nl. al SQL injection attacks voorkomen, en hoef je de waarden die je aan je query meegeeft niet meer te controleren op illegal characters.
bv:
code:
1
2
3
4
5
6
7
8
9
10
11
| SqlCommand cmdAddRecord = new SqlCommand (); cmdAddRecord.Connection = conn; cmdAddRecord.CommandType = CommandType.StoredProcedure; cmdAddRecord.CommandText = "INSERT_PERSON"; cmdAddRecord.Parameters.Add ("@p_Name", SqlDbType.VarChar); cmdAddRecord.Parameters["@p_Name"].Value = "1;delete from tblPersons;"; cmdAddRecord.ExecuteNonQuery(); |
Zal geen problemen opleveren, en zal gewoon een nieuw record maken met een Naam "1;delete from tblPersons;".
Maak gebruik van caching
Er zijn verschillende manier om caching te implementeren:
Page Output Caching
Fragment Caching
Caching van variabelen/objecten
Als je een aspx pagina hebt waarvan je weet dat de inhoud niet erg onderhevig is aan verandering, dan kan je die pagina cachen. Het cachen van de pagina zorgt ervoor dat bij een volgende request de webserver geen diskaccess of processing meer moet doen om de pagina naar de client te sturen. Hij wordt gewoon vanuit z'n geheugen aan de client geserveerd.
Page Caching implementeren doe je door volgende directive aan je page toe te voegen:
code:
1
| <%@ OutputCache Duration="5" VaryByParam="none" %> |
Bovenstaande regel zorgt ervoor dat de pagina gedurende 5 seconden gecached wordt.
Je kan ook variabelen en objecten cachen. Dit doe je door gebruik te maken van het Cache object.
Aan zo'n gecachede variabele kan je ook een dependency toekennen. Stel bv dat je een configuratie file hebt die je inleest en die je graag in je cache zou willen hebben om zo snel bepaalde instellingen te kunnen uitlezen.
Als je iets aan die configuratie-file veranderd, dan is je gecachede object natuurlijk waardeloos. Je kan dit oplossen door van die config-file een dependency te maken van je gecachede object. Als er dan iets aan die config-file veranderd, dan wordt het gecachete object weggegooid.
Je kan ook data uit een databank gaan cachen. Echter, je kan niet zomaar een dependency maken op een tabel in je databank. Als de data in je databank dan veranderd, dan is de gecachete data eigenlijk waardeloos.
Je kan dit echter oplossen door gebruik te maken van triggers en extended stored procedures. Jeff Prosise heeft er een interessant artikel over geschreven dat je hier vindt.
Connection pooling
Het maken van een connectie naar een databank is een expensive cost die op de performance van je site kan wegen.
Je kan echter gebruik maken van connection pooling om deze kost tot een minimum te herleiden.
.NET kan automatisch voor connection pooling zorgen. Er moet dan wel aan een tweetal voorwaarden voldaan worden:
Connecties kunnen pas in eenzelfde connection-pool ondergebracht worden als ze identieke connectionstrings hebben. Zelfs een klein verschil kan er al toe leiden dat een connection niet gepooled kan worden. Om dit dus te voorkomen ga je het best je connectionstring in een centrale plaats gaan opslaan.
De web.config is daar ideaal voor.
Je kan een sectie <appSettings> in je web.config maken waar je een aantal keys in kwijt kunt:
code:
1
2
3
| <appSettings> <add key="connectionString" value="initial catalog=....."/> </appSettings> |
Als je nu een nieuwe connectie moet aanmaken, kan je dat eenvoudig doen:
code:
1
2
3
| SqlConnection conn = new SqlConnection (System.Configuration. ConfigurationSettings. AppSettings["connectionString"]); |
Een bijkomend voordeel van deze aanpak is, dat je je connectionstring slechts op 1 plaats hoeft te wijzigen mocht dat nodig zijn.
Een andere vereiste om gebruik te kunnen maken van connection pooling is, dat je je connectie sluit van zodra je ze niet meer nodig hebt. Op die manier kan ze aan een connection-pool toegevoegd worden.
Een bijkomend voordeel van deze 'disconnected' aanpak is dat je code veel schaalbaarder zal zijn.
https://fgheysels.github.io/