Alkampfer's Place

Thursday, November 16, 2006, 01:48 AM - Asp.Net
Per chi non lo conoscesse ELMAH è un modulo per effettuare il log degli errori nelle applicazioni asp.net. Fornito di codice sorgente, basta abilitarlo con qualche riga nel web config ed ogni eccezione non gestita che verrà generata nel vostro sito sarà catalogata nel database e può essere esaminata in dettaglio sempre grazie al modulo ELMAH.

Il prodotto è naturalmente freeware e salva una grande quantità di informazioni anche se tralascia qualche informazione importante tipo le variabili di sessione che possono però essere aggiunte intervenendo direttamente sui sorgenti.

Prossimamente, cercherò di pubblicare un mini tutorial su come estendere elmah per effettuare il log di altre informazioni non attualmente tracciate da questo prodotto.

Alk.

Wednesday, November 15, 2006, 08:49 AM - ADO.NET
In un sito che stavamo sviluppando improvvisamente in produzione inizia ad apparire questo errore

Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool

Questo errore viene generato quando nel codice si apre manualmente una connessione e si dimentica di chiamare il dispose, in questo caso la connessione non viene mai tornata al pool di connessioni che piano piano si esaurisce.

Come individuarlo
Il modo più rapido è utilizzare il perfmon.exe che ha al suo interno appositi contatori dedicati al monitoraggio, li trovate sotto le categorie .NET data provider for SqlServer o .NET CLR DATA. In questo modo potete navigare e vedere quando qualche pagina non rilascia le connessioni, in questo caso infatti ci saranno pagine o operazioni che aumentano sempre il numero di connessioni nel pool. Il contatore sicuramente che amo di più è il NumberOfReclaimedConnections che indica, come dice questo articolo, quante volte una connessione è stata liberata dal garbage collector. Se ci sono leak questo valore è maggiore di zero e basta guardare quale pagina lo fa aumentare per restringere il campo di ricerca.

Per evitare questo problema è sempre bene fare i test di carico dei propri siti, questo perché il pool tiene 100 connessioni e spesso in fase di sviluppo questi errori potrebbero non essere notati se non si utilizza il perfmon, ma con un test di carico si evidenziano quasi sempre.

Utilizzate sempre Try ..finally o la clausola using per assicurarvi che le connessioni siano sempre rilasciate.
Fate inoltre molta attenzione perché non solo le connessioni ma anche tutti gli altri oggetti di accesso ai dati ed in particolar modo il datareader debbono essere chiusi o rilasciati.

Alk.

EDIT: Un buon articolo sull'argomento che ho trovato oggi è questo vale la pena leggerlo.

Tuesday, November 14, 2006, 02:30 AM - Asp.Net
Per chi fosse interessato in dotnetmarche ho pubblicato un articoletto con alcune considerazioni sul cache di pagina. Se vi interessa andateci a vedere.

Alk.

Monday, November 13, 2006, 09:02 AM ( 18 views )
Vediamo come si comporta il sito con le emoticon.

:lol: :no: :grr: :sob:

Alk.

Monday, November 13, 2006, 08:28 AM - Asp.Net
Stamane stavo lavorando su un progetto asp.net, ad un certo punto mi accorgo di un bug, una gridView perde il viewState senza nessuna ragione. Dopo un po di debug scopro che se nell'evento Init della pagina si accede alla proprietà controls della gridView, questo invalida il viewState in qualche modo e la gridView non ripristina i suoi valori corretti.

La pagina seguente ripresenta il problema, è una cosa che rende perplesso solo me? :)

Nell'esempio viene semplicemente caricata una gridView e nell'evento Init viene fatto un trace del numero di eventi presenti nella collezione controls, questo per far capire che basta accedere alla proprietà perchè il viewState non funzioni più.

Alk.

 

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="my.aspx.vb" Inherits="TestPages_my" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<
html xmlns="http://www.w3.org/1999/xhtml" >

<head runat="server">

    <title>Untitled Page</title>

</head>

<body>

    <form id="form1" runat="server">

    <div>

          <asp:GridView ID="GridView2" runat="server">

         </asp:GridView>

    </div>

       <asp:Button ID="Button1" runat="server" Text="Button" />

    </form>

</body>

</html>

 

<script runat="server">

 

   Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init

      Trace.Write(GridView2.Controls.Count.ToString)

   End Sub

  

   Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

      If Not Me.IsPostBack Then

         Dim coll As New System.Collections.Generic.List(Of Integer)

         coll.Add(12)

         GridView2.DataSource = coll

         GridView2.DataBind()

      End If

   End Sub

  

</script>

Gian Maria 



Back Next