MVC 5 VirtualPathProvider未按预期工作

时间:2014-05-14 13:18:57

标签: asp.net-mvc asp.net-mvc-5

我创建了以下虚拟路径提供程序来从数据库加载视图,当磁盘上不存在视图时,我看到我的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实现。我不能指责我做错了什么。

1 个答案:

答案 0 :(得分:4)

发现了这个问题。这很有趣。当FileExists检查发生时,virtualPath会像这样传递:

〜/查看/主页/ Index.cshml

调用GetFile时,virtualPath为:

/Views/Home/Index.cshtml

这会导致数据库查询尝试使用来自DB的错误虚拟路径来提取并返回空值。然后抛出一个404.这是一个简单的解决噩梦找到问题的方法。