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.
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 VirtualPathProvider.
Cercando su internet, mi sono imbattutto infatti in un post del blog di David Ebbo dove si discuteva di un problema che poteva essere ricondotto al mio.
Cercando di riassumere un pò quello che è venuto fuori dalla discussione, il problema principale sta nella risoluzione di determinati percorsi. Ad esempio:
<%@ Register Src="~/uc.ascx" TagName="uc" TagPrefix="userControls" %>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.
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.
Una cosa del genere:
public override String CombineVirtualPaths(String basePath, String relativePath)
{
if (!VirtualPathUtility.IsAbsolute(relativePath))
base.CombineVirtualPaths(basePath, relativePath);
String url = HttpContext.Current.Request.Url.PathAndQuery;
String site = basePath.Substring(1);
Int32 index = site.IndexOf("/");
if (index < 0)
return base.CombineVirtualPaths(basePath, relativePath);
return String.Format("~/{0}/{1}", site.Substring(0, index), relativePath.Substring(1));
}Il provider lo possiamo registrare all'interno di un HttpModule, così cogliamo anche l'occasione per effettuare il Path Rewriting.
public class RelativePathModule : IHttpModule
{
private const String PREFIX = "http://";
public void Dispose() { }
public void Init(HttpApplication context)
{
HostingEnvironment.RegisterVirtualPathProvider(new RelativePathProvider());
context.BeginRequest += new EventHandler(context_BeginRequest);
}
void context_BeginRequest(object sender, EventArgs e)
{
HttpContext context = HttpContext.Current;
String url = context.Request.Url.AbsoluteUri;
String site = url.Substring(url.IndexOf(PREFIX) + PREFIX.Length);
String newPath = String.Format("~/{0}{1}", site.Substring(0, site.IndexOf("/")), context.Request.Url.PathAndQuery);
context.RewritePath(newPath);
}
}Ho preparato un allegato contenente un progetto di esempio (a proposito, una volta effettuato l'upload del file con il FileManager, come posso allegarlo al post?!).
Questo provider è veramente notevole e, come illustra Andrea Boschin all'interno del suo blog, ci consente addirittura di realizzare un interno sito all'interno di un singolo Assembly!
Le risorse disponibili su questo provider (MSDN a parte) non sono poi moltissime.
Su aspitalia è stato trattato qui.
Per inserire un commento, devi registrarti alla nostra community.






Stampa
Download 
