2013-03-09 57 views
0

我创建了一个VirtualPathProvider以允许基于Request.Host移动自定义文件夹中的所有资源,以使用一个Web应用程序管理多个域。Azure中的VirtualPathProvider在发布时无法正常工作

在我的本地机器上,MVC应用程序工作,当我发布到Azure时,我获得了一个不明确的错误(HTTP 503),我不明白我需要检查以获取更多信息。

这里提供的实现:

public class PerSiteVirtualPathProvider : VirtualPathProvider 
{ 
    private readonly IDictionary<string, string> domainToPath; 

    public PerSiteVirtualPathProvider(IDictionary<string, string> domainToPath) 
    { 
     this.domainToPath = domainToPath; 
    } 

    public override bool FileExists(string virtualPath) 
    { 
     return base.FileExists(virtualPath) || PerSiteFileExists(virtualPath); 
    } 

    public override bool DirectoryExists(string virtualDir) 
    { 
     return base.DirectoryExists(virtualDir) || PerSiteFileExists(virtualDir); 
    } 

    public override string GetFileHash(string virtualPath, IEnumerable virtualPathDependencies) 
    { 
     if (PerSiteFileExists(virtualPath)) 
     { 
      var host = HttpContext.Current.Request.Url.Host.ToLower(); 

      return string.Concat(host, "/", virtualPath); 
     } 

     return base.GetFileHash(virtualPath, virtualPathDependencies); 
    } 

    public override VirtualFile GetFile(string virtualPath) 
    { 
     if (PerSiteFileExists(virtualPath)) 
     { 
      var physicalPath = CombinePath(virtualPath); 
      return new PhysicalVirtualFile(virtualPath, physicalPath); 
     } 

     return base.GetFile(virtualPath); 
    } 

    public override CacheDependency GetCacheDependency(string virtualPath, IEnumerable virtualPathDependencies, DateTime utcStart) 
    { 
     if (PerSiteFileExists(virtualPath)) 
     { 
      var host = HttpContext.Current.Request.Url.Host.ToLower(); 

      return new CacheDependency(new[] { CombinePath(virtualPath) }, new[] { host }); 
     } 

     return Previous.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart); 
    } 

    private string CombinePath(string virtualPath) 
    { 
     var host = HttpContext.Current.Request.Url.Host.ToLower(); 

     var cleanVirtualPath = virtualPath.TrimStart('~', '/').Replace('/', '\\'); 

     if (!domainToPath.ContainsKey(host)) 
     { 
      throw new InvalidOperationException(string.Format("The specified '{0} domain is not registered.", host)); 
     } 

     var domainFolder = domainToPath[host]; 

     var path = Path.Combine(domainFolder, cleanVirtualPath); 

     return path; 
    } 

    private bool PerSiteFileExists(string virtualPath) 
    { 
     var path = CombinePath(virtualPath); 

     var fileExists = File.Exists(path); 

     return fileExists; 
    } 
} 

回答

2

我解决了这个问题,我用App_Data目录读取所有的资源,这是不允许的的VirtualPathProvider,看到here,特别是在备注段落:

您不能存储ASP.NET应用程序文件夹或生成应用程序级程序集的文件在虚拟文件系统中。这包括:滨,App_Code文件:

  • Global.asax文件
  • Web.config文件中由XmlSiteMapProvider使用
  • 网站地图数据文件包含应用组件或产生 应用组件
  • 目录,App_GlobalResources,任何App_LocalResources
  • 应用程序数据文件夹,App_Data
相关问题