<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>denisbilli.it &#187; ASP</title>
	<atom:link href="http://blog.denisbilli.it/category/programmazione/asp/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.denisbilli.it</link>
	<description>esperienze di vita di un informatico</description>
	<lastBuildDate>Thu, 06 May 2010 21:55:15 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Operazione JOIN tra File di Database Access Diversi</title>
		<link>http://blog.denisbilli.it/operazione-join-file-mdb-access-diversi/</link>
		<comments>http://blog.denisbilli.it/operazione-join-file-mdb-access-diversi/#comments</comments>
		<pubDate>Thu, 04 Jun 2009 11:00:17 +0000</pubDate>
		<dc:creator>Denis</dc:creator>
				<category><![CDATA[ASP]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[access]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[differenti]]></category>
		<category><![CDATA[diversi]]></category>
		<category><![CDATA[file]]></category>
		<category><![CDATA[join]]></category>
		<category><![CDATA[mdb]]></category>
		<category><![CDATA[microsoft]]></category>
		<category><![CDATA[operazione]]></category>

		<guid isPermaLink="false">http://blog.denisbilli.it/?p=1548</guid>
		<description><![CDATA[Per motivi vari mi sono ritrovato a dover fare un&#8217;operazione di JOIN tra tabelle presenti in database diversi, ovvero in file mdb differenti. La cosa, seppur molto sporca a livello logico, mi era inevitabile e quindi sono dovuto ricorrere a quei trucchi che solo il dialetto SQL di MS Access permette. È infatti assolutamente possibile [...]]]></description>
			<content:encoded><![CDATA[<p><div style="float: right; margin-top: -5px;"><script type="text/javascript"><!--
google_ad_client = "pub-8461338432937674";
/* 250x250, creato 18/03/09 */
google_ad_slot = "9778664009";
google_ad_width = 250;
google_ad_height = 250;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div></p><p style="text-align: left; "><img class="aligncenter size-thumbnail wp-image-1380 thumb thumbleft" title="sql" src="http://blog.denisbilli.it/wp-content/uploads/2008/03/sql-150x87.jpg" alt="sql" width="150" height="87" />Per motivi vari mi sono ritrovato a dover fare un&#8217;<strong>operazione di JOIN tra tabelle presenti in database diversi</strong>, ovvero in file mdb differenti. La cosa, seppur molto sporca a livello logico, mi era inevitabile e quindi sono dovuto ricorrere a quei trucchi che solo il dialetto SQL di MS Access permette.</p>
<p style="text-align: left; ">È infatti assolutamente possibile fare questa operazione per mezzo di una semplice operazione di SELECT particolare. Supponiamo di avere il database contenente le varie informazioni utente (<strong>database.mdb nella tabella users</strong>) da mostrare ed in un database separato le politiche di accesso (<strong>tabella tbGrants nel database corrente</strong>) ai dati divise per utenti.</p>
<p style="text-align: left; ">Per poter avere la lista dei record a cui può accedere l&#8217;utente corrente (che supponiamo essere un <em>intero </em>uguale 1), dobbiamo fare quanto segue:</p>
<p style="text-align: left; ">
<pre class="brush: sql;">
SELECT * FROM tbGrants LEFT OUTER JOIN [;Database=\mdb-database\database.mdb;].users ON users.ID=tbGrants.userId WHERE tbGrants.userId=1
</pre>
<p>Fatto. Facile no? <img src="http://blog.denisbilli.it/wp-includes/images/emoticons/ok.gif" class="wp-smiley" alt="ok emoticon" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.denisbilli.it/operazione-join-file-mdb-access-diversi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Problemi con la SELECT TOP in MS Access</title>
		<link>http://blog.denisbilli.it/problemi-con-la-select-top-in-ms-access/</link>
		<comments>http://blog.denisbilli.it/problemi-con-la-select-top-in-ms-access/#comments</comments>
		<pubDate>Tue, 19 May 2009 07:00:29 +0000</pubDate>
		<dc:creator>Denis</dc:creator>
				<category><![CDATA[ASP]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[access]]></category>
		<category><![CDATA[istruzione]]></category>
		<category><![CDATA[limit]]></category>
		<category><![CDATA[problema]]></category>
		<category><![CDATA[top]]></category>

		<guid isPermaLink="false">http://blog.denisbilli.it/?p=1498</guid>
		<description><![CDATA[Per chi crea siti Web capita prima o poi di trovarsi davanti ad un problema insormontabile: lavorare in ASP+Access, l&#8217;accoppiata vincente di Microsoft oramai superata in tutto e per tutto dal binomio PHP+MySQL. Tuttavia non tutto è perduto e ci armiamo di buona pazienza in modo da far funzionare tutto per il meglio, quando ecco [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-thumbnail wp-image-1380 thumb thumbleft" title="sql" src="http://blog.denisbilli.it/wp-content/uploads/2008/03/sql-150x87.jpg" alt="sql" width="150" height="87" />Per chi crea siti Web capita prima o poi di trovarsi davanti ad un problema insormontabile: lavorare in <strong>ASP+Access</strong>, l&#8217;accoppiata vincente di Microsoft oramai superata in tutto e per tutto dal binomio <strong>PHP+MySQL</strong>. Tuttavia non tutto è perduto e ci armiamo di buona pazienza in modo da far funzionare tutto per il meglio, quando ecco sorgere problemi insospettabili. Supponiamo ad esempio di <em>voler caricare dal DB un numero limitato di risultati di una query</em>, caso tipico della<strong> LIMIT di MySQL</strong> e della <strong>TOP per i sistemi Microsoft</strong>, ad esempio per un sistema di visualizzazione delle news. Supponendo di avere un codice SQL del tipo:</p>
<pre class="brush: sql;">
SELECT TOP 5 * FROM tbEventi ORDER BY Data DESC
</pre>
<p>Ci aspettiamo che il codice qui sopra carichi dal DB esattamente i primi 5 risultati delle news ordinate per data. Cosa accade però se in lista ci sono più eventi della stessa giornata dei quali non abbiamo definito un ordinamento? Un caso d&#8217;esempio della tabella <strong>tbEventi </strong>è questo qui sotto:</p>
<pre>ID	Titolo	Testo	Data
----------------------------------
1	Titolo1	Testo1	19/05/2009
2	Titolo2	Testo2	19/05/2009
3	Titolo3	Testo3	18/05/2009
4	Titolo4	Testo4	17/05/2009
5	Titolo5	Testo5	17/05/2009
6	Titolo6	Testo6	17/05/2009
7	Titolo7	Testo7	16/05/2009
8	Titolo8	Testo8	16/05/2009</pre>
<p>In questo caso avrete come risultato della query questo:</p>
<pre>ID	Titolo	Testo	Data
----------------------------------
1	Titolo1	Testo1	19/05/2009
2	Titolo2	Testo2	19/05/2009
3	Titolo3	Testo3	18/05/2009
4	Titolo4	Testo4	17/05/2009
5	Titolo5	Testo5	17/05/2009
6	Titolo6	Testo6	17/05/2009
7	Titolo7	Testo7	16/05/2009
8	Titolo8	Testo8	16/05/2009</pre>
<p>Che è esattamente la tabella iniziale. Come mai? E&#8217; molto semplice, a date uguali viene data la stessa importanza, si verifica cioè un <strong>aexequo </strong>che porta come risultato l&#8217;uscita di tutte le entry con le prime 5 date disponibili, ed in questo caso avremo il 19, il 18, il 17 ed il 16 maggio.</p>
<h2>Come risolvere?</h2>
<p>Facile, ci sono 2 modi: o definiamo un secondo modo di ordinamento, come questo:</p>
<pre class="brush: sql;">
SELECT TOP 5 * FROM tbEventi ORDER BY Data, Titolo DESC
</pre>
<p>In modo da permettere all&#8217;engine di discriminare tra entry della stessa data, oppure in una maniera più &#8220;sporca&#8221; facendo una sotto-query:</p>
<pre class="brush: sql;">
SELECT TOP 5
FROM (SELECT TOP 5 * FROM tbEventi ORDER BY Data DESC)
ORDER BY Data DESC
</pre>
<p>Fine. Se vi vengono in mente altre modalità per risolvere il problema, fatemelo sapere!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.denisbilli.it/problemi-con-la-select-top-in-ms-access/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Attivare l&#8217;interprete ASP su IIS7 in Windows Vista</title>
		<link>http://blog.denisbilli.it/attivare-interprete-asp-su-iis-7-in-windows-vista/</link>
		<comments>http://blog.denisbilli.it/attivare-interprete-asp-su-iis-7-in-windows-vista/#comments</comments>
		<pubDate>Fri, 20 Feb 2009 07:00:26 +0000</pubDate>
		<dc:creator>Denis</dc:creator>
				<category><![CDATA[ASP]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[404.3]]></category>
		<category><![CDATA[7]]></category>
		<category><![CDATA[errore]]></category>
		<category><![CDATA[funzionalità di windows]]></category>
		<category><![CDATA[gestore]]></category>
		<category><![CDATA[iis]]></category>
		<category><![CDATA[mapping]]></category>
		<category><![CDATA[problema]]></category>
		<category><![CDATA[vista]]></category>
		<category><![CDATA[webserver]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blog.denisbilli.it/?p=1182</guid>
		<description><![CDATA[Quante volte ci troviamo a testare i nostri siti web ASP in locale per evitare di mostrarli al pubblico prima del tempo? Direi davvero tante volte e fino a qualche anno fa avevamo la possibilità di farlo per mezzo di IIS 5, che era già pre-installato sul sistema. Con Windows XP avevamo assistito ad un [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-thumbnail wp-image-325 thumb thumbleft" title="Logo di Vista" src="http://blog.denisbilli.it/wp-content/uploads/2008/08/vista-logo-150x150.jpg" alt="Logo di Vista" width="87" height="87" /></p>
<p>Quante volte ci troviamo a testare i nostri siti web ASP in locale per evitare di mostrarli al pubblico prima del tempo? Direi davvero tante volte e fino a qualche anno fa avevamo la possibilità di farlo per mezzo di IIS 5, che era già pre-installato sul sistema. Con Windows XP avevamo assistito ad un passo indietro non indifferente, ovvero il fatto che sulla maggior parte dei PC portatili era installato <a href="http://blog.denisbilli.it/2007/12/22/webserver-asp-gratuito/" target="_blank">Windows XP Home che non aveva ISS installato ed era perciò necessario affidarsi a programmi esterni, come BabyWebServer</a>.</p>
<p>Con Windows Vista invece, la storia cambia e <strong>IIS7 arriva già installato nel sistema</strong> e per farlo funzionare basta semplicemente <strong>attivarlo da Pannello di Controllo</strong>.</p>
<p><span class="more-link-text">(Vediamo insieme come fare.)</strong></p>
<p><span id="more-1182"></span></p>
<p>Per poter utilizzare IIS 7 per gestire le nostre pagine ASP dobbiamo attivare la relativa funzionalità. Andiamo perciò in <strong>Pannello di Controllo → Programmi</strong> e clicchiamo su<strong> Attivazione o disattivazione delle funzionalità di Windows</strong>. </p>
<p style="text-align: center;"><img class="size-medium wp-image-1184 aligncenter" title="vista-attivazione-funz-windows" src="http://blog.denisbilli.it/wp-content/uploads/2009/02/vista-attivazione-funz-windows-450x93.jpg" alt="vista-attivazione-funz-windows" width="450" height="93" /></p>
<p>A questo punto si aprirà una finestra nella quale dobbiamo andare a spuntare la voce ASP che si trova in<strong> Internet Information Services → Servizi Web → Funzionalità per lo sviluppo delle applicazioni → ASP</strong>, come da immagine:</p>
<p style="text-align: center;"><img class="size-medium wp-image-1185 aligncenter" title="vista-attivazione-asp" src="http://blog.denisbilli.it/wp-content/uploads/2009/02/vista-attivazione-asp-273x339.jpg" alt="vista-attivazione-asp" width="273" height="339" /></p>
<p style="text-align: left;">A questo punto possiamo testare tutte le pagine che vogliamo, il pannello di controllo di IIS7 è veramente intuitivo e assolve molto bene il suo compito. Semmai aveste bisogno di aiuto, chiedete pure nei commenti. Possiamo perciò dire che possiamo aggiungere un 11-esimo punto alla lista dei <a href="http://www.technonewsblog.com/microsoft/windows-microsoft/664/10-buoni-motivi-per-passare-a-windows-vista" target="_blank">precedenti 10 buoni motivi per passare a Vista</a>. Buon lavoro! <img src="http://blog.denisbilli.it/wp-includes/images/emoticons/ok.gif" class="wp-smiley" alt="ok emoticon" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.denisbilli.it/attivare-interprete-asp-su-iis-7-in-windows-vista/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Ordinamento casuale in Access + ASP</title>
		<link>http://blog.denisbilli.it/ordinamento-casuale-in-access-asp/</link>
		<comments>http://blog.denisbilli.it/ordinamento-casuale-in-access-asp/#comments</comments>
		<pubDate>Mon, 10 Mar 2008 20:40:31 +0000</pubDate>
		<dc:creator>Denis</dc:creator>
				<category><![CDATA[ASP]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[access]]></category>
		<category><![CDATA[casuale]]></category>
		<category><![CDATA[order by]]></category>
		<category><![CDATA[ordinamento]]></category>
		<category><![CDATA[query]]></category>
		<category><![CDATA[random]]></category>
		<category><![CDATA[record]]></category>
		<category><![CDATA[recordset]]></category>

		<guid isPermaLink="false">http://blog.denisbilli.it/2008/03/10/ordinamento-casuale-in-access-asp/</guid>
		<description><![CDATA[Primo articolo per quanto riguarda l&#8217;SQL, il più famoso linguaggio di interrogazione per database. Il problema riguarda l&#8217;ordinamento casuale dei record di una qualsiasi tabella su un database Access. Su SQLServer risolvere il problema è abbastanza semplice, basta infatti specificare un ordinamento del tipo: SELECT * FROM tabella ORDER BY NEWID(); ed il gioco è [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center">
<p><img class="alignleft size-thumbnail wp-image-1380 thumb thumbleft" title="sql" src="http://blog.denisbilli.it/wp-content/uploads/2008/03/sql-150x87.jpg" alt="sql" width="150" height="87" /></p>
<p>Primo articolo per quanto riguarda l&#8217;SQL, il più famoso linguaggio di interrogazione per database. Il problema riguarda l&#8217;<strong>ordinamento casuale dei record </strong>di una qualsiasi tabella su un database Access. Su SQLServer risolvere il problema è abbastanza semplice, basta infatti specificare un ordinamento del tipo:</p>
<pre class="brush: sql;">
SELECT * FROM tabella ORDER BY NEWID();
</pre>
<p>ed il gioco è fatto. Questo tipo di approccio invece non è possibile se il database che stiamo usando è un database Access.</p>
<p>Ecco perciò come ho risolto:</p>
<pre class="brush: sql;">
SELECT * FROM tabella ORDER BY Rnd((ID+Timer())*-1);
</pre>
<p>e quindi nel complesso:</p>
<pre class="brush: vb;">
set conn=Server.CreateObject(&quot;ADODB.Connection&quot;)
conn.Provider=&quot;Microsoft.Jet.OLEDB.4.0&quot;
conn.Open Server.MapPath(&quot;/mdb-database/accademia.mdb&quot;)
set rs = Server.CreateObject(&quot;ADODB.Recordset&quot;)
rs.Open &quot;SELECT * FROM tabella ORDER BY Rnd((ID+Timer())*-1)&quot;, conn
</pre>
<p>Essendo la funzione <strong>Timer() </strong>precisa al centesimo di secondo, è praticamente impossibile ottenere due query ordinate nello stesso modo. Il campo <strong>ID </strong>deve essere ovviamente numerico e nel mio caso è autoincrementale. Grazie a questo <strong>tip </strong>ho risparmiato ore di lavoro inutile, devo perciò ringraziare la fonte dell&#8217;informazione, <a title="blog lorenzo benaglia" href="http://blogs.dotnethell.it/lorenzo/Ordinamento-casuale-in-Microsoft-Access__133.aspx">il blog di Lorenzo Benaglia</a> e soprattutto il commentatore Giorgio Rancati che ha proposto questa soluzione. <img src="http://blog.denisbilli.it/wp-includes/images/emoticons/ok.gif" class="wp-smiley" alt="ok emoticon" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.denisbilli.it/ordinamento-casuale-in-access-asp/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>BabyWebServer: un WebServer ASP gratuito</title>
		<link>http://blog.denisbilli.it/webserver-asp-gratuito/</link>
		<comments>http://blog.denisbilli.it/webserver-asp-gratuito/#comments</comments>
		<pubDate>Sat, 22 Dec 2007 01:51:11 +0000</pubDate>
		<dc:creator>Denis</dc:creator>
				<category><![CDATA[ASP]]></category>
		<category><![CDATA[Applicazioni]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[Web e Web 2.0]]></category>
		<category><![CDATA[asp xp home]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[baby web server]]></category>
		<category><![CDATA[free]]></category>
		<category><![CDATA[iis]]></category>
		<category><![CDATA[Quick'n'Easy WebServer]]></category>
		<category><![CDATA[webserver]]></category>
		<category><![CDATA[webserver asp free]]></category>
		<category><![CDATA[webserver asp per xp home]]></category>

		<guid isPermaLink="false">http://blog.denisbilli.it/2007/12/22/webserver-asp-gratuito/</guid>
		<description><![CDATA[Ciao a tutti cari visitatori! Proprio ieri mattina ho dovuto affrontare l&#8217;esame di Tecnologie Web, superato tranquillamente Il mio progetto, da realizzare con le tecnologie JSP/JSF, non voleva saperne di funzionare, un pò per la mancanza di tempo per eseguire il debug delle pagine, un pò per i vari bug che ancora affliggono questa neo-tecnologia. [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center"><img src="http://www.compagnia3stelle.it/billo/blog/webserver.jpg" alt="webserver" height="250" width="350" /></p>
<p>Ciao a tutti cari visitatori! Proprio ieri mattina ho dovuto affrontare l&#8217;esame di Tecnologie Web, superato tranquillamente <img src="http://blog.denisbilli.it/wp-includes/images/emoticons/tongue.gif" class="wp-smiley" alt="tongue emoticon" /> Il mio progetto, da realizzare con le tecnologie JSP/JSF, non voleva saperne di funzionare, un pò per la mancanza di tempo per eseguire il debug delle pagine, un pò per i vari bug che ancora affliggono questa neo-tecnologia. Ho deciso così di portare all&#8217;esame un progetto identico, però realizzato su piattaforma <strong>ASP </strong>+ <strong>ASP.NET</strong>, linguaggi a me più familiari, anche se questo, per via della scarsa conoscenza in materia (???) del prof, mi avrebbe tolto comunque qualche punto. Sempre meglio che una bocciatura (che non posso permettermi), quindi mi sono attrezzato di tutto punto ed ho installato nel PC il <strong>MySQL </strong>per gestire il database, i driver ODBC per ASP, ho creato le mie pagine riutilizzando il mio vecchio codice ed in un paio d&#8217;ore il sito era bello che pronto. Finito questo è sorto il problema: dove testo le pagine? E&#8217; doveroso sapere che il mio portatile su cui lavoro tutti i giorni e che mi porto praticamente sempre in giro ha installato <strong>Windows XP Home Edition</strong>, quindi niente <strong>IIS</strong>. L&#8217;ultima volta che ho tentato di seguire le procedure per l&#8217;installazione di IIS su XP Home avendo a disposizione un cd di Windows 2000, avevo un pc con XP Home ma con Service Pack 1, quindi potei installarlo tranquillamente. Attualmente ho il Service Pack 2, che è noto crea diversi conflitti con IIS e quindi ho dovuto rinunciare. Ho dovuto quindi cercare in rete per poter risolvere questo problema. Uno tra i pochi programmi veramente gratuiti (la versione base) ma semplici da utilizzare è stato <strong>Baby Web Server</strong>.<span id="more-59"></span></p>
<p>Questo programma, scaricabile gratuitamente da <a href="http://www.pablosoftwaresolutions.com/html/baby_web_server.html" title="baby web server">questa pagina</a>, permette infatti di far girare le proprie pagine ASP in locale in un vero e proprio mini web server.</p>
<p style="text-align: center"><img src="http://www.compagnia3stelle.it/billo/blog/baby_web_server.jpg" alt="baby web server" height="326" width="350" /></p>
<p>Le possibilità di ottimizzazione sono veramente limitate,  il massimo che si può impostare è la porta del server locale e la durata della sessione di un client, più ovviamente la cartella da far &#8220;<em>girare</em>&#8221; nel web server.Durante la prova del webserver ho inoltre riscontrato problemi con la gestione della sessione, quindi nel caso siano presenti troppi dati in sessione si corre il rischio che la pagina non venga proprio renderizzata. Inoltre <u><strong>non è assolutamente gestito il livello Applicazione</strong></u>, quindi non c&#8217;è assolutamente la possibilità di utilizzarla per i nostri scopi. Guardando poi nel sito del creatore di questo webserver, ho scoperto che esiste anche una versione a pagamento dello stesso programma, chiamata <strong>Quick&#8217;n'Easy WebServer</strong>, un webserver ASP (<strong><u>non</u> ASP.NET</strong>, anche perchè per ASP.NET ci pensa direttamente Visual Studio a fornirvi un webserver locale&#8230;), che risolve diverse problematiche relative alla versione gratuita.</p>
<p>Comunque per i miei scopi la versione gratuita è bastata tranquillamente,  quindi nel caso dobbiate provare al volo delle pagine ASP non troppo complesse questo programma può tornarvi molto utile, anche perchè <strong>non necessita di installazione</strong> (anche la versione a pagamento) e potete portarlo sempre con voi. Se invece avete esigenze un pò più alte e non avete assolutamente a disposizione un PC con XP Professional, allora la versione a pagamento è consigliata, con 22€ ve la cavate tranquillamente.</p>
<p>Nel caso decidiate di provare il programma fatemi sapere cosa ne pensate! A presto!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.denisbilli.it/webserver-asp-gratuito/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Guide ASP.NET &#8211; Create un validatore CAPTCHA compatibile con ASP 3.0</title>
		<link>http://blog.denisbilli.it/guida-asp-net-validatore-captcha-compatibile-asp3/</link>
		<comments>http://blog.denisbilli.it/guida-asp-net-validatore-captcha-compatibile-asp3/#comments</comments>
		<pubDate>Wed, 12 Dec 2007 07:00:27 +0000</pubDate>
		<dc:creator>Denis</dc:creator>
				<category><![CDATA[ASP]]></category>
		<category><![CDATA[Linguaggi .Net]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[Web e Web 2.0]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[captcha]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[form validation image]]></category>
		<category><![CDATA[guestbook]]></category>
		<category><![CDATA[immagine di validazione]]></category>
		<category><![CDATA[validatore]]></category>
		<category><![CDATA[validazione form]]></category>

		<guid isPermaLink="false">http://blog.denisbilli.it/2007/12/12/form-validator-con-aspnet-e-asp/</guid>
		<description><![CDATA[Mi è capitato ultimamente di avere dei grossi problemi di spamming in un guestbook che gestisco personalmente. In pratica ogni giorno qualche burlone d&#8217;oltremanica si divertiva ad inserire nel guestbook link di siti che gestivano la vendita di prodotti come il tramadol, il viagra e altro. Essendo che per fortuna non ho bisogno di alcun [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center"><img src="http://www.compagnia3stelle.it/billo/blog/dotnet.jpg" alt="dotnet" height="251" width="350" /></p>
<p>Mi è capitato ultimamente di avere dei grossi problemi di spamming in un guestbook che gestisco personalmente. In pratica ogni giorno qualche burlone d&#8217;oltremanica si divertiva ad inserire nel guestbook link di siti che gestivano la vendita di prodotti come il tramadol, il viagra e altro. Essendo che per fortuna non ho bisogno di alcun farmaco (tantomeno di questi!), e che il guestbook non aveva di certo alcun bisogno di essere pieno di messaggi completamente fuori luogo, ho deciso di aggiungere una validazione al form preesistente con l&#8217;aiuto di asp.net tramite un <a href="http://it.wikipedia.org/wiki/CAPTCHA" title="controllo captcha">controllo CAPTCHA</a>, che rende la gestione dei meta type (le immagini in particolare!) particolarmente semplice da gestire. C&#8217;è da dire che essendo il sito creato completamente in asp, non ho avuto né tempo né voglia di convertirlo ad asp.net, anche perchè essendo un sito amatoriale non mi paga nessuno per farlo <img src="http://blog.denisbilli.it/wp-includes/images/emoticons/tongue.gif" class="wp-smiley" alt="tongue emoticon" /> , ecco perchè ho voluto integrare semplicemente le due tecnologie.</p>
<p><span id="more-53"></span></p>
<p>Questo è un esempio di ciò che vogliamo fare:</p>
<p style="text-align: center"><img src="http://www.compagnia3stelle.it/billo/blog/valid.jpg" alt="validation form" height="50" width="100" /></p>
<p>Ecco come funziona il form di validazione:</p>
<pre class="brush: xml;">
&lt;form id=&quot;mailform&quot; action=&quot;signguestbook.asp&quot; method=&quot;post&quot;&gt;
Nome &lt;input id=&quot;name&quot; type=&quot;text&quot; name=&quot;name&quot; value=&quot;&quot; /&gt;
e-mail &lt;input id=&quot;mail&quot; name=&quot;mail&quot; type=&quot;text&quot; value=&quot;&quot; /&gt;
&lt;textarea id=&quot;object&quot; name=&quot;object&quot;&gt;&lt;/textarea&gt;
Codice di verifica &lt;img src=&quot;validazione.aspx&quot; alt=&quot;codice di verifica&quot; /&gt;
&lt;input id=&quot;code&quot; name=&quot;code&quot; type=&quot;text&quot; maxlength=&quot;5&quot; value=&quot;&quot; /&gt;
&lt;input type=&quot;submit&quot; value=&quot;Invia&quot; /&gt;
&lt;/form&gt;</pre>
<p>è molto semplice, in pratica viene chiesto all&#8217;utente il nome, la mail e un breve messaggio da lasciare nel guestbook. In aggiunta ho inserito un&#8217;immagine che viene generata dinamicamente dal codice che vedremo fra poco ed un campo testo nel quale l&#8217;utente andrà ad inserire i numeri che vede nell&#8217;immagine per poter confermare la propria volontà di inserire il messaggio.Andiamo quindi a vedere il codice che ho utilizzato per generare l&#8217;immagine di validazione (nell&#8217;evento Page_Load della pagina):</p>
<pre class="brush: csharp;">
//creo una nuova immagine di 100x50 pixel
System.Drawing.Image validImage = new System.Drawing.Bitmap(100, 50);
Graphics g = Graphics.FromImage(validImage);

StringBuilder builder = new StringBuilder();
Random rnd = new Random();

//creo il rettangolo dell'immagine e lo coloro di bianco
Rectangle rect = new Rectangle(0, 0, validImage.Width, validImage.Height);
g.FillRectangle(new SolidBrush(Color.White), rect);

//creo delle linee in posizioni x random per disturbare l'immagine
int x;
for (int i = 0; i &lt; rnd.Next(10, 100); i++)
{
x = rnd.Next(0, validImage.Width);
g.DrawLine(new Pen(Color.Black), x, 0, x, validImage.Height);
}

//scrivo sull'immagine 5 numeri random da 0 a 9
x = 5;
for (int i = 0; i &lt; 5; i++)
{
int y = rnd.Next(10, 50 - 30);
int num = rnd.Next(9);
builder.Append(num);
Color color = Color.Black;
g.DrawString(num.ToString(), new Font(&quot;Verdana&quot;, 12, FontStyle.Bold), new SolidBrush(color), x, y);
x += 20;
}

//genero l'uscita segnalando che l'output è di tipo jpeg
Response.ContentType = &quot;image/jpg&quot;;
HttpCookie cookie = new HttpCookie(&quot;denis&quot;, builder.ToString());
cookie.Expires = DateTime.Now.AddMinutes(5);
Response.SetCookie(cookie);
validImage.Save(Response.OutputStream, ImageFormat.Jpeg);
validImage.Dispose();</pre>
<p>Nella pagina signguestbook.asp, chiamata al submit del form, dovremo andare a controllare che sia presente il cookie che abbiamo salvato nel codice qui sopra e che il form inviato contenesse effettivamente il codice che abbiamo visualizzato nell&#8217;immagine. Per fare questo l&#8217;istruzione asp è abbastanza semplice:</p>
<pre class="brush: vb;">
dim SessionCode, code
SessionCode = Request.Cookies(&quot;denis&quot;)

code = Request.Form(&quot;code&quot;)
if(SessionCode &lt;&gt; code) then
'gestione dell'errore nel caso di codice differente
end if</pre>
<p>A questo punto abbiamo validato il nostro form. Logicamente potete cambiare a piacere il modo in cui nascondere il codice nell&#8217;immagine generata con asp.net. Buon lavoro!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.denisbilli.it/guida-asp-net-validatore-captcha-compatibile-asp3/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
