<?xml version="1.0" encoding="iso-8859-15"?><feed version="0.3" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns="http://purl.org/atom/ns#" xml:lang="it-it"><title>naighes - Il blog di Nicola Baldi</title><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/naighes/" /><tagline type="text/html">naighes - Il blog di Nicola Baldi</tagline><id>http://blogs.aspitalia.com/naighes/</id><generator url="http://feed.aspitalia.com/" version="ASPItalia.com">feed.ASPItalia.com 'Weyoh' 4.8.1003</generator><author><name>naighes - Il blog di Nicola Baldi</name><url>http://blogs.aspitalia.com/naighes/</url></author><modified>2007-10-02T11:02:00+00:00</modified><entry><title>Un p&amp;#242; di pratica con VirtualPathProvider</title><id>http://blogs.aspitalia.com/naighes/post2136/PO-Pratica-VirtualPathProvider.aspx</id><created>2007-10-02T11:02:00+00:00</created><content type="text/html" mode="escaped">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2136' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;Questo post &#232; il frutto di un'esigenza che &#232; maturata nel corso dello sviluppo di un progetto (un p&#242; bizzarro!) che sto seguendo. L'idea di base &#232; quella di avere pi&#249; 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&#249; 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=&quot;http://blogs.msdn.com/davidebb/&quot;&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&#242; quello che &#232; 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&#224;, in realt&#224;, alla root principale.
Per evitare ci&#242;, si pu&#242; 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&#249; 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(&quot;/&quot;);&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(&quot;~/{0}/{1}&quot;, 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&#236; 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 = &quot;http://&quot;;&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(&quot;~/{0}{1}&quot;, site.Substring(0, site.IndexOf(&quot;/&quot;)), 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=&quot;http://files-upload.com/files/534018/VirtualPathProviderSample.zip&quot;&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 &#232; veramente notevole e, come illustra &lt;a href=&quot;http://blog.boschin.it/&quot;&gt;Andrea Boschin&lt;/a&gt; all'interno del suo blog, ci consente addirittura di &lt;a href=&quot;http://www.xedotnet.org/40/section.aspx/392&quot;&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 &#232; stato trattato &lt;a href=&quot;http://www.aspitalia.com/articoli/asp.net2/BuildProvider-ExpressionBuilder-VirtualPathProvider.aspx&quot;&gt;qui&lt;/a&gt;.&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework/&quot; rel=&quot;tag&quot;&gt;.NET Framework&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework_2.0/&quot; rel=&quot;tag&quot;&gt;.NET Framework 2.0&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/ASP.NET/&quot; rel=&quot;tag&quot;&gt;ASP.NET&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/ASP.NET_2.0/&quot; rel=&quot;tag&quot;&gt;ASP.NET 2.0&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/HttpModule/&quot; rel=&quot;tag&quot;&gt;HttpModule&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/HttpRuntime/&quot; rel=&quot;tag&quot;&gt;HttpRuntime&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/naighes/post2136/PO-Pratica-VirtualPathProvider.aspx"/><issued>2007-10-02T13:02:00+00:00</issued><modified>2007-10-02T13:02:00+00:00</modified><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></entry></feed>