Quello che vi presento è un semplicissimo guestbook realizzato in ASP.NET e che si appoggia ad un database Access per l’archiviazione dei messaggi

Statmentor.NET è un’applicazione completa in C# che consente di implementare in poche mosse un sistema di statistiche per proprio il sito. Il funzionamento è simile a quello dei tanti servizi disponibili per questa funzione. L’applicazione genera automaticamente il codice HTML da inserire nelle pagine da monitorare e da quel momento inizia la sua opera di misurazione degli accessi.

Essenziale il corredo di funzioni. Statmentor.NET conteggia su base temporale i visitatori unici, le pagine viste e tiene traccia dei referer.

Importante la corretta installazione sul server (sul quale dovrà, ovviamente, essere presente il framework .NET). Per prima cosa si dovrà trasferire nella cartella dei database il file statmentor.mdb. Quindi si dovrà modificare una riga del fondamentale file di configurazione Web.config. Il path qui sotto riportato andrà sostituito con quello reale del database:

<add key=”StatMentorConnString” value=”Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\home\xxxxxxx\database\statmentor.mdb” />

Il file Web.config andrà quindi copiato nella root del sito, così come global.asax. Nella cartella bin, in genere presente nella root di tutti i server con supporto .NET, andrà invece trasferita la libreria StatMentorNET.dll. Tutti gli altri file possono essere copiati in una cartella destinata all’applicazione

Quando un’applicazione si trova nella fase di test è molto utile venire a conoscenza di tutti gli errori che si verificano durante l’utilizzo dei visitatori delle nostre pagine ASP.NET.

All’interno del Global.asax troviamo un nuovo evento (che in ASP non esisteva): Application_Error. Questo evento si verifica ogni qualvolta il server va in errore, sia per errori di codice (500), sia per errori di autorizzazione (401) che di pagine non trovate (404).

Con poche righe, è possibile inviarci un’email ogni qualvolta l’evento viene richiamato.


<%@ Application language=”C#” %>

<%@ Import Namespace=”System.Diagnostics” %>

<script runat=”server”>

