ASP.NET AJAX http://blogs.ugidotnet.org/alessio_blog/category/ASP.NET AJAX.aspx Post relativi Ajax it-IT Alessio Pambianchi Subtext Version 2.6.0.0 Master &ndash; Content Page very little issue :) http://blogs.ugidotnet.org/alessio_blog/archive/2009/10/08/master-ndash-content-page-very-little-issue.aspx <div style="margin: 0px; padding: 0px 0px 4px 8px; float: right;" class="wlWriterHeaderFooter"><script type="text/javascript"><![CDATA[igg_url = "http://blogs.ugidotnet.org/alessio_blog/archive/0001/01/01/master-ndash-content-page-very-little-issue.aspx";digg_title = "Master – Content Page very little issue :)";digg_bgcolor = "#FFFFFF";digg_skin = "normal";]]></script><script src="http://digg.com/tools/diggthis.js" type="text/javascript"></script><script type="text/javascript"><![CDATA[igg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;]]></script></div> <p>Dal <em>markup</em> di una content page accedere tramite funzioni javascript ai controlli lato server non è semplice avviene infatti una sostituzione dell’id del controllo a runtime. Per poter continuare ad utilizzare il vecchio codice javascript basta sostituire l’id del controllo con questa funzione lato server ‘&lt;%= Me.IdControllo.ClientID’%&gt;’ dove IdControllo =  Id definito nel markup della pagina content, e naturale la sostituzione deve essere fatta all’interno del javascript :). Questo il “tarocco” che ho applicato non ho testato performance e problemi di sorta, se ne conoscete e volete condividere siete i benvenuti.</p> <p>Tags: <a rel="tag" href="http://technorati.com/tag/ASP.NET">ASP.NET</a> <a rel="tag" href="http://technorati.com/tag/Master Page">Master Page</a> <a rel="tag" href="http://technorati.com/tag/Content Page">Content Page</a></p><img src="http://blogs.ugidotnet.org/alessio_blog/aggbug/97214.aspx" width="1" height="1" /> Alessio Pambianchi http://blogs.ugidotnet.org/alessio_blog/archive/2009/10/08/master-ndash-content-page-very-little-issue.aspx Thu, 08 Oct 2009 13:00:50 GMT http://blogs.ugidotnet.org/alessio_blog/archive/2009/10/08/master-ndash-content-page-very-little-issue.aspx#feedback 15 http://blogs.ugidotnet.org/alessio_blog/comments/commentRss/97214.aspx ASP.NET Chart Control gestione immagini http://blogs.ugidotnet.org/alessio_blog/archive/2009/10/06/asp.net-chart-control-gestione-immagini-generate.aspx <div style="margin: 0px; padding: 0px 0px 4px 8px; float: right;" class="wlWriterHeaderFooter"><script type="text/javascript"><![CDATA[igg_url = "http://blogs.ugidotnet.org/alessio_blog/archive/0001/01/01/asp.net-chart-control-gestione-immagini-generate.aspx";digg_title = "ASP.NET Chart Control gestione immagini generate";digg_bgcolor = "#FFFFFF";digg_skin = "normal";]]></script><script src="http://digg.com/tools/diggthis.js" type="text/javascript"></script><script type="text/javascript"><![CDATA[igg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;]]></script></div> <p>Ho utilizzato questo controllo nell’applicazione che sto sviluppando, oltre alla fase di personalizzazione per rendere il controllo compliant con le richieste della committenza (look &amp; feel e tipo di grafico generato), uno ”Step Over” è dato dalla fase di configurazione della gestione delle immagini generate dal controllo (come mantenerle, per quanto tempo etc. etc… ), a questo proposito un <a target="_blank" rel="4Guys From Rolla" href="http://www.4guysfromrolla.com/articles/081909-1.aspx" title="4Guys From Rolla">articolo</a> molto interesante che spiega nel dettaglio questa fase.</p> <p>Tags: <a rel="tag" href="http://technorati.com/tag/ASP.NET">ASP.NET</a> <a rel="tag" href="http://technorati.com/tag/Charting">Charting</a></p><img src="http://blogs.ugidotnet.org/alessio_blog/aggbug/97189.aspx" width="1" height="1" /> Alessio Pambianchi http://blogs.ugidotnet.org/alessio_blog/archive/2009/10/06/asp.net-chart-control-gestione-immagini-generate.aspx Tue, 06 Oct 2009 12:23:01 GMT http://blogs.ugidotnet.org/alessio_blog/archive/2009/10/06/asp.net-chart-control-gestione-immagini-generate.aspx#feedback 29 http://blogs.ugidotnet.org/alessio_blog/comments/commentRss/97189.aspx VS 2008 jQuery intellisense everywhere ;) http://blogs.ugidotnet.org/alessio_blog/archive/2009/07/07/vs-2008-jquery-intellisense-everywhere.aspx <div style="margin: 0px; padding: 0px 0px 4px 8px; float: right;" class="wlWriterHeaderFooter"><script type="text/javascript"><![CDATA[igg_url = "http://blogs.ugidotnet.org/alessio_blog/archive/0001/01/01/vs-2008-jquery-intellisense-everywhere.aspx";digg_title = "VS 2008 jQuery intellisense everywhere ;)";digg_bgcolor = "#FFFFFF";digg_skin = "normal";]]></script><script src="http://digg.com/tools/diggthis.js" type="text/javascript"></script><script type="text/javascript"><![CDATA[igg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;]]></script></div> <p>Oggi ho voluto finalmente integrare l’intellisense per <a href="http://jquery.com/" title="jQuery home">jQuery</a> in VS 2008, un po di googling ed ecco cosa sono riuscito a fare:</p> <ol> <li>La partenza il <a href="http://weblogs.asp.net/scottgu/archive/2008/11/21/jquery-intellisense-in-vs-2008.aspx" title="jQuery intellisense in VS 2008">post</a> (un pò datato) del mitico <a href="http://weblogs.asp.net/scottgu/default.aspx" title="Scott Guthrie Web Log">Scott Guthrie</a> da questo, dopo una breve lettura, ho installato il <strong>VS 2008 Patch KB958502 to Support "-vsdoc.js" Intellisense Files</strong> prendendolo da <a href="http://code.msdn.microsoft.com/KB958502/Release/ProjectReleases.aspx?ReleaseId=1736" title="JScript Editor support for “-vsdoc.js” IntelliSense doc. files">quì</a> .</li> <li>Naturale da <a href="http://docs.jquery.com/Downloading_jQuery" title="jQuery Download Page">jQuery</a> mi sono scaricato l’ultima versione della <a href="http://code.google.com/p/jqueryjs/downloads/detail?name=jquery-1.3.2.js" title="jQuery 1.3.2">libreria</a> (non compressa per fare dei test) ma anche il file <a href="http://code.google.com/p/jqueryjs/downloads/detail?name=jquery-1.3.2-vsdoc2.js" title="jQuery 1.3.2 (Visual Studio Autocomplete Documentation)">vsdoc</a> per l’intellisense.</li> <li>Dopo aver inserito e referenziato correttamente i due file javascript nella soluzione aimè dell’intellisense nessuna traccia, comunque VS 2008 solleva un warning:  <em>“Error updating JScript IntelliSense: Object doesn’t support this property or method @ 2139:1” </em>anche in questo caso google ci <a href="http://patrickyong.net/2009/05/08/error-updating-jscript-intellisense-object-doesnt-support-this-property-or-method-21391/" title="Error updating JScript IntelliSense">aiuta</a> la soluzione proposta è semplice il nome del file scaricato per l’intellisense è <strong>jquery-1.3.2-vsdoc2.js</strong> rinominandolo in <strong>jquery-1.3.2-vsdoc.js </strong>l’errore scompare, a questo punto abbiamo l’intellisense per i file HTML/ASPX.</li> <li>Altra frontiera come fare per abilitare l’intellisense in un file .js separato? Anche in questo caso una ricerca veloce porta alla <a href="http://stackoverflow.com/questions/59766/how-do-you-get-javascriptjquery-intellisense-working-in-vs-2008" title="external js file">soluzione</a></li> </ol> <p>in fine adesso quado sono nel mio IDE ed edito un file .js ecco cosa appare:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/alessio_blog/WindowsLiveWriter/VS2008jQueryintellisenseeverywhere_B5F5/image_2.png"><img height="176" width="457" border="0" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/alessio_blog/WindowsLiveWriter/VS2008jQueryintellisenseeverywhere_B5F5/image_thumb.png" alt="VS 2008 jQuery iontellisense" title="VS 2008 jQuery iontellisense" style="border: 0px none ; display: inline;" /></a> </p> <p>Tags: <a rel="tag" href="http://technorati.com/tag/VS 2008">VS 2008</a> <a rel="tag" href="http://technorati.com/tag/jQuery">jQuery</a> <a rel="tag" href="http://technorati.com/tag/intellisense">intellisense</a></p><img src="http://blogs.ugidotnet.org/alessio_blog/aggbug/96624.aspx" width="1" height="1" /> Alessio Pambianchi http://blogs.ugidotnet.org/alessio_blog/archive/2009/07/07/vs-2008-jquery-intellisense-everywhere.aspx Tue, 07 Jul 2009 15:05:19 GMT http://blogs.ugidotnet.org/alessio_blog/archive/2009/07/07/vs-2008-jquery-intellisense-everywhere.aspx#feedback 289 http://blogs.ugidotnet.org/alessio_blog/comments/commentRss/96624.aspx Deep Dive into ASP.NET Session http://blogs.ugidotnet.org/alessio_blog/archive/2008/11/26/deep-dive-into-asp.net-session.aspx <p>Sebbene personalmente non ami particolarmente l'uso della sessione nelle <strong>web-application</strong>, spesso essa viene utilizzata anche perchè non si può fare altrimenti. La seconda affermazione (spesso viene utilizzata) spiega il perchè di questo post, difronte infatti ad un'applicazione che ne faceva un largo uso ho cercato di capirne il funzionamento nei suoi dettagli.</p> <p>Partiamo dal fondo dalla sua definizione formale, la sessione così come la conosciamo è definita dall' <a title="rfc 2109" target="_blank" href="http://www.ietf.org/rfc/rfc2109.txt">HTTP State Management Mechanism</a> <a title="Request For Comment" target="_blank" href="http://it.wikipedia.org/wiki/Request_for_Comments">RFC</a>. Essa infatti:</p> <blockquote> <p><em>This document specifies a way to create a stateful session with HTTP requests and responses.It describes two new headers, Cookie and Set-Cookie, which carry state information between participating origin servers and user agents. The method described here differs from Netscape's Cookie proposal,but it can interoperate with HTTP/1.0 user agents that use Netscape's method. (See the HISTORICAL section.)</em></p> </blockquote> <p>Sostanzialmente per quello che riguarda <strong>ASP.NET</strong> senza addentrarci troppo nei dettagli della RFC 2109 vi riporto una semplice e sommaria descrizione di come le cose funzionano, </p> <p>Il <strong>Server</strong> si occupa di generare una nuova sessione (se necessario), mantienere la sessione e l'elimina all'occorrenza. </p> <p>Il <strong>Client</strong> si occupa di ricordare al <strong>Server</strong> quale è la sessione che lo riguarda.</p> <p>Come si può notare la maggior parte del lavoro è portata avanti dal Server, il gioco è basato su di uno scambio costante, tra il Client ed il Server, di particolari Cookie (non sono come i classici cookie salvati nel hard-disk del client), il Server alla generazione della nuova sessione inserisce nella response un header in più, il <em><strong>Set-Cookie</strong></em>. Il Client per confermare al Server il mantenimento della sessione inserisce un header in più nella <strong>Request</strong> fatta, il <strong><em>Cookie</em></strong>. Il <strong>Set-Cookie</strong> viene conservato nella cache del Client (se sbaglio correggetemi :| ).</p> <p><em><strong>NB</strong>. Questa descrizione è una mia libera interpretazione per avere un quadro certo sul funzionamento della RFC basta leggersela.</em> </p> <p>Dopo questa breve descrizione vediamo in pratica come verificare i concetti espressi sin d'ora. Quello che ci serve è una Web-App che generi una nuova sessione :) e di un tool che effettui dello sniffing per verificare il contenuto delle Request e delle Response passate tra il Client ed il Server.</p> <p>Partiamo dalla prima cosa, per questo apro <a title="VWD" target="_blank" href="http://www.microsoft.com/express/vwd/">Microsoft Visual Web Developer 2008 Expr. Ed.</a> creo una nuova ASP.NET Web Application.</p> <p><strong>Default.aspx</strong>:</p> <div> <div style="border-style: none; padding: 0px; overflow: visible; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"> <pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: white; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: rgb(96, 96, 96);"> 1:</span> <span style="background-color: rgb(255, 255, 0);">&lt;%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Default.aspx.vb" Inherits="SessionTest._Default" %&gt;</span></pre> <pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: rgb(96, 96, 96);"> 2:</span>  </pre> <pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: white; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: rgb(96, 96, 96);"> 3:</span> <span style="color: rgb(0, 0, 255);">&lt;!</span><span style="color: rgb(128, 0, 0);">DOCTYPE</span> <span style="color: rgb(255, 0, 0);">html</span> <span style="color: rgb(255, 0, 0);">PUBLIC</span> <span style="color: rgb(0, 0, 255);">"-//W3C//DTD XHTML 1.0 Transitional//EN"</span> <span style="color: rgb(0, 0, 255);">"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"</span><span style="color: rgb(0, 0, 255);">&gt;</span></pre> <pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: rgb(96, 96, 96);"> 4:</span>  </pre> <pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: white; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: rgb(96, 96, 96);"> 5:</span> <span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">html</span> <span style="color: rgb(255, 0, 0);">xmlns</span><span style="color: rgb(0, 0, 255);">="http://www.w3.org/1999/xhtml"</span> <span style="color: rgb(0, 0, 255);">&gt;</span></pre> <pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: rgb(96, 96, 96);"> 6:</span> <span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">head</span> <span style="color: rgb(255, 0, 0);">runat</span><span style="color: rgb(0, 0, 255);">="server"</span><span style="color: rgb(0, 0, 255);">&gt;</span></pre> <pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: white; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: rgb(96, 96, 96);"> 7:</span> <span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">title</span><span style="color: rgb(0, 0, 255);">&gt;&lt;/</span><span style="color: rgb(128, 0, 0);">title</span><span style="color: rgb(0, 0, 255);">&gt;</span></pre> <pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: rgb(96, 96, 96);"> 8:</span> <span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">head</span><span style="color: rgb(0, 0, 255);">&gt;</span></pre> <pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: white; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: rgb(96, 96, 96);"> 9:</span> <span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">body</span><span style="color: rgb(0, 0, 255);">&gt;</span></pre> <pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: rgb(96, 96, 96);"> 10:</span> <span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">form</span> <span style="color: rgb(255, 0, 0);">id</span><span style="color: rgb(0, 0, 255);">="form1"</span> <span style="color: rgb(255, 0, 0);">runat</span><span style="color: rgb(0, 0, 255);">="server"</span><span style="color: rgb(0, 0, 255);">&gt;</span></pre> <pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: white; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: rgb(96, 96, 96);"> 11:</span> <span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">div</span><span style="color: rgb(0, 0, 255);">&gt;</span></pre> <pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: rgb(96, 96, 96);"> 12:</span> <span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">p</span><span style="color: rgb(0, 0, 255);">&gt;</span></pre> <pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: white; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: rgb(96, 96, 96);"> 13:</span> <span style="background-color: rgb(255, 255, 0);">&lt;%</span>Response.Write(Session.SessionID)% <span style="color: rgb(0, 0, 255);">&gt;</span> </pre> <pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: rgb(96, 96, 96);"> 14:</span> <span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">p</span><span style="color: rgb(0, 0, 255);">&gt;</span></pre> <pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: white; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: rgb(96, 96, 96);"> 15:</span> <span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">div</span><span style="color: rgb(0, 0, 255);">&gt;</span></pre> <pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: rgb(96, 96, 96);"> 16:</span> <span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">form</span><span style="color: rgb(0, 0, 255);">&gt;</span></pre> <pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: white; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: rgb(96, 96, 96);"> 17:</span> <span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">body</span><span style="color: rgb(0, 0, 255);">&gt;</span></pre> <pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: rgb(96, 96, 96);"> 18:</span> <span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">html</span><span style="color: rgb(0, 0, 255);">&gt;</span></pre> </div> </div> <p><strong>Default.aspx.vb:</strong></p> <div> <div style="border-style: none; padding: 0px; overflow: visible; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"> <pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: white; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: rgb(96, 96, 96);"> 1:</span> Partial Public Class _Default</pre> <pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: rgb(96, 96, 96);"> 2:</span> Inherits System.Web.UI.Page</pre> <pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: white; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: rgb(96, 96, 96);"> 3:</span>  </pre> <pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: rgb(96, 96, 96);"> 4:</span> Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load</pre> <pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: white; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: rgb(96, 96, 96);"> 5:</span> Session("TestSession") = "Test Della Sessione"</pre> <pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: rgb(96, 96, 96);"> 6:</span> End Sub</pre> <pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: white; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: rgb(96, 96, 96);"> 7:</span>  </pre> <pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: rgb(244, 244, 244); width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: rgb(96, 96, 96);"> 8:</span> End Class</pre> </div> </div> <p>Nel code-behind genero una nuova sessione con l'assegnazione al'oggetto Session("TestSession") un valore stringa qualsiasi vedi linea 4 del file Default.aspx.vb, nel file Default.aspx visualizzo l'ID della sessione appena generata nel Server. Per verificare lo scambio di Set-Cookie e Cookie tra Server e Client utilizziamo <a target="_blank" href="http://getfirebug.com/">Firebug</a>, abilito quindi il "Support For Network Monitoring",  premiamo F5 nel Web Developer per attivare il debug. Quello che succede poi vine mostrato nell'immagine sotto:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/alessio_blog/WindowsLiveWriter/DeepDiveintoASP.NETSession_12014/image_4.png"><img height="514" width="585" border="0" style="border: 0px none ;" alt="Firebug Request Response Header" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/alessio_blog/WindowsLiveWriter/DeepDiveintoASP.NETSession_12014/image_thumb_1.png" /></a> </p> <p>Evidenziate in rosso l'Id della Sessione visualizzato nella pagina (primo in alto) ed il Set-Cookie nell Header (intestazione) della Response passato al Client dal Server (secondo riquadro in basso).</p> <p>Ora per vedere l'Header Cookie Passato dal Client al Server basta effettuare un refresh della pagina:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/alessio_blog/WindowsLiveWriter/DeepDiveintoASP.NETSession_12014/image_6.png"><img height="530" width="589" border="0" style="border: 0px none ;" alt="Firebug Request Response Header" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/alessio_blog/WindowsLiveWriter/DeepDiveintoASP.NETSession_12014/image_thumb_2.png" /></a> </p> <p>In questo caso il secondo riquadro rosso nell'immagine sopra mostra l'Header Cookie aggiunto nella Request fatta dal Client al Server.</p> <p>Tra i vari problemi legati a questo tipo di teconoliga possimao evidenziarne uno introdotto con l'utilizzo dei Tab nei moderni browser, se infatti aprissi un nuovo tab nell'istanza precedente di Firefox e navigassi fino alla stessa risorsa mi accorgerei che:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/alessio_blog/WindowsLiveWriter/DeepDiveintoASP.NETSession_12014/image_8.png"><img height="278" width="597" border="0" style="border: 0px none ;" alt="Split Browser in action" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/alessio_blog/WindowsLiveWriter/DeepDiveintoASP.NETSession_12014/image_thumb_3.png" /></a> </p> <p>viene visualizzato lo stesso numero di sessione (riquadro rosso), di conseguenza in uno scenario complesso se effettuassi modifiche che hanno impatto nella sessione, nel tab in alto, poi nel tab che sta sotto mi troverei lo stato della sessione modificato (note l'immagine sopra è stata realizzata con l'utilizzo dell'add-on per Firefox <a target="_blank" href="https://addons.mozilla.org/en-US/firefox/addon/4287">Split Browser</a>).</p> <p><br /> </p> <p>Conclusioni:</p> <p>Queste anomalie non investono solo le applicazioni ASP.NET provate ad accedere a due Account di Gmail differenti su due tab differenti di Firefox o internet Explorer, nella stessa istanza del Browser, provate poi ad effettuare qualche modifica nei settings di un account e verificate cosa succede all'altro. Fino a poco tempo fa succedevano delle cose strane tipo email che invece di arrivare ad un account arrivano magicamente nell'altro account.</p><img src="http://blogs.ugidotnet.org/alessio_blog/aggbug/94768.aspx" width="1" height="1" /> Alessio Pambianchi http://blogs.ugidotnet.org/alessio_blog/archive/2008/11/26/deep-dive-into-asp.net-session.aspx Wed, 26 Nov 2008 23:56:59 GMT http://blogs.ugidotnet.org/alessio_blog/archive/2008/11/26/deep-dive-into-asp.net-session.aspx#feedback 6 http://blogs.ugidotnet.org/alessio_blog/comments/commentRss/94768.aspx ASP.NET con Google Doctype http://blogs.ugidotnet.org/alessio_blog/archive/2008/09/18/asp.net-con-google-doctype.aspx <img src="http://blogs.ugidotnet.org/alessio_blog/aggbug/94072.aspx" width="1" height="1" /> Alessio Pambianchi http://blogs.ugidotnet.org/alessio_blog/archive/2008/09/18/asp.net-con-google-doctype.aspx Thu, 18 Sep 2008 13:43:26 GMT http://blogs.ugidotnet.org/alessio_blog/archive/2008/09/18/asp.net-con-google-doctype.aspx#feedback 8 http://blogs.ugidotnet.org/alessio_blog/comments/commentRss/94072.aspx Events. http://blogs.ugidotnet.org/alessio_blog/archive/2008/09/11/events.aspx <p>Ciao, mi hanno posto questa domanda: </p> <blockquote> <p>data un'istanza di un oggetto e un suo evento è possibile dall'esterno <br />risalire al metodo associato all'evento stesso?</p> </blockquote> <p>Ho eseguito un po di googling, ed ho trovato questo prezioso <a title=".NET: Hacking events and manipulating delegates" href="http://blogs.interakting.co.uk/steve/archive/2008/05/19/NET--Hacking-events-and-manipulating-delegates.aspx">articolo</a> (un po di hacking sugli eventi), a partire dall'articolo ho cercato, e sono riuscito a dare la risposta alla domanda:</p> <pre class="code"><span style="color: blue">Imports </span>System <span style="color: blue">Imports </span>System.Collections.Generic <span style="color: blue">Imports </span>System.Reflection <span style="color: blue">Module </span>test <span style="color: blue">Public Sub </span>Main(<span style="color: blue">ByVal </span>args <span style="color: blue">As String</span>()) <span style="color: blue">Dim </span>cm <span style="color: blue">As New </span>classManager() cm.ce.Fire() <span style="color: blue">Dim </span>f() <span style="color: blue">As </span>FieldInfo = cm.ce.GetType().GetFields(BindingFlags.Instance <span style="color: blue">Or </span>BindingFlags.NonPublic) <span style="color: blue">Dim </span>x <span style="color: blue">As </span>FieldInfo = f(0) <span style="color: blue">Dim </span>evtValue <span style="color: blue">As Object </span>= x.GetValue(cm.ce) <span style="color: blue">If </span>evtValue <span style="color: blue">IsNot Nothing Then Dim </span>evtDelegate <span style="color: blue">As </span>System.MulticastDelegate = <span style="color: blue">TryCast</span>(evtValue, [Delegate]) <span style="color: blue">Dim </span>delList <span style="color: blue">As </span>[Delegate]() = evtDelegate.GetInvocationList() <span style="color: blue">For Each </span>d <span style="color: blue">As </span>[Delegate] <span style="color: blue">In </span>delList Console.WriteLine(d.Method.Name) <span style="color: blue">Next End If </span>Console.ReadKey() <span style="color: blue">End Sub End Module Class </span>classEvento <span style="color: blue">Public Event </span>evento <span style="color: blue">As </span>EventHandler <span style="color: blue">Public Sub </span>Fire() <span style="color: blue">RaiseEvent </span>evento(<span style="color: blue">Me</span>, <span style="color: blue">New </span>EventArgs()) <span style="color: blue">End Sub End Class Class </span>classManager <span style="color: blue">Public </span>ce <span style="color: blue">As c</span>lassEvento <span style="color: blue">Public Sub New</span>() ce = <span style="color: blue">New </span>classEvento <span style="color: blue">AddHandler </span>ce.evento, <span style="color: blue">AddressOf </span>e_esegui <span style="color: blue">End Sub Private Sub </span>e_esegui(<span style="color: blue">ByVal </span>sender <span style="color: blue">As Object</span>, <span style="color: blue">ByVal </span>e <span style="color: blue">As </span>EventArgs) System.Console.WriteLine(<span style="color: #a31515">"Fire Evento." </span>&amp; vbCrLf) <span style="color: blue">End Sub End Class</span></pre> <a href="http://11011.net/software/vspaste"></a><a href="http://11011.net/software/vspaste"></a> <p>Considerazioni: </p> <p>la classe *classEvento* all'interno della funzione *Fire* esegue la *<a title="MSDN RaiseEvent" href="http://msdn.microsoft.com/it-it/library/fwd3bwed(VS.80).aspx">RaiseEvent</a>* in C# è necessario verificare l'evento stesso prima di emetterlo:</p> <p>if (event != null) <br />        { <br />            event(this, e); <br />        }</p> <p>Questa differenza perchè la *RaiseEvent* esegue in automatico il controllo a nothing sull'evento.</p> <p>Tags: <a href="http://technorati.com/tag/VB" rel="tag">VB</a> <a href="http://technorati.com/tag/Event" rel="tag">Event</a> <a href="http://technorati.com/tag/Delegate" rel="tag">Delegate</a> <a href="http://technorati.com/tag/Handler" rel="tag">Handler</a></p><img src="http://blogs.ugidotnet.org/alessio_blog/aggbug/93986.aspx" width="1" height="1" /> Alessio Pambianchi http://blogs.ugidotnet.org/alessio_blog/archive/2008/09/11/events.aspx Thu, 11 Sep 2008 11:20:42 GMT http://blogs.ugidotnet.org/alessio_blog/archive/2008/09/11/events.aspx#feedback 5 http://blogs.ugidotnet.org/alessio_blog/comments/commentRss/93986.aspx Piccola escursione su *HttpResponse.End()* &amp; *ThreadAbortException* http://blogs.ugidotnet.org/alessio_blog/archive/2008/07/22/piccola-escursione-su-httpresponse.end-amp-threadabortexception.aspx <p>E' chiaro che questo problema abbia avuto ben più importanti contributi, e ben più importanti oratori (visto il materiale "googleiano"), comunque essendomi trovato anche io in queste acque pantanose, vorrei dire la mia (scusatemi se è poco ;) ), anche in funzione di un *Post Pro Memoria*.</p> <p>In questo ultimo periodo di lavoro mi sto occupando di un progetto Web abbastanza complesso che nel Front End fa un uso massivo di gridview. per migliorare la User Experience, è stato introdotto un controllo custom chiamato *YuiGrid* appartenente alla libreria <a href="http://www.codeplex.com/ExtJsExtenderControl/" target="_blank">ExtJs Extender Controls</a> (codeplex), l'integrazione del controllo è stata abbastanza semplice, e *quasi* si stava per gioire, ma una controllata veloce ai log prodotti dall'aplpicazione evidenzia una serie di <a href="http://msdn.microsoft.com/en-us/library/system.threading.threadabortexception%28VS.80%29.aspx">ThreadAbortException</a>, generate ogni volta che sul controllo *YuiGrid* vengono premuti i bottoni first, prev, next, last naturalmente questi appartenenti alla logica della paginazione. Meglio ancora, le eccezioni vengono sollevate ogni volta che viene eseguito il metodo DataBind del controllo, che a sua volta è chiamato in corrispondenza degli eventi legati alla paginazione, e ancora più nel dettaglio l'eccezione viene sollevata solo dopo la prima load della pagina.</p> <p>Analizzando il codice sorgente del controllo ho trovato le cause del problema:</p> <pre class="code"><span style="color: green;">//EnsureChildControls();<br /></span><span style="color: rgb(43, 145, 175);">HttpResponse </span>Response = <span style="color: rgb(43, 145, 175);">HttpContext</span>.Current.Response;<br />Response.Clear();<br /><span style="color: green;">//Response.ContentType = "text";<br />//JavaScriptSerializer ser = new JavaScriptSerializer();<br /></span>Response.Write(<span style="color: rgb(163, 21, 21);">"{\"records\":[" </span>+ parsedValue + <span style="color: rgb(163, 21, 21);">"],\"totalCount\":\"" </span>+ <span style="color: blue;">this</span>.TotalRecords + <span style="color: rgb(163, 21, 21);">"\"}"</span>);<br />Response.End();</pre> <a href="http://11011.net/software/vspaste"></a><a href="http://11011.net/software/vspaste"></a> <p>E' noto che la funzione *HttpResponse.End()* generi questo tipo di eccezione come documentato su <a href="http://msdn.microsoft.com/en-us/library/system.web.httpresponse.end(VS.80).aspx" target="_blank">MSDN</a>, di conseguenza mi sono mosso per vedere come correggere l'errore, dopo alcuni test, ed un po di debug ecco la soluzione:</p> <pre class="code"><span style="color: green;">//EnsureChildControls();<br /></span><span style="color: rgb(43, 145, 175);">HttpResponse </span>Response = <span style="color: rgb(43, 145, 175);">HttpContext</span>.Current.Response;<br />Response.Clear();<br /><span style="color: green;">//Response.ContentType = "text";<br />//JavaScriptSerializer ser = new JavaScriptSerializer();<br /></span>Response.Write(<span style="color: rgb(163, 21, 21);">"{\"records\":[" </span>+ parsedValue + <span style="color: rgb(163, 21, 21);">"],\"totalCount\":\"" </span>+ <span style="color: blue;">this</span>.TotalRecords + <span style="color: rgb(163, 21, 21);">"\"}"</span>);<br /><span style="color: green;">//Response.End();<br /></span>Response.Flush();<br />Response.Close();<br /><span style="color: blue;">return</span>;</pre> <p>Naturalmente sono fortunato, ho a disposizione il codice sorgente del controllo, vorrei aggiungere anche che per lo stesso problema ho trovato differenti soluzioni ma non tutte lo risolvono, per cui come sempre provare provare provare.</p> <p>Tags: <a href="http://technorati.com/tag/ASP.NET" rel="tag">ASP.NET</a> <a href="http://technorati.com/tag/HttpResponse" rel="tag">HttpResponse</a> <a href="http://technorati.com/tag/ThreadAbortException" rel="tag">ThreadAbortException</a> <a href="http://technorati.com/tag/ExtJs Extender Controls" rel="tag">ExtJs Extender Controls</a></p><img src="http://blogs.ugidotnet.org/alessio_blog/aggbug/93492.aspx" width="1" height="1" /> Alessio Pambianchi http://blogs.ugidotnet.org/alessio_blog/archive/2008/07/22/piccola-escursione-su-httpresponse.end-amp-threadabortexception.aspx Tue, 22 Jul 2008 12:01:39 GMT http://blogs.ugidotnet.org/alessio_blog/archive/2008/07/22/piccola-escursione-su-httpresponse.end-amp-threadabortexception.aspx#feedback 20 http://blogs.ugidotnet.org/alessio_blog/comments/commentRss/93492.aspx Troppo banale, eppure ... http://blogs.ugidotnet.org/alessio_blog/archive/2008/07/11/troppo-banale-eppure.aspx <p>Ciao, in questi giorni mi è capitato di rimettere le mani in un'applicazione Web che avevo sviluppato tempo fa. L'ho dovuto faore a causa di un errore nella gestione dei caratteri speciali "è é ù ò à ù ì" (maledetti bastardi ;) ).</p> <p>In pratica cosa succedeva, e cosa succede (potrebbe essere utile). La mia applicazione Web "hosta" un gridview che contiene varie colonne una custom con un bottone le altre standard con valori di tipo stringa.</p> <p>Al click sul bottone vengono recuperati i valori di tipo stringa che sono associati alla riga dalla quale l'evento click  è stato sollevato (astruso ma è così), con i valori di tipo stringa viene costruita ed eseguita una SELECT nel db etc etc..</p> <p>Bene per questa parte tecnica nessun problema, tutto funziona alla perfezione, per cui senza fare nessun test approfondito e vista la <strong>banalità</strong> delle azioni pubblico il tutto evvai pizza e birra!!!!</p> <p>A distanza di qualche mese un nuova entry si aggira nella sorgente dati, al suo interno la parola "Proprietà". Ora ogni volta che l'utente clicca sul bottone  la  SELECT non produce nessun risultato ma neanche nessuna eccezione (da paura!!).</p> <p>Ebbene dopo una piccola sessione di debug ho scoperto che la propietà Text della classe GridViewRow del .NET Framework ritorna il valore testuale come viene interpretato dal browser ovvero con i <a target="_blank" href="http://www.w3.org/MarkUp/Guide/Advanced.html">caratteri speciali</a> codificati (<strong>Propriet&amp;#224;</strong>). Ora dopo avere scoperto il problema la soluzione è semplice ...</p> <a href="http://11011.net/software/vspaste"></a> <pre class="code"><span style="color: blue;"> Dim </span>gridRow <span style="color: blue;">As </span>GridViewRow = <span style="color: blue;">Nothing<br /> Dim </span>valore <span style="color: blue;">As String </span>= <span style="color: blue;">String</span>.Empty<br /><br /> <span style="color: blue;">Try<br /> </span><span style="color: green;">'Recupera l'entry selezionata della gridview <br /> </span>gridRow = <span style="color: blue;">CType</span>(sender, System.Web.UI.WebControls.ImageButton).Parent.Parent<br /> <span style="color: blue;">If </span>gridRow <span style="color: blue;">IsNot Nothing Then<br /> </span><span style="color: green;">'Recupera il testo valore - decodifica i caratteri speciali presenti<br /> </span>valore = Server.HtmlDecode(gridRow.Cells(1).Text)<br /> <span style="color: blue;">End If<br /> Catch </span>ex <span style="color: blue;">As </span>Exception<br /> <span style="color: green;">'manage exception<br /> </span><span style="color: blue;">Finally<br /> </span><span style="color: green;">'free all resources<br /> </span><span style="color: blue;">End Try</span></pre> <p>Questo è tutto. Ero sicuro che il codice generato la prima volta fosse abbastanza scritto bene e senza errori invece ecco come ci si può perdere in un bicchier d'acqua (parlo esclusivamente di me). Questo piccolo errore viene percepito dal cliente come un malfunzionamento dell'applicazione per cui okkio ai particolari ...</p> <p>Tags: <a rel="tag" href="http://technorati.com/tag/ASP.NET">ASP.NET</a> <a rel="tag" href="http://technorati.com/tag/GridView">GridView</a> <a rel="tag" href="http://technorati.com/tag/HTML Special Characters">HTML Special Characters</a></p><img src="http://blogs.ugidotnet.org/alessio_blog/aggbug/93354.aspx" width="1" height="1" /> Alessio Pambianchi http://blogs.ugidotnet.org/alessio_blog/archive/2008/07/11/troppo-banale-eppure.aspx Fri, 11 Jul 2008 10:58:26 GMT http://blogs.ugidotnet.org/alessio_blog/archive/2008/07/11/troppo-banale-eppure.aspx#feedback 6 http://blogs.ugidotnet.org/alessio_blog/comments/commentRss/93354.aspx Sharepoint gestione tipi di dato Currency e Number http://blogs.ugidotnet.org/alessio_blog/archive/2008/06/16/sharepoint-gestione-tipi-di-dato-currency-e-number.aspx <p>Ho sviluppato un'applicazione che si integra con SPS 2003, per la gestione di tipi di dato Currency. In fase di Testing BlackBox del' applicazione ho inserito, in corrispondenza dei Currency,  grandi cifre decimali (EX: 1234567890123456). </p> <p>Questo specifico test ha evidenziato delle anomalie replicabili creando una semplice lista in Sahrepoint composta da una colonna di tipo Currency ed una colonna di tipo Number:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/alessio_blog/WindowsLiveWriter/SharepointCurrencya20cifredecimali_B295/image_2.png"><img height="159" border="0" align="left" width="469" style="border-width: 0px; margin: 0px 10px 0px 0px;" alt="Sahrepoint List" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/alessio_blog/WindowsLiveWriter/SharepointCurrencya20cifredecimali_B295/image_thumb.png" /></a> </p> <p>L'immagine mostra la lista inizializzata con valori significativi, da questa lista prendiamo in esame la quarta riga a partire dall'alto. Sebbene le colonne "currency" e "number" vengano visualizzate come cifre numeriche senza apparenti problemi, in fase di inserimento il numero inserito era differente rispetto a quello visualizzato. Infatti a fronte dell'inserimento della cifra "1234567890123456" mi ritrovo visualizzata la cifra "1234567890123460" trattandosi di Currency ovvero "Moneta" trovo un'arrotondamento per eccesso di 4 euro ;). La stessa cosa capita anche al tipo di dato Number.</p> <p>Visto il problema, analizzo le possibili cause, focalizzando l'attenzione sui tipi di dato Currency (quello che mi interessa). Il valore di questo tipo di dato viene gestito con metodi della classe "Number", che a sua volta corrisponde ad un System.Double del .NET Framework. Per fissare meglio le affermazioni rimando alle pagina di MSDN relativa l'Enum <a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spfieldtype.aspx" target="_blank">SPFieldType</a> e relativa la Classe <a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spfieldcurrency_members.aspx" target="_blank">SPFieldCurrency</a> del Namespace "Microsoft.Sharepoint".</p> <p>Avendo scoperto il tipo di dato base System.Double, ho iniziato ad implementare alcuni piccoli e semplici test su questo tipo realizzando una stupida applicazione che:</p> <pre class="code"><span style="color: blue;">Dim </span>f <span style="color: blue;">As Double </span>= 999999999999999<br /><span style="color: blue;">Dim </span>g <span style="color: blue;">As Double </span>= 1234567890123456<br /><br />Console.WriteLine(<span style="color: rgb(163, 21, 21);">"f: " </span>&amp; f.ToString)<br />Console.WriteLine(<span style="color: rgb(163, 21, 21);">"g: " </span>&amp; g.ToString)</pre> <p> </p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/alessio_blog/WindowsLiveWriter/SharepointCurrencya20cifredecimali_B295/image_8.png"><img height="88" border="0" align="left" width="280" style="border-width: 0px; margin: 0px 10px 0px 0px;" alt="Console Application" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/alessio_blog/WindowsLiveWriter/SharepointCurrencya20cifredecimali_B295/image_thumb_3.png" /></a> </p> <p>Mandando in esecuzione questa piccola applicazione si nota che il primo dato viene mostrato nella notazione decimale  mentre il secondo viene mostrato nella notazione in virgola mobile, altra cosa fondamentale il secondo dato è 1,234567890123456E+15 che nella notazione decimale corrisponde a  1234567890123460 propio il valore decimale arrotondato della lista di SahrePoint visto prima. Abbiamo spostato il problema dal tipo di dato Currency al System.Double di .NET.</p> <p>Da una semplicissima ricerca su google ho scoperto che <a href="http://msdn.microsoft.com/en-us/library/system.double(VS.71).aspx" target="_blank">System.Double</a> (.NET framework) è conforme allo standard IEEE per il calcolo in virgola mobile (<a href="http://it.wikipedia.org/wiki/IEEE_754" target="_blank">IEEE 754</a>), la gestione secondo lo standard di questi numeri per la precisione doppia é:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/alessio_blog/WindowsLiveWriter/SharepointCurrencya20cifredecimali_B295/image_10.png"><img height="87" border="0" align="left" width="457" style="border-width: 0px; margin: 0px 10px 0px 0px;" alt="Double precision" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/alessio_blog/WindowsLiveWriter/SharepointCurrencya20cifredecimali_B295/image_thumb_4.png" /></a> </p> <p>L'imagine mostra la distribuzione dei 64 bit che compongono la gestione dei double a doppia precisione fonte <a href="http://it.wikipedia.org/wiki/IEEE_754" target="_blank">wikipedia</a> essa infatti è stata estrapolata dal sito, per cui non garantisco che ci sia corrispondenza 1 a 1 con la rappresentazione dei double del Framework .NET, MSDN comunque dice:  </p> <blockquote> <p>"<em>The <strong>Double</strong> value type represents a double-precision 64-bit number with values ranging from negative 1.79769313486232e308 to positive 1.79769313486232e308, as well as positive or negative zero, </em><a href="http://msdn.microsoft.com/en-us/library/system.double.positiveinfinity(VS.71).aspx"><em>PositiveInfinity</em></a><em>, </em><a href="http://msdn.microsoft.com/en-us/library/system.double.negativeinfinity(VS.71).aspx"><em>NegativeInfinity</em></a><em>, and Not-a-Number (</em><a href="http://msdn.microsoft.com/en-us/library/system.double.nan(VS.71).aspx"><em>NaN</em></a><em>).</em> </p> <p><em><strong>Double</strong> complies with the IEC 60559:1989 (IEEE 754) standard for binary floating-point arithmetic</em>."  (fonte <a href="http://msdn.microsoft.com/en-us/library/system.double(VS.71).aspx" target="_blank">MSDN</a>)</p> </blockquote> <p>Le informazioni date fin d'ora, sopratutto quelle recuperate da wikipedia, sono si dettagliate ma non sufficienti a capire a fondo il problema, ho eseguito per cui altre ricerche, ho trovato questa voce tratta da wikipedia (inglese questa volta) dei numeri in virgola mobile a <a href="http://en.wikipedia.org/wiki/Double_precision" target="_blank">doppia precisione</a>, da queta voce estrapolo una parte significativa:</p> <blockquote> <p>"<em>... With the 52 bits of the fraction </em><a href="http://en.wikipedia.org/wiki/Mantissa"><em>mantissa</em></a><em> appearing in the memory format the total precision is therefore 53 bits (<strong>approximately 16 decimal digits</strong>, log<sub>10</sub>(2<sup>53</sup>)). ...</em> "  (fonte <a href="http://en.wikipedia.org/" target="_blank">wikipedia</a>)</p> </blockquote> <p>Il testo dice chiaramente che: la precisione totale raggiungibile sono "approssimativamente", gli interi composti da 16 cifre decimali. Aggiungo che i numeri eccednti tale limite vengono arrotondati al minimo numero rappresentabile maggiore della cifra data. Se ora riprendiamo il codice della piccola "Console Application" notiamo che esso cerca di rappresentare un numero composto appunto da 16 cifre decimali (1234567890123456), il che comporta l'arrotondamento. Sempre estratto dalla voce wikipedia faccio notare l'uguaglianza del range di numeri rappresentabili riportato anche da MSDN:</p> <blockquote> <p>"<em>0x7fef ffff ffff ffff   ~ 1.7976931348623157 x 10<sup>308</sup> (Max Double)</em>" (fonte <a href="http://en.wikipedia.org/" target="_blank">wikipedia</a>)</p> </blockquote> <p>Questo è quanto, vi consiglio per cui attenzione nell'uso di cifre composte da un numero di interi superiore a 15 sopratutto se dovete poi effettuare delle operazioni su di esse, sia quando state utilizzando Sharepoint ma anche quando svilupate utilizzando il .NET framework.</p><img src="http://blogs.ugidotnet.org/alessio_blog/aggbug/93041.aspx" width="1" height="1" /> Alessio Pambianchi http://blogs.ugidotnet.org/alessio_blog/archive/2008/06/16/sharepoint-gestione-tipi-di-dato-currency-e-number.aspx Mon, 16 Jun 2008 11:46:31 GMT http://blogs.ugidotnet.org/alessio_blog/archive/2008/06/16/sharepoint-gestione-tipi-di-dato-currency-e-number.aspx#feedback 6 http://blogs.ugidotnet.org/alessio_blog/comments/commentRss/93041.aspx Work Around - &quot;Access Denied&quot; con ASP.NET Ajax 1.0 e frame cross-domain http://blogs.ugidotnet.org/alessio_blog/archive/2008/04/16/work-around---quotaccess-deniedquot-con-asp.net-ajax-1.0-e.aspx <p>Esclusivamente riferito a questo scenario:</p> <ul> <li>WebApllication <a target="_blank" href="http://www.asp.net/ajax/">ASP.NET Ajax</a> dentro un frame o iframe.</li> <li>Il frame si trova in un dominio differente rispetto la finestra top-level.</li> </ul> <p>Se si cerca di accedere alla Web-Aplication, tramite Internet Explorer (IE), viene sollevato l'errore lato client "access denied" ogni volta che un evento <a target="_blank" href="http://www.w3schools.com/HTMLDOM/default.asp">DOM</a> viene sollevato.</p> <p>Prima di proseguire due parole sullo scenario, anche se a prima vista potrebbe sembrare strano che si possa verificare, provate ad immaginare una situazione del genere: WebpartPage su Moss che ospita la vostra Web-Application.</p> <p>In sostanza e per essere più chiari, quello che si verifica è l'impossibilità di utilizzare qualsiasi controllo Ajax inserito nella Web-Application.</p> <p>Per poter permettere il corretto funzionamento di Ajax anche in uno scenario del genere esiste un <a target="_blank" href="http://weblogs.asp.net/bleroy/archive/2007/01/31/how-to-work-around-the-quot-access-denied-quot-cross-domain-frame-issue-in-asp-net-ajax-1-0.aspx">work around</a> di <a target="_blank" href="http://weblogs.asp.net/bleroy/">Bertrand Le Roy</a>, che spiega dettagliatamente le cause, la risoluzione e alcune considerazioni e update, di conseguenza se volete andare a fondo vi consiglio di dare una letta al suo post, altrimenti eccovi la soluzione che io ho adottato, prendendo sempre spunto dal suo post.</p> <p>Il concetto che sta alla base del work-around è la localizzazione degli script che compongono la <a target="_blank" href="http://asp.net/ajax/downloads/library/default.aspx">Microsoft Ajax Library</a> di solito per chi ha installato Ajax questi si trovano nella directory di installazione di quest'ultimo es: "C:\[PathToAjaxFolder]\ASP.NET 2.0 AJAX Extensions\v1.0.61025\MicrosoftAjaxLibrary\" (PathToAjaxFolder è il path alla tua directory di installazione) all'interno della directory <strong>System.Web.Extension</strong>.</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/alessio_blog/WindowsLiveWriter/WorkAroundAccessDenie.0eframecrossdomain_D0FA/image_4.png"><img height="298" border="0" align="left" width="318" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/alessio_blog/WindowsLiveWriter/WorkAroundAccessDenie.0eframecrossdomain_D0FA/image_thumb_1.png" alt="Visual Studio 2005 - Solution Explorer" style="border: 0px none ; margin: 0px 10px 0px 0px;" /></a> Bene, trovata System.Web.Extension l'ho copiata ed inserita all'interno della directory che contiene il file soluzione di VS2005 della mia Web-Application, notate che il "dove" copiare la directory dipende sopratutrto da come sono stati concettualmente suddivisi i vari file e directory che compongono la vostra soluzione. Fatto questo da Visual Studio ho reso visibile la directory all'interno della soluzione (ora è visibile dal Solution Explorer di Visual Studio). </p> <p>Altra considerazione se avete certezza che la vostra aplicazione faccia comunque uso di una sola lingua ad esempio italiano potete eliminare tutti i file che si trovano all'interno della directory "System.Web.Extensions\1.0.61025.0\Globalization" escluso il file "it-IT.js", questo vi permette di mantenere il supporto alla globalizzazione per la lingua Italiana in Ajax, e di risparmiare spazio su disco.</p> <p>Ancora non ci siamo, ci sono altri step che dobbiamo fare:</p> <p>1) Modifica dei file "*.aspx" che contengono lo Script Manager. Certo lo script manager deve essere modificato e nel particolare si deve aggiungere questa referenza in questo modo:</p> <p><br /> </p> <pre class="code"><span style="color: blue;">&lt;</span><span style="color: rgb(163, 21, 21);">asp</span><span style="color: blue;">:</span><span style="color: rgb(163, 21, 21);">ScriptManager </span><span style="color: red;">ID</span><span style="color: blue;">="MyScriptManager" </span><span style="color: red;">runat</span><span style="color: blue;">="server" </span><span style="color: red;">EnableScriptGlobalization</span><span style="color: blue;">="true" </span><span style="color: red;">EnablePageMethods</span><span style="color: blue;">="true" &gt;<br /> &lt;</span><span style="color: rgb(163, 21, 21);">Scripts</span><span style="color: blue;">&gt;<br /> &lt;</span><span style="color: rgb(163, 21, 21);">asp</span><span style="color: blue;">:</span><span style="color: rgb(163, 21, 21);">ScriptReference </span><span style="color: red;">Name</span><span style="color: blue;">="MicrosoftAjax.js" </span><span style="color: red;">ScriptMode</span><span style="color: blue;">="Auto" </span><span style="color: red;">Path</span><span style="color: blue;">="System.Web.Extensions/1.0.61025.0/MicrosoftAjax.js"/&gt;<br /> &lt;/</span><span style="color: rgb(163, 21, 21);">Scripts</span><span style="color: blue;">&gt; <br />&lt;/</span><span style="color: rgb(163, 21, 21);">asp</span><span style="color: blue;">:</span><span style="color: rgb(163, 21, 21);">ScriptManager</span><span style="color: blue;">&gt;</span></pre> <a href="http://11011.net/software/vspaste"></a> <p>Due considerazioni sull'attributo <strong>Path</strong> del tag <strong>asp:ScriptReference</strong>, questo si riferisce propio al path della directory Suystem.Web.Extension rispetto alla path del file .aspx alla quale lo script manager, che stiamo modificando, appartiene. Nello specifico l'esempio mostra lo ScirptManager del file Default.aspx (vedi immagine). Se il file .aspx si trovasse di un livello inferiore rispetto alla gerarchia delle directory allora l'attributo path deve essere modificato come segue:</p> <pre class="code"><span style="color: red;">Path</span><span style="color: blue;">="~/System.Web.Extensions/1.0.61025.0/MicrosoftAjax.js"</span></pre> <a href="http://11011.net/software/vspaste"></a> <p>2) Patchare i file MicrosoftAjax.debug.js e MicrosoftAjax.js, ok non vi dico dove trovate questi file se avete seguito con interesse lo sapete, per cui apriamo il file MicrosoftAjax.debug.js cerchiamo questo testo all'interno del file:</p> <pre class="code"><span style="color: blue;">switch</span>(Sys.Browser.agent) {<br /> <span style="color: blue;">case </span>Sys.Browser.InternetExplorer:</pre> <a href="http://11011.net/software/vspaste"></a><a href="http://11011.net/software/vspaste"></a> <p>Ora rimpiazziamo qualsiasi cosa si trova tra il codice sopra e questo codice:</p> <pre class="code"><span style="color: blue;">case </span>Sys.Browser.Safari:</pre> <a href="http://11011.net/software/vspaste"></a> <p>Con questo codice (NB: le righe di codice sopra non devono essere rimpiazzate deve essere rimpiazzato solo il codice che si trova tra le due righe sopra):</p> <pre class="code"> Sys.UI.DomElement.getLocation = <span style="color: blue;">function</span>(element) {<br /> <span style="color: blue;">if </span>(element.self || element.nodeType === 9) <span style="color: blue;">return new </span>Sys.UI.Point(0,0);<br /> <span style="color: blue;">var </span>clientRect = element.getBoundingClientRect();<br /> <span style="color: blue;">if </span>(!clientRect) {<br /> <span style="color: blue;">return new </span>Sys.UI.Point(0,0);<br /> }<br /> <span style="color: blue;">var </span>ownerDocument = element.document.documentElement;<br /> <span style="color: blue;">var </span>offsetX = clientRect.left - 2 + ownerDocument.scrollLeft,<br /> offsetY = clientRect.top - 2 + ownerDocument.scrollTop;<br /> <br /> <span style="color: blue;">try </span>{<br /> <span style="color: blue;">var </span>f = element.ownerDocument.parentWindow.frameElement || <span style="color: blue;">null</span>;<br /> <span style="color: blue;">if </span>(f) {<br /> <span style="color: blue;">var </span>offset = 2 - (f.frameBorder || 1) * 2;<br /> offsetX += offset;<br /> offsetY += offset;<br /> }<br /> }<br /> <span style="color: blue;">catch</span>(ex) {<br /> } <br /> <br /> <span style="color: blue;">return new </span>Sys.UI.Point(offsetX, offsetY);<br />}<br /><span style="color: blue;">break</span>;</pre> <p>Bene un consiglio invece di rimpiazzare brutalmente al vecchio codice dategli una commentata. Ora dobbiamo modificare il file MicrosoftAjax.js attenzione non dovete modificare la formattazzione del testo, ma semplicemnte rimpiazzare il codice, vi dico questo perche questo file non è formattato allo stesso modo di quello precedente. Per cui aprite il file MicrosoftAjax.js trovate il codice:</p> <pre class="code"><span style="color: blue;">switch</span>(Sys.Browser.agent){<span style="color: blue;">case </span>Sys.Browser.InternetExplorer:</pre> <p>rimpiazzate tutto quello che si trova tra la riga sopra e questa riga:</p> <pre class="code"><span style="color: blue;">case </span>Sys.Browser.Safari:</pre> <a href="http://11011.net/software/vspaste"></a> <p>con questo codice (NB: Ancora una volta assicuratevi che il codice sotto non contenga interruzioni di linea prima di effettuare la sostituzione, copiatelo in notepad eliminate le interruzioni di linea sostituitelo):</p> <pre class="code">Sys.UI.DomElement.getLocation=<span style="color: blue;">function</span>(a){<span style="color: blue;">if</span>(a.self||a.nodeType===9)<span style="color: blue;">return new </span>Sys.UI.Point(0,0);<br /><span style="color: blue;">var </span>b=a.getBoundingClientRect();<span style="color: blue;">if</span>(!b)<span style="color: blue;">return new </span>Sys.UI.Point(0,0);<br /><span style="color: blue;">var </span>c=a.document.documentElement,d=b.left-2+c.scrollLeft,e=b.top-2+c.scrollTop;<br /><span style="color: blue;">try</span>{<span style="color: blue;">var </span>g=a.ownerDocument.parentWindow.frameElement||<span style="color: blue;">null</span>;<br /><span style="color: blue;">if</span>(g){<span style="color: blue;">var </span>f=2-(g.frameBorder||1)*2;d+=f;e+=f}}<span style="color: blue;">catch</span>(h){}<span style="color: blue;">return new </span>Sys.UI.Point(d,e)};<span style="color: blue;">break</span>;</pre> <p>Fine ora la Web-Application non deve più mostrare gli errori. </p><img src="http://blogs.ugidotnet.org/alessio_blog/aggbug/92240.aspx" width="1" height="1" /> Alessio Pambianchi http://blogs.ugidotnet.org/alessio_blog/archive/2008/04/16/work-around---quotaccess-deniedquot-con-asp.net-ajax-1.0-e.aspx Wed, 16 Apr 2008 17:29:23 GMT http://blogs.ugidotnet.org/alessio_blog/archive/2008/04/16/work-around---quotaccess-deniedquot-con-asp.net-ajax-1.0-e.aspx#feedback 6 http://blogs.ugidotnet.org/alessio_blog/comments/commentRss/92240.aspx