io non riesco a ottenere una consuetudine VirtualPathProvider lavora in asp.net MVC 5.VirtualPathProvider in MVC 5
Il metodo FileExists ritorna vero, ma allora il metodo GetFile non viene chiamato. Credo che ciò accada perché IIS accetta la richiesta e non consente a .NET di gestirlo.
Ho provato a impostare RAMMFAR e creare un gestore personalizzato, come in questa soluzione https://stackoverflow.com/a/12151501/801189 ma ancora senza fortuna. Mi appare un errore 404.
mio provider personalizzato:
public class DbPathProvider : VirtualPathProvider
{
public DbPathProvider() : base()
{
}
private static bool IsContentPath(string virtualPath)
{
var checkPath = VirtualPathUtility.ToAppRelative(virtualPath);
return checkPath.StartsWith("~/CMS/", StringComparison.InvariantCultureIgnoreCase);
}
public override bool FileExists(string virtualPath)
{
return IsContentPath(virtualPath) || base.FileExists(virtualPath);
}
public override VirtualFile GetFile(string virtualPath)
{
return IsContentPath(virtualPath) ? new DbVirtualFile(virtualPath) : base.GetFile(virtualPath);
}
public override CacheDependency GetCacheDependency(string virtualPath, IEnumerable virtualPathDependencies, DateTime utcStart)
{
return null;
}
public override String GetFileHash(String virtualPath, IEnumerable virtualPathDependencies)
{
return Guid.NewGuid().ToString();
}
}
My Custom Virtual File:
public class DbVirtualFile : VirtualFile
{
public DbVirtualFile(string path): base(path)
{
}
public override System.IO.Stream Open()
{
string testPage = "This is a test!";
return new System.IO.MemoryStream(System.Text.ASCIIEncoding.ASCII.GetBytes(testPage));
}
}
gestore web.config ho cercato di utilizzare, senza successo. Attualmente dà errore 500:
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<remove name="FormsAuthenticationModule" />
</modules>
<handlers>
<add name="ApiURIs-ISAPI-Integrated-4.0"
path="/CMS/*"
verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS"
type="System.Web.Handlers.TransferRequestHandler"
preCondition="runtimeVersionv4.0" />
</handlers>
Se provo a navigare site.com/CMS/Home/Index, il metodo viene chiamato FileExists ma stranamente, il parametro virtualPath recieves solo ~/CMS/Casa.
Aggiunta di punti di interruzione, sembra che per l'url site.com/CMS/Home/Index, il metodo FileExists continui a essere chiamato ripetutamente. Questo potrebbe causare una ricorsione infinita, dando l'errore del server interno.
La risposta è utile. Ho ottenuto il mio codice funzionante, tuttavia la visualizzazione non riesce a eseguire il rendering dopo "System.IO.Stream Open()". Hai riscontrato lo stesso problema? –
No, non credo di averlo fatto. Quali errori stai vedendo? –
Solo un html vuoto reso dopo Open(). L'Open() ottiene correttamente la vista dal DB –