public void Application_Error(Object sender, EventArgs e) {

StringBuilder strError = new StringBuilder();

int innerLevel = 0;

Exception ex = Server.GetLastError();

strError.Append(“<font face=tahoma size=1>”);

while ( ex != null ) {

strError.AppendFormat(“Application Error (inner={0}): {1}<br><br>”, innerLevel, ex.GetType().Name);

strError.Append( “<b><font size=3 color=#800000>” + ex.Message + “</font></b><br><br>” );

strError.Append( “<b>Source:</b> ” + ex.Source + “<br><br>” );

string strStack = ex.StackTrace;

strStack = strStack.Replace(“\r\n”, “<br>”);

strError.Append( “<b>StackTrace:</b> <table cellspacing=0 cellpadding=2 border=0 bgcolor=#FFFFCC><tr><td><font face=tahoma size=1>” + strStack + “</font></td></tr></table><br>” );

ex = ex.InnerException;

innerLevel++;

}

strError.Append(“Indirizzo IP client: ” + (string) Request.ServerVariables[“REMOTE_ADDR”]);

strError.Append(“</font>”);

// Spedisco l’email con la segnalazione dell’errore

System.Web.Mail.MailMessage mailMessage = new System.Web.Mail.MailMessage();

mailMessage.From = “webmaster@tuosito.com”;

mailMessage.To = “tuocasella@diposta.com”;

mailMessage.Subject = “Si è verificato un errore nel tuo sito”;

mailMessage.BodyFormat = System.Web.Mail.MailFormat.Html;

mailMessage.Body = strError.ToString();

try {

System.Web.Mail.SmtpMail.SmtpServer = “localhost”;

System.Web.Mail.SmtpMail.Send(mailMessage);

Response.Redirect(“PaginaDiErrore.html”); // Rimando il client ad una pagina generica di errore

} catch (Exception ex2) {

// Il sistema non è riuscito ad inviare l’email,

// scrivo il problema nel Debug

Debug.WriteLine( “Eccezione durante l’invio dell’e-mail: ” + ex2.GetType().Name );

Debug.WriteLine( ex2.Message );

Debug.WriteLine( ex2.StackTrace );

}

}

</script>

Per mezzo di questo codice è possibile visualizzare una miniatura dell’immagine indicata via GET:

<%@ Page Language=”C#” %>

<%@ import Namespace=”System.Drawing” %>

<%@ import Namespace=”System.Drawing.Imaging” %>

<%@ import Namespace=”System.Text.RegularExpressions” %>

<script runat=”server”>

int MaxWidth = 100; // Larghezza massima dopo il quale l’immagine viene ridimensionata

int MaxHeight = 100; // Altezza massima dopo il quale l’immagine viene ridimensionata

int ScaleFactor = 20; // Fattore di scala per la miniatura

System.Drawing.Image oldImage, newImage;

void Page_Load(Object sender, EventArgs e) {

if ( Request.QueryString[“FileName”] != null ) {

string strFileName = Convert.ToString(Request.QueryString[“FileName”]);

if ( Request.QueryString[“ScaleFactor”] != null && Convert.ToString(Request.QueryString[“ScaleFactor”]) != “” && IsInteger(Convert.ToString(Request.QueryString[“scalefactor”])) ) ScaleFactor = Convert.ToInt32(Request.QueryString[“ScaleFactor”]);

if ( strFileName != “” ) {

try {

oldImage = System.Drawing.Image.FromFile( Server.MapPath(strFileName) );

if ( oldImage.Width > MaxWidth || oldImage.Height > MaxHeight ) {

// Immagine troppo grande, visualizzo la miniatura

newImage = oldImage.GetThumbnailImage( (oldImage.Width*ScaleFactor/100), (oldImage.Height*ScaleFactor/100), null, IntPtr.Zero);

Response.ContentType = “image/jpeg”;

newImage.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);

oldImage.Dispose();

newImage.Dispose();

oldImage = null;

newImage = null;

} else {

// Immagine piccola, non faccio nulla

Response.ContentType = “image/jpeg”;

oldImage.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);

oldImage.Dispose();

oldImage = null;

}

} catch (Exception ex) {

Response.Write(ex.Message);

}

}

}

}

private bool IsInteger(string strTmp) {

Regex objNotIntPattern = new Regex(“[^0-9-]”);

Regex objIntPattern = new Regex(“^-[0-9]+$|^[0-9]+$”);

return !objNotIntPattern.IsMatch(strTmp) && objIntPattern.IsMatch(strTmp);

}

</script>

Questo codice andrà salvato come file ASPX e dovrà essere richiamato semplicemente con:

<img src=”Pagina.aspx?FileName=Immagine.jpg&ScaleFactor=20″ border=”0″ alt=””>

Questo codice permette di creare un’immagine on the fly utilizzando un file già esistente e inserendo del testo personalizzato sulla stessa immagine.

<%@ Page Language=”C#” %>

<%@ import Namespace=”System.Drawing” %>

<%@ import Namespace=”System.Drawing.Imaging” %>

<%@ import Namespace=”System.IO” %>

<script runat=”server”>

