我创建了以下虚拟路径提供程序来从数据库加载视图,当磁盘上不存在视图时,我看到我的DB方法被调用并返回true
的FileExists方法。之后,没有其他方法被调用,页面返回404.磁盘上的视图仍然正常。数据库调用GetByVirtualPath
只返回一个视图内容。我已经验证了这个对象是用数据保存的。
的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实现。我不能指责我做错了什么。
答案 0 :(得分:4)
发现了这个问题。这很有趣。当FileExists
检查发生时,virtualPath
会像这样传递:
〜/查看/主页/ Index.cshml
调用GetFile
时,virtualPath
为:
/Views/Home/Index.cshtml
这会导致数据库查询尝试使用来自DB的错误虚拟路径来提取并返回空值。然后抛出一个404.这是一个简单的解决噩梦找到问题的方法。