1
我已經創建了下面的虛擬路徑提供加載從DB和意見時,認爲不存在於磁盤上,我看到我的DB方法被調用,用於返回true
FileExists方法。在那之後,沒有其他的方法被調用,頁面返回的404次是在磁盤上仍然呈現良好。數據庫調用GetByVirtualPath
只返回一個意見的內容。我已經驗證了這個對象是與數據水合。MVC 5的VirtualPathProvider工作不正常
的VirtualPathProvider
public class CMSVirtualPathProvider : VirtualPathProvider
{
public override bool FileExists(string virtualPath)
{
return base.FileExists(virtualPath) || MVCViewVersion.GetByVirtualPath(virtualPath) != null;
}
public override VirtualFile GetFile(string virtualPath)
{
if (base.FileExists(virtualPath))
{
return base.GetFile(virtualPath);
}
else
{
return new CMSVirtualFile(virtualPath, this);
}
}
public override string GetFileHash(string virtualPath, IEnumerable virtualPathDependencies)
{
if (base.FileExists(virtualPath))
{
return base.GetFileHash(virtualPath, virtualPathDependencies);
}
else
{
#if DEBUG
return null;
#else
return string.Format("{0}{1}", virtualPath, DateTime.UtcNow.ToString("dd HH"));
#endif
}
}
public override CacheDependency GetCacheDependency(string virtualPath, IEnumerable virtualPathDependencies, DateTime utcStart)
{
if (!base.FileExists(virtualPath))
{
return null;
}
return Previous.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart);
}
}
VirtualFile 此類從不打。
public class CMSVirtualFile : VirtualFile
{
private CMSVirtualPathProvider _ParentProvider;
public CMSVirtualFile(string virtualPath, CMSVirtualPathProvider parentProvider)
: base(virtualPath)
{
_ParentProvider = parentProvider;
}
public override System.IO.Stream Open()
{
string Content = string.Empty;
MVCViewVersion Version = MVCViewVersion.GetByVirtualPath(this.VirtualPath);
if (Version != null)
{
Content = Version.Content;
}
return new MemoryStream(ASCIIEncoding.Default.GetBytes(Content));
}
}
在global.asax中,我在Application_Start
方法中添加了以下鏈接。
HostingEnvironment.RegisterVirtualPathProvider(new CMSVirtualPathProvider());
我認爲一些事情已經改變,因爲這段代碼在我以前的MVC4實現中起作用。我無法指責我做錯了什麼。
這花了我永遠找到一個答案,我同樣的問題。我在調試時忽略了差異。 –
@Matty:請註明您的答案,答案爲未來的程序員更快地找到它。 – Oliver