<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>ASP.NET 2.0</title>
        <link>http://blogs.ugidotnet.org/dsantarelli/category/ASP.NET 2.0.aspx</link>
        <description>ASP.NET 2.0</description>
        <language>it-IT</language>
        <copyright>Dario Santarelli</copyright>
        <generator>Subtext Version 2.6.0.0</generator>
        <item>
            <title>[ASP.NET] PageAsyncTask e pagine asincrone</title>
            <link>http://blogs.ugidotnet.org/dsantarelli/archive/2008/11/08/asp.net-pageasynctask-e-pagine-asincrone.aspx</link>
            <description>&lt;p&gt;A partire da ASP.NET 2.0, la classe System.Web.UI.Page introduce un metodo non molto conosciuto in grado di facilitare la realizzazione di &lt;a href="http://i.msdn.microsoft.com/cc163725.fig02(en-us).gif" target="_blank"&gt;pagine asincrone&lt;/a&gt;: il metodo &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.ui.page.registerasynctask.aspx" target="_blank"&gt;RegisterAsyncTask&lt;/a&gt;. Spesso mi è capitato di vedere implementare chiamate asincrone (es. invocazione di un WebService) in maniera non corretta sfruttando la logica dell' &lt;a href="http://msdn.microsoft.com/it-it/library/ba6dhx95(VS.80).aspx" target="_blank"&gt;AddOnPreRenderCompleteAsync&lt;/a&gt;, quando in realtà molti dei problemi potevano essere gestiti facilmente tramite Task asincroni, che in ASP.NET sono rappresentati dalla classe &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.ui.pageasynctask.aspx" target="_blank"&gt;PageAsyncTask&lt;/a&gt;.    &lt;br /&gt;Le differenze tra i due approcci non sono moltissime ma significative. Infatti, entrambi richiedono &lt;span lang="EN-US" style="font-size: 8pt; line-height: 115%; font-family: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: red"&gt;Async&lt;/span&gt;&lt;span style="color: blue"&gt;="true"&lt;/span&gt;&lt;/span&gt; nella direttiva @Page (o  &lt;span style="font-size: 8pt; line-height: 115%; font-family: " courier="" new="; mso-no-proof: yes"&gt;AsyncMode = &lt;span style="color: blue"&gt;true&lt;/span&gt;; &lt;/span&gt;da codice) e dunque la predisposizione all'esecuzione asincrona della pagina su thread diversi dopo il completamento del PreRender.     &lt;br /&gt;Tuttavia, il metodo RegisterAsyncTask introduce i seguenti vantaggi chiave:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;In aggiunta ai metodi Begin/End, permette di registrare un metodo per gestire il timeout di una operazione eventualmente troppo lunga. Il timeout è per-page ed è impostabile tramite l'attributo &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.ui.page.asynctimeout.aspx" target="_blank"&gt;AsyncTimeout&lt;/a&gt; della direttiva @Page:  &lt;span lang="EN-US" style="font-size: 8pt; background: yellow; line-height: 115%; font-family: 'Courier New'; mso-highlight: yellow; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&amp;lt;%&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: blue; line-height: 115%; font-family: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;@&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; line-height: 115%; font-family: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt; &lt;span style="color: #a31515"&gt;Page&lt;/span&gt; &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; line-height: 115%; font-family: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: red"&gt;Async&lt;/span&gt;&lt;span style="color: blue"&gt;="true"&lt;/span&gt; &lt;span style="color: red"&gt;AsyncTimeout&lt;/span&gt;&lt;span style="color: blue"&gt;="10" ...&lt;/span&gt; &lt;span style="background: yellow; mso-highlight: yellow"&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;  &lt;/li&gt;    &lt;li&gt;Permette di gestire più &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.ui.pageasynctask.aspx" target="_blank"&gt;PageAsyncTask&lt;/a&gt; (ovvero più "async points") all'interno di un ciclo di vita di una pagina asincrona. Questi a loro volta possono essere eseguiti sia in modalità sequenziale che in modalità parallela (grazie a &lt;a href="http://msdn.microsoft.com/it-it/library/ms153492.aspx" target="_blank"&gt;questo overload&lt;/a&gt; del contruttore di PageAsyncTask). Anche in questo caso, analogamente al pattern &lt;a href="http://msdn.microsoft.com/it-it/library/55xs7d7f.aspx" target="_blank"&gt;MetodAsync/MethodCompleted&lt;/a&gt; disponibile per le classi proxy dei WS (dal framework 2.0 in poi), &lt;strong&gt;ASP.NET "ritarda" il rendering della pagina finché tutti i task asincroni non sono stati completati&lt;/strong&gt;.&lt;/li&gt;    &lt;li&gt;Permette di passare un oggetto 'state' ai nostri metodi BeginAsync tramite la classe PageAsyncTask. &lt;/li&gt;    &lt;li&gt;Permette di mantenere l'impersonation, la culture e l'oggetto HttpContext.Current nei metodi EndAsync e Timeout (cosa non prevista dal metodo EndAsync registrato con l'approccio AddOnPreRenderCompleteAsync)&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Mettiamo insieme il tutto e vediamo un esempio di applicazione dei PageAsyncTask.   &lt;br /&gt;Vogliamo elaborare dei feed RSS tramite PageAsyncTask diversi all'interno di una nostra pagina asincrona.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: blue; font-family: " courier="" new="; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;public&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: " courier="" new="; mso-ansi-language: EN-US; mso-no-proof: yes"&gt; &lt;span style="color: blue"&gt;partial&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;SampleAsyncPage&lt;/span&gt; : System.Web.UI.&lt;span style="color: #2b91af"&gt;Page       &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; line-height: 115%; font-family: " courier="" new="; mso-no-proof: yes"&gt;{     &lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: blue; font-family: " courier="" new="; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;     &lt;br /&gt;  protected&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: " courier="" new="; mso-ansi-language: EN-US; mso-no-proof: yes"&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; Page_Load(&lt;span style="color: blue"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af"&gt;EventArgs&lt;/span&gt; e)      &lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: " courier="" new="; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;  {     &lt;br /&gt;     &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: " courier="" new="; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;&lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt; feeds = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt;();      &lt;br /&gt;     &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: " courier="" new="; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;feeds.Add(&lt;span style="color: #a31515"&gt;"http://blogs.msdn.com/MainFeed.aspx?Type=AllBlogs"&lt;/span&gt;);      &lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: " courier="" new="; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;     feeds.Add(&lt;span style="color: #a31515"&gt;"http://blogs.ugidotnet.org/MainFeed.aspx"&lt;/span&gt;);      &lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: " courier="" new="; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;     feeds.Add(&lt;span style="color: #a31515"&gt;"http://channel9.msdn.com/Feeds/RSS/"&lt;/span&gt;);&lt;span style="mso-spacerun: yes"&gt;        &lt;br /&gt;        &lt;br /&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: " courier="" new="; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue"&gt;string&lt;/span&gt; feed &lt;span style="color: blue"&gt;in&lt;/span&gt; feeds)      &lt;br /&gt;     &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: " courier="" new="; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;{     &lt;br /&gt;       &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: " courier="" new="; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;RegisterAsyncTask(&lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;PageAsyncTask&lt;/span&gt;(&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: " courier="" new="; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;BeginEventHandler&lt;/span&gt;(BeginAsyncOperation), &lt;span style="color: green"&gt;// BeginAsync&lt;/span&gt;      &lt;br /&gt;                                           &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: " courier="" new="; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;EndEventHandler&lt;/span&gt;(EndAsyncOperation), &lt;span style="color: green"&gt;// EndAsync&lt;/span&gt;      &lt;br /&gt;                                           &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: " courier="" new="; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;EndEventHandler&lt;/span&gt;(TimeoutAsyncOperation), &lt;span style="color: green"&gt;// TimeoutAsync&lt;/span&gt;      &lt;br /&gt;                                           &lt;/span&gt;&lt;span style="font-size: 8pt; color: #2b91af; font-family: " courier="" new="; mso-no-proof: yes"&gt;WebRequest&lt;/span&gt;&lt;span style="font-size: 8pt; font-family: " courier="" new="; mso-no-proof: yes"&gt;.Create(feed), &lt;span style="color: green"&gt;// State&lt;/span&gt;      &lt;br /&gt;                                           &lt;/span&gt;&lt;span style="font-size: 8pt; font-family: " courier="" new="; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;true&lt;/span&gt; &lt;span style="color: green"&gt;// I task registrati verranno eseguiti in parallelo       &lt;br /&gt;                                          &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: " courier="" new="; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;)     &lt;br /&gt;                        &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: " courier="" new="; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;);&lt;span style="mso-spacerun: yes"&gt;            &lt;br /&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: " courier="" new="; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;}&lt;span style="mso-spacerun: yes"&gt;        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: " courier="" new="; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;  }     &lt;p /&gt;   &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: " courier="" new="; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;&lt;span style="color: #2b91af"&gt;  IAsyncResult&lt;/span&gt; BeginAsyncOperation(&lt;span style="color: blue"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af"&gt;EventArgs&lt;/span&gt; e, &lt;span style="color: #2b91af"&gt;AsyncCallback&lt;/span&gt; callback, &lt;span style="color: blue"&gt;object&lt;/span&gt; state)      &lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: " courier="" new="; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;  {     &lt;br /&gt;&lt;span style="color: green"&gt;    // In rawFeed abbiamo il feed RSS...&lt;/span&gt;      &lt;br /&gt;    &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: " courier="" new="; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;&lt;span style="color: #2b91af"&gt;WebRequest&lt;/span&gt; webRequest = (&lt;span style="color: #2b91af"&gt;WebRequest&lt;/span&gt;)state;      &lt;br /&gt;    &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: " courier="" new="; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;return&lt;/span&gt; webRequest.BeginGetResponse(callback, state);      &lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: " courier="" new="; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;  }     &lt;br /&gt;      &lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: " courier="" new="; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;  void&lt;/span&gt; EndAsyncOperation(&lt;span style="color: #2b91af"&gt;IAsyncResult&lt;/span&gt; ar)      &lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: " courier="" new="; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;  {&lt;span style="mso-spacerun: yes"&gt;                &lt;br /&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: " courier="" new="; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;&lt;span style="color: #2b91af"&gt;WebRequest&lt;/span&gt; webrequest = (&lt;span style="color: #2b91af"&gt;WebRequest&lt;/span&gt;)ar.AsyncState;      &lt;br /&gt;    &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: " courier="" new="; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;string&lt;/span&gt; rawFeed = &lt;span style="color: blue"&gt;null&lt;/span&gt;;      &lt;br /&gt;  &lt;br /&gt;    &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: " courier="" new="; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; (&lt;span style="color: #2b91af"&gt;WebResponse&lt;/span&gt; response = webrequest.EndGetResponse(ar))      &lt;br /&gt;    &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: " courier="" new="; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;{     &lt;br /&gt;      &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: " courier="" new="; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; (&lt;span style="color: #2b91af"&gt;StreamReader&lt;/span&gt; reader = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;StreamReader&lt;/span&gt;(response.GetResponseStream())) rawFeed = reader.ReadToEnd();&lt;span style="mso-spacerun: yes"&gt;            &lt;br /&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: " courier="" new="; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;}&lt;span style="mso-spacerun: yes"&gt;         &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: " courier="" new="; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;&lt;span style="color: green"&gt;// In rawFeed abbiamo il feed RSS...       &lt;br /&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: " courier="" new="; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;}     &lt;br /&gt;      &lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: " courier="" new="; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;  void&lt;/span&gt; TimeoutAsyncOperation(&lt;span style="color: #2b91af"&gt;IAsyncResult&lt;/span&gt; ar)      &lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: " courier="" new="; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;  {     &lt;br /&gt;    &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: " courier="" new="; mso-ansi-language: EN-US; mso-no-proof: yes"&gt;&lt;span style="color: green"&gt;// Gestione del Timeout per l' AsyncTask&lt;span style="mso-spacerun: yes"&gt;     &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; line-height: 115%; font-family: " courier="" new="; mso-no-proof: yes"&gt;  }     &lt;br /&gt;&lt;span style="font-size: 8pt; line-height: 115%; font-family: 'Courier New'; mso-no-proof: yes"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us"&gt;     &lt;p /&gt;   &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;Per ciascun feed di un nostro elenco registriamo a livello di pagina un PageAsyncTask che in fase di esecuzione si occuperà di reperire lo stream del feed associato (ad esempio grazie alla classe &lt;a href="http://msdn.microsoft.com/en-us/library/system.net.webrequest.aspx" target="_blank"&gt;System.Net.WebRequest&lt;/a&gt;). Il miglioramento delle prestazioni è garantito anche dal fatto che l'esecuzione asincrona di ciascun Task verrà gestita da ASP.NET possibilmente in parallelo.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Considerazioni:&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Se abbiamo bisogno di una pagina asincrona che gestisca un'unica chiamata asincrona, allora gli approcci AddOnPreRenderCompleteAsync e RegisterAsyncTask sono pressoché equivalenti. Ma se le chiamate asincrone sono molte, è decisamente consigliabile sfruttare le facilitazioni introdotte da RegisterAsyncTask. &lt;/li&gt;    &lt;li&gt;Il timeout è per-page e non per-call. Non possiamo cioè assegnare timeout diversi a chiamate asincrone diverse!!! Al massimo possiamo eventualmente modificare a runtime la proprietà AsyncTimeout, il che ovviamente non è la stessa cosa :D&lt;/li&gt;    &lt;li&gt;In combinazione con async ADO.NET (es. SqlCommand.BeginExecuteReader) ed in generale con le feature asincrone del framework .NET, le pagine ASP.NET asincrone offrono soluzioni molto convenienti per risolvere comuni problemi di I/O legati a scenari che inibiscono la scalabilità.&lt;/li&gt;    &lt;li&gt;In generale non è consigliabile/sicuro gestire operazioni asincrone in ASP.NET utilizzando le API System.Threading (es. &lt;a href="http://msdn.microsoft.com/en-us/library/system.threading.threadpool.queueuserworkitem.aspx" target="_blank"&gt;ThreadPool.QueueUserWorkItem&lt;/a&gt;). Il rischio infatti è quello di "rubare" thread alla normale gestione del ThreadPool di ASP.NET, ottenendo effetti che potrebbero risultare addirittura controproducenti.&lt;/li&gt; &lt;/ul&gt;  &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:eb4400c9-5d15-4d25-8365-5a9409241fc0" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tag: &lt;a href="http://technorati.com/tags/ASP.NET" rel="tag"&gt;ASP.NET&lt;/a&gt;,&lt;a href="http://technorati.com/tags/PageAsyncTask" rel="tag"&gt;PageAsyncTask&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/dsantarelli/aggbug/94555.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dario Santarelli</dc:creator>
            <guid>http://blogs.ugidotnet.org/dsantarelli/archive/2008/11/08/asp.net-pageasynctask-e-pagine-asincrone.aspx</guid>
            <pubDate>Sat, 08 Nov 2008 15:23:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/dsantarelli/archive/2008/11/08/asp.net-pageasynctask-e-pagine-asincrone.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/dsantarelli/comments/commentRss/94555.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/dsantarelli/services/trackbacks/94555.aspx</trackback:ping>
        </item>
        <item>
            <title>[ASP.NET] Escludere HttpModule non utilizzati dalla pipeline</title>
            <link>http://blogs.ugidotnet.org/dsantarelli/archive/2007/11/14/asp.net-escludere-httpmodule-non-utilizzati-dalla-pipeline.aspx</link>
            <description>&lt;p&gt;Una tip molto utile e non molto conosciuta per cercare di incrementare le performance di una applicazione ASP.NET riguarda la rimozione degli HttpModule non utilizzati, in modo che non vengano caricati e non rispondano ad eventuali eventi applicativi. Poiché la pipeline HTTP viene valutata a partire dal Machine.config, abbiamo a disposizione due modi per ottimizzare il cosiddetto "HTTP pipeline circuit":&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Commentare il modulo HTTP che non interessa nel &lt;strong&gt;Machine.config&lt;/strong&gt; (sezione httpModules), scelta in genere non consigliabile dal momento che è applicata a tutte le applicazioni in deploy sulla stessa macchina:  &lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: blue; font-family: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&amp;lt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: #a31515; font-family: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;httpModules&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: blue; font-family: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: blue; font-family: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="mso-tab-count: 1"&gt;       &lt;/span&gt;&amp;lt;!--&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: green; font-family: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt; &amp;lt;add name="TargetModule" &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: green; font-family: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;type="TypeModule"/&amp;gt; &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: blue; font-family: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;--&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 8pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes"&gt;httpModules&lt;/span&gt;&lt;span style="font-size: 8pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt; &lt;ul&gt; &lt;li&gt;Rimuovere esplicitamente i moduli che non interessano nel &lt;strong&gt;Web.config&lt;/strong&gt; di ciascuna applicazione (scelta sicuramente più consigliabile in quanto maggiormente flessibile):  &lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: blue; font-family: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&amp;lt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: #a31515; font-family: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;configuration&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: blue; font-family: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: blue; font-family: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="mso-tab-count: 1"&gt;       &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: #a31515; font-family: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;system.web&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: blue; font-family: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: blue; font-family: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="mso-tab-count: 2"&gt;             &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: #a31515; font-family: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;httpModules&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: blue; font-family: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: blue; font-family: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="mso-tab-count: 3"&gt;                    &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: #a31515; font-family: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;remove&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: blue; font-family: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt; &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: red; font-family: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;name&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: blue; font-family: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;=&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;"&lt;span style="color: blue"&gt;ModuleName&lt;/span&gt;"&lt;span style="color: blue"&gt;/&amp;gt;&lt;span style="mso-tab-count: 3"&gt;                &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: blue; font-family: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="mso-tab-count: 2"&gt;             &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 8pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes"&gt;httpModules&lt;/span&gt;&lt;span style="font-size: 8pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-tab-count: 1"&gt;       &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 8pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes"&gt;system.web&lt;/span&gt;&lt;span style="font-size: 8pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 8pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes"&gt;configuration&lt;/span&gt;&lt;span style="font-size: 8pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"&gt;&amp;gt;&lt;?xml:namespace prefix = o /?&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Supponiamo di avere in deploy un sito di commercio elettronico che utilizza &lt;em&gt;FormsAuthentication&lt;/em&gt; come modulo di autenticazione. In questo scenario si potebbero rimuovere immediatamente i moduli &lt;em&gt;WindowsAuthentication &lt;/em&gt;e &lt;em&gt;PassportAuthentication (&lt;/em&gt;poi &lt;em&gt;Session ;)) &lt;/em&gt;e così via&lt;em&gt;...&lt;br /&gt;&lt;br /&gt;&lt;/em&gt;&lt;img src="http://www.tnl.net/img/technorati.gif" /&gt; Technorati tags: &lt;a href="http://technorati.com/tag/HttpModule"&gt;&lt;img alt=" " src="http://static.technorati.com/static/img/pub/icon-utag-16x13.png?tag=HttpModule" /&gt;HttpModule&lt;/a&gt;, &lt;a href="http://technorati.com/tag/ASP.NET"&gt;&lt;img alt=" " src="http://static.technorati.com/static/img/pub/icon-utag-16x13.png?tag=ASP.NET" /&gt;ASP.NET&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/dsantarelli/aggbug/89685.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dario Santarelli</dc:creator>
            <guid>http://blogs.ugidotnet.org/dsantarelli/archive/2007/11/14/asp.net-escludere-httpmodule-non-utilizzati-dalla-pipeline.aspx</guid>
            <pubDate>Wed, 14 Nov 2007 23:32:53 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/dsantarelli/archive/2007/11/14/asp.net-escludere-httpmodule-non-utilizzati-dalla-pipeline.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/dsantarelli/comments/commentRss/89685.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/dsantarelli/services/trackbacks/89685.aspx</trackback:ping>
        </item>
        <item>
            <title>[ASP.NET] DOCTYPE e MIME sono importanti!</title>
            <link>http://blogs.ugidotnet.org/dsantarelli/archive/2007/11/09/asp.net-doctype-e-mime-sono-importanti.aspx</link>
            <description>&lt;p&gt;Lo scorso aprile ho avuto l'onore di essere uno degli speaker presso il &lt;a href="http://dotnetmarche.org/eventi/Default.aspx?IDevento=9"&gt;3° workshop&lt;/a&gt; organizzato da &lt;a href="http://dotnetmarche.org"&gt;DotNetMarche&lt;/a&gt; relativamente all'Accessibilità dei siti Web. In quella occasione, tra le varie interessanti riflessioni, sono stati approfonditi molti aspetti teorici e tecnici riguardanti le sfide che uno sviluppatore Web dovrebbe fronteggiare per realizzare applicazioni conformi a standard di accessibilità riconosciuti a livello sia nazionale che internazionale. &lt;br /&gt;Purtroppo, navigando in diversi siti marchiati dalla PA e non solo, ancora oggi si può notare come la maggioranza degli sviluppatori Web non diano sufficiente peso all'importanza di renderizzare contenuti &lt;a href="http://it.wikipedia.org/wiki/XHTML"&gt;XHTML&lt;/a&gt; (almeno) strutturalmente corretti in base ai DOCTYPE dichiarati.&lt;br /&gt;Probabilmente, per un certo verso si fa sentire ancora quella che molti definiscono come una "mancanza" dei principali vendor dei browser visuali, che tramite il &lt;a href="http://en.wikipedia.org/wiki/Document_Type_Declaration"&gt;DOCTYPE&lt;/a&gt; sniffing permettono mirabilmente di correggere al volo degli errori concettuali e strutturali nel rendering dei documenti Web, rifugiandosi in modalità più o meno standard/retrocompatibili (*), per la precisione:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;IE/Netscape modes: Standards - Quirks  &lt;/li&gt;&lt;li&gt;Firefox/Opera modes: Full Standards - Almost Standards - Quirks&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;(Notare come Firefox e Opera siano più bacchettoni specificando due sottotipi (Full e Almost) dello Standards mode:&lt;br /&gt; &lt;a title="http://developer.mozilla.org/en/docs/Mozilla%27s_DOCTYPE_sniffing" href="http://developer.mozilla.org/en/docs/Mozilla%27s_DOCTYPE_sniffing"&gt;http://developer.mozilla.org/en/docs/Mozilla%27s_DOCTYPE_sniffing&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Il tutto, chiaramente, a danno dell'accessibilità. Utilizzare XHTML significa anzitutto adottare la filosofia "separazione tra contenuto (XML) e presentazione (CSS)" e tutti sappiamo come ciò sia oggi consigliabile da un punto di vista tecnico ed obbligatorio per i siti Web destinati alla PA nonché ad un utenza diversamente abile. In questo senso, le specifiche W3C hanno sempre insistito molto nei confronti dei vendor di Authoring Tools, non solo finalizzati allo sviluppo Web (vedi le specifiche &lt;a href="http://www.w3.org/TR/WAI-AUTOOLS/"&gt;ATAG&lt;/a&gt;), con lo scopo di spingere verso l'utilizzo di &lt;em&gt;&lt;a href="http://www.ietf.org/rfc/rfc3236.txt"&gt;application/xhtml+xml&lt;/a&gt;&lt;/em&gt; come MIME type predefinito (non supportato tra l'altro da IE) nella fornitura di contenuti XHTML. In effetti, il well-forming strutturale di un documento XHTML è il primissimo passo verso la cosiddetta "standard conformance" ed il raggiungimento di contenuti accessibili.&lt;br /&gt;Interessante in questo contesto è il percorso di ASP.NET: dalla completa assenza del supporto ad XHTML della versione 1.x si è passati al supporto nativo nelle versioni successive, scegliendo XHTML 1.0 Transitional come DOCTYPE predefinito (per far contenti tutti) ed integrando un utile strumento di validazione a partire da VS2005 (da prendere però con le molle in quanto non permette di controllare XHTML renderizzato lato client). Il MIME type di default invece è rimasto lo stesso: &lt;em&gt;text/html&lt;/em&gt;. In altre parole il comportamento di default è: "erogare contenuti xhtml mantenendo la 'genericità' dei documenti html".&lt;br /&gt;Nella speranza che tutti un giorno sviluppino seguendo specifiche rigorose come XHTML 1.0 Strict / 1.1 (meglio), riporto un esempio di HttpModule che implementa uno dei workaround più consigliati per erogare contenuti &lt;em&gt;application/xhtml+xml&lt;/em&gt;, chiaramente qualora lo user agent richiedente dichiari di supportarlo:&lt;br /&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: blue; font-family: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;public&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ContentTypeModule&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;IHttpModule&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;{&lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; Init(System.Web.&lt;span style="color: #2b91af"&gt;HttpApplication&lt;/span&gt; application)&lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;application.PreSendRequestHeaders += &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;EventHandler&lt;/span&gt;(&lt;span style="color: blue"&gt;this&lt;/span&gt;.Application_PreSendRequestHeaders);&lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;}&lt;?xml:namespace prefix = o /?&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;o:p&gt;  &lt;/o:p&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; Application_PreSendRequestHeaders(&lt;span style="color: blue"&gt;object&lt;/span&gt; sender, System.&lt;span style="color: #2b91af"&gt;EventArgs&lt;/span&gt; e)&lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: #2b91af"&gt;HttpApplication&lt;/span&gt; app = ((&lt;span style="color: #2b91af"&gt;HttpApplication&lt;/span&gt;)(sender));&lt;br /&gt;    &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: #2b91af"&gt;HttpContext&lt;/span&gt; context = app.Context;&lt;br /&gt;    &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt; (&lt;span style="color: #2b91af"&gt;Array&lt;/span&gt;.IndexOf(context.Request.AcceptTypes,&lt;span style="color: #a31515"&gt;"application/xhtml+xml"&lt;/span&gt;) &amp;gt; -1)&lt;br /&gt;    &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;{&lt;br /&gt;      &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;context.Response.ContentType = &lt;span style="color: #a31515"&gt;"application/xhtml+xml"&lt;/span&gt;;&lt;br /&gt;    &lt;/span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; mso-no-proof: yes"&gt;}&lt;br /&gt;   &lt;/span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; mso-no-proof: yes"&gt;}&lt;br /&gt;  &lt;br /&gt;   &lt;/span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; Dispose() { }&lt;span style="mso-spacerun: yes"&gt;    &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; line-height: 115%; font-family: 'Courier New'; mso-no-proof: yes"&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"&gt;Due curiosità:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;div class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;em&gt;Application_PreSendRequestHeaders&lt;/em&gt; è un evento disponibile anche nel Global.asax&lt;/div&gt; &lt;/li&gt;&lt;li&gt; &lt;div class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"&gt;Tramite l'array di stringhe &lt;em&gt;Request.AcceptTypes&lt;/em&gt; possiamo osservare tutti i MIME Types accettati da un particolare browser: IE ad esempio è il più furbo poiché dichiara semplicemente " */* " (ovvero: accetto tutto!!!) mentre ad esempio Firefox dichiara, in ordine di preferenza, &lt;em&gt;text/xml&lt;/em&gt;, &lt;em&gt;application/xml&lt;/em&gt;, &lt;em&gt;application/xhtml+xml&lt;/em&gt; ... e */* alla fine.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;(*) Per capire in maniera approfondita la differenza tra Standard e Quirks mode consiglio vivamente la lettura di questo completissimo articolo: &lt;a title="http://www.quirksmode.org/css/quirksmode.html" href="http://www.quirksmode.org/css/quirksmode.html"&gt;http://www.quirksmode.org/css/quirksmode.html&lt;/a&gt; (la tabella in fondo chiarisce ogni dubbio sulla sostanziale differenza esistente tra il rendering standard e quello retrocompatibile)&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tnl.net/img/technorati.gif" /&gt; Technorati tags: &lt;a href="http://technorati.com/tag/XHTML%2F" rel="tag"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin-left: 0.4em; vertical-align: middle; border-right-width: 0px" alt=" " src="http://static.technorati.com/static/img/pub/icon-utag-16x13.png?tag=XHTML%2F" /&gt;XHTML&lt;/a&gt;, &lt;a href="http://technorati.com/tag/W3C" rel="tag"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin-left: 0.4em; vertical-align: middle; border-right-width: 0px" alt=" " src="http://static.technorati.com/static/img/pub/icon-utag-16x13.png?tag=W3C" /&gt;W3C&lt;/a&gt;&lt;img src="http://blogs.ugidotnet.org/dsantarelli/aggbug/89570.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dario Santarelli</dc:creator>
            <guid>http://blogs.ugidotnet.org/dsantarelli/archive/2007/11/09/asp.net-doctype-e-mime-sono-importanti.aspx</guid>
            <pubDate>Fri, 09 Nov 2007 15:51:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/dsantarelli/archive/2007/11/09/asp.net-doctype-e-mime-sono-importanti.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/dsantarelli/comments/commentRss/89570.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/dsantarelli/services/trackbacks/89570.aspx</trackback:ping>
        </item>
        <item>
            <title>ASP.NET: alcuni &amp;quot;Security How-Tos&amp;quot; fondamentali</title>
            <link>http://blogs.ugidotnet.org/dsantarelli/archive/2007/10/24/asp.net-alcuni-quotsecurity-how-tosquot-fondamentali.aspx</link>
            <description>&lt;p&gt;Ogni tanto bisogna riproporre questi link, giusto per tornare con i piedi per terra e soprattutto per diminuire la probabilità di diventare una delle vittime di &lt;a href="http://www.weloveraf.com/"&gt;Raf&lt;/a&gt; :)  &lt;/p&gt;&lt;li&gt; &lt;p&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/Bb355989"&gt;How To: Protect From &lt;strong&gt;Injection Attacks&lt;/strong&gt; in ASP.NET&lt;/a&gt;&lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms998267"&gt;How To: Use Regular Expressions to &lt;strong&gt;Constrain Input&lt;/strong&gt; in ASP.NET&lt;/a&gt;&lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms998274"&gt;How To: Prevent &lt;strong&gt;Cross-Site Scripting&lt;/strong&gt; in ASP.NET&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Questo ed altro su uno dei vademecum dello sviluppatore .NET più utili in assoluto:&lt;br /&gt; &lt;a href="http://msdn2.microsoft.com/it-it/practices/default.aspx" atomicselection="true"&gt;&lt;img src="http://img249.imageshack.us/img249/1276/ppos2.jpg" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;a title="http://www.guidancelibrary.com/guidanceexplorerbeta/" href="http://www.guidancelibrary.com/guidanceexplorerbeta/"&gt;http://www.guidancelibrary.com/guidanceexplorerbeta/&lt;/a&gt; (Web)  &lt;br /&gt;&lt;a title="http://www.codeplex.com/guidanceExplorer" href="http://www.codeplex.com/guidanceExplorer"&gt;http://www.codeplex.com/guidanceExplorer&lt;/a&gt; (Windows Application - Codeplex)&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.tnl.net/img/technorati.gif" /&gt; Technorati tags: &lt;a href="http://technorati.com/tag/ASP.NET"&gt;&lt;img alt="*" src="http://static.technorati.com/static/img/pub/icon-utag-16x13.png?tag=ASP.NET" /&gt;ASP.NET&lt;/a&gt; , &lt;a href="http://technorati.com/tag/Security"&gt;&lt;img alt="*" src="http://static.technorati.com/static/img/pub/icon-utag-16x13.png?tag=Security" /&gt;Security&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;img src="http://blogs.ugidotnet.org/dsantarelli/aggbug/89188.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dario Santarelli</dc:creator>
            <guid>http://blogs.ugidotnet.org/dsantarelli/archive/2007/10/24/asp.net-alcuni-quotsecurity-how-tosquot-fondamentali.aspx</guid>
            <pubDate>Wed, 24 Oct 2007 22:46:38 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/dsantarelli/archive/2007/10/24/asp.net-alcuni-quotsecurity-how-tosquot-fondamentali.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/dsantarelli/comments/commentRss/89188.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/dsantarelli/services/trackbacks/89188.aspx</trackback:ping>
        </item>
    </channel>
</rss>