void Page_Load(object sender, EventArgs e) {

CreaImmagine(“http://freeasp.html.it“);

}

void CreaImmagine(string drawString) {

// Importo il file di sfondo

System.Drawing.Image objBitmap =

System.Drawing.Image.FromFile(Server.MapPath(“logo_freeasp.png”));

Graphics objGraphic = Graphics.FromImage(objBitmap);

// Formatto il testo da inserire

Font drawFont = new Font(“Tahoma”, 8);

SolidBrush drawBrush = new SolidBrush(Color.White);

// La posizione del testo

PointF drawPoint = new PointF(50.0F, 80.0F);

// Disegno la stringa di testo sull’immagine

objGraphic.DrawString(drawString, drawFont, drawBrush, drawPoint);

// Imposto la tipologia di output

Response.ContentType = “image/jpeg”;

// Salvo in output l’immagine

objBitmap.Save(Response.OutputStream, ImageFormat.Jpeg);

objBitmap.Dispose();

}

</script>

In grassetto nello script abbiamo evidenziato la scritta che comparirà sotto l’immagine specificata

Questo semplice script permette di formattare direttamente dal codice un datagrid posizionato nella pagina ASPX.

<%@ Page Language=”C#” %>

<%@ import Namespace=”System.Drawing” %>

<script runat=”server”>

void Page_Load(Object sender, EventArgs e) {

string[] arrDati = new string[5] { “HTML.it”, “freeASP.it”, “Flash-MX.it”, “freePHP.it”, “Corsi HTML.it” };

DataGrid1.DataSource = arrDati;

DataGrid1.DataBind();

}

void DataGrid1_ItemCreated(Object sender, DataGridItemEventArgs e) {

if (e.Item.ItemType == ListItemType.Item) {

e.Item.BackColor = Color.FromArgb(105, 139, 185);

for (int i=0; i < DataGrid1.Columns.Count; i++) {

TableCell td = e.Item.Cells[i];

td.CssClass = “nome_classe_css”;

}

}

if (e.Item.ItemType == ListItemType.AlternatingItem) {

e.Item.BackColor = Color.FromArgb(167, 187, 215);

for (int i=0; i < DataGrid1.Columns.Count; i++) {

TableCell td = e.Item.Cells[i];

td.CssClass = “nome_classe_css”;

}

}

}

</script>

<html>

<head>

</head>

<body>

<form runat=”server”>

<asp:DataGrid id=”DataGrid1″ runat=”server” OnItemCreated=”DataGrid1_ItemCreated” ShowHeader=”False”></asp:DataGrid>

</form>

</body>

</html>

Un buon mezzo per evitare richieste al nostro database, è quello di mettere in cache alcune parti del nostro sito. Un esempio può essere una formattazione del testo e dei colori del sito a piacere dell’utente.

In questo caso sarebbe comodo creare un file Xml e metterlo in cache. Quest’ultima poi verrà settata in modo da dipendere dallo stesso file Xml per cui, ogni modifica sul file, farà scadere la cache e quindi il file Xml dovrà essere ricaricato.

Questo breve codice mostra un esempio di utilizzo della Cache:

<%@ Page Language=”C#” %>

<%@ import Namespace=”System.Data” %>

<%@ import Namespace=”System.IO” %>

<%@ import Namespace=”System.Web.Caching” %>

<script runat=”server”>

void Page_Load(Object sender, EventArgs e) {

/*

//Inserire il codice per popolare il datagrid nella pagina.

//Segue un codice di esempio

//——————————————————–

DataView myDataView = (DataView) GetDataViewFromCache();

DataTable myDataTable = myDataView.Table;

DataGrid1.DataSource = myDataTable.DefaultView;

DataGrid1.DataBind();

//——————————————————–

*/

}

private DataView GetDataViewFromCache() {

if ( Cache[“FileInCache”] == null ) InsertCache();

DataView dv = (DataView) Cache[“FileInCache”];

return dv;

}

private void InsertCache() {

//Metto in cache il file Xml

DataSet myDs = new DataSet();

FileStream fileXmlData;

fileXmlData = new FileStream( Server.MapPath(“xml/nomeFile.xml”), FileMode.Open, FileAccess.Read );

myDs.ReadXml(fileXmlData);

Cache.Insert(“FileInCache”,

new DataView(myDs.Tables[0]),

new CacheDependency( Server.MapPath(“xml/nomeFile.xml”) ) );

fileXmlData.Close();

}

</script>

<html>

<head>

</head>

<body>

<form runat=”server”>

<asp:DataGrid id=”DataGrid1″ runat=”server”></asp:DataGrid>

</form>

</body>

</html>