Asp.net και server errors


 
Όταν έχουμε μία web εφαρμογή να τρέχει live, υπάρχουν στιγμές όπου ο κώδικας χτυπάει. Συνήθως βλέπουμε την κλασσική κίτρινη “Server Error in /” σελίδα, ή αλλιώς την “Yellow Screen Of Death”. Αυτή η σελίδα, όταν η εφαρμογή βρίσκεται σε localhost, δίνει χρήσιμες πληροφορίες σχετικά με το σφάλμα που προέκυψε. Όταν ένα site είναι στον server δίνει ένα γενικό και αδιάφορο μήνυμα. Αυτή η συμπεριφορά μπορεί να αλλάξει πειράζοντας το <customErrors> tag που βρίσκεται μέσα στο web.config.

Το attribute mode θα πρέπει να ορίζεται RemoteOnly ή On. Αυτές οι επιλογές απενεργοποιούν την server error σελίδα. Στη θέση της εμφανίζεται η σελίδα που θα δώσουμε στο attribute defaultRedirect. Τέλος, το attribute redirectMode ορίζει αν η σελίδα στο defaultRedirect θα φορτώσει είτε κάνοντας ανακατεύθυνση (ResponseRedirect), όπου και θα αλλάξει και το url, ή το url θα μείνει ίδιο και απλά θα φορτωθεί το περιεχόμενο της error. σελίδας (ResponseRewrite).

<customErrors mode="RemoteOnly" redirectMode="ResponseRewrite" defaultRedirect="error.aspx">
    <error statusCode="404" redirect="404.aspx"/>
</customErrors>

Η επιλογή ResponseRewrite βοηθάει στο να δίνουμε σωστό status code όταν κάποιο λάθος συμβαίνει, γράφοντας τον κατάλληλο κώδικα στο error.aspx αρχείο. Τέλος, υπάρχει η δυνατότητα να φορτώσεις διαφορετικές σελίδες για κάθε κωδικό σφάλματος.

Αφού καταφέραμε και κρύψαμε τα λάθη της εφαρμογής μας από τους επισκέπτες του site, πρέπει να βρούμε έναν τρόπο να μαθαίνουμε εμείς για τα errors που έγιναν. Ένα πρώτο βήμα είναι να κρατάμε ένα αρχείο λαθών και εκεί να καταγράφουμε όλη τη σχετική πληροφορία. Μπορούμε είτε να κρατάμε το log αυτό στη ΒΔ είτε σε κάποιο .txt αρχείο.

Η παρακάτω function σώζει όλη τη πληροφορία που έχει ένα Exception object σε ένα πίνακα στη ΒΔ μας.

public void LogError(Exception ex)
{
	SqlCommand myComm = new SqlCommand("INSERT INTO errorlog (logdate, url, errormessage, innerexception, errorsource, errorstacktrace, errortargetsite) VALUES (@logdate, @Url, @ErrorMessage, @InnerException, @ErrorSource, @ErrorStackTrace, @ErrorTargetSite)", myConn);
	myComm.Parameters.Add(new SqlParameter("@logdate", SqlDbType.DateTime)).Value = DateAndTime.Now().ToUniversalTime();
	myComm.Parameters.Add(new SqlParameter("@Url", SqlDbType.NVarChar)).Value = System.Web.HttpContext.Current.Request.Url.AbsoluteUri();
	myComm.Parameters.Add(new SqlParameter("@ErrorMessage", SqlDbType.NVarChar)).Value = ex.Message;
	if (ex.InnerException != null) myComm.Parameters.Add(new SqlParameter("@InnerException", SqlDbType.NVarChar)).Value = ex.InnerException.ToString();
	myComm.Parameters.Add(new SqlParameter("@ErrorSource", SqlDbType.NVarChar)).Value = ex.Source;
	myComm.Parameters.Add(new SqlParameter("@ErrorStackTrace", SqlDbType.NVarChar)).Value = ex.StackTrace;
	myComm.Parameters.Add(new SqlParameter("@ErrorTargetSite", SqlDbType.NVarChar)).Value = ex.TargetSite.ToString();
	myComm.ExecuteNonQuery();
	myComm.Dispose();
}

Η παραπάνω function μπορεί να καλείτε σε κάθε try … catch που έχουμε στον κώδικα. Για να πιάνουμε όμως και τα errors που δεν συμβαίνουν μέσα σε κάποιο try … catch μπορούμε να χρησιμοποιήσουμε τον Application_Error event handler, τον οποίον μπορούμε να γράψουμε μέσα στο Global.asax αρχείο.

public void Application_Error(object sender, EventArgs e)
{
    LogError(Server.GetLastError);
}

Τα παραπάνω βήματα είναι αρκετά χρήσιμα, και καλύπτουν τον developer σε ένα μεγάλο βαθμό. Υπάρχουν περιπτώσεις όμως όπου η εφαρμογή έχει ένα 500 internal server error σφάλμα. Η παραπάνω διαδικασία δεν μπορεί να το χειριστεί, οπότε δεν έχουμε καμία πληροφορία στο log μας. Πρέπει λοιπόν να αλλάξουμε το web.config μας έτσι, ώστε να μας δώσει όλες τις απαραίτητες πληροφορίες ο IIS.

Για τον IIS 6 χρειάζεται να ορίσετε τα παρακάτω:

<configuration>
     <system.web>
        <customErrors mode="Off"/>
         <compilation debug="true"/>
     </system.web>
</configuration>

Για τον IIS 7 χρειάζεται να ορίσετε τα παρακάτω:

<configuration>
     <system.webServer>
        <httpErrors errorMode="Detailed" />
        <asp scriptErrorSentToBrowser="true"/>
     </system.webServer>
     <system.web>
        <customErrors mode="Off"/>
         <compilation debug="true"/>
     </system.web>
 </configuration>

Με τις παραπάνω ρυθμίσεις παίρνετε κάποιο μήνυμα και ένα πιο συγκεκριμένο κωδικό σφάλματος, οπότε με λίγο googling μπορείτε να βρείτε τι φταίει.

Πηγή άρθρου: Handling server errors in asp.net


Τάσος Καραγιάννης
Γίνετε επεξεργασία, Παρακαλώ περιμένετε...
+ 26.8

Ο Συγγραφέας

Twitter Linkedin
Trying to become a web developer since 2008. Struggling with html, css, javascript. Also with asp.net, but that is easy...

Κανενα σχολιο

Αφήστε ένα σχόλιο

You must be logged in to post a comment.