2014-05-14 41 views
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实现中起作用。我无法指责我做错了什么。

回答

4

发现的问题。这很有趣。当FileExists检查发生virtualPath传递这样的:

〜/浏览/首页/ Index.cshml

GetFile被称为virtualPath是:

/Views/Home/Index.cshtml

这会导致DB查询尝试使用来自返回空值的DB的错误虚拟路径进行提取。然后这会抛出一个404.对于噩梦发现问题是一个简单的修复。

+0

这花了我永远找到一个答案,我同样的问题。我在调试时忽略了差异。 –

+1

@Matty:请注明您的答案,答案为未来的程序员更快地找到它。 – Oliver