2014-05-14 40 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