<?xml version="1.0" encoding="Windows-1252"?><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.825</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:02: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></channel></rss>