C# Azure中的VirtualPathProvider在发布时不工作

C# Azure中的VirtualPathProvider在发布时不工作,c#,azure,virtualpathprovider,C#,Azure,Virtualpathprovider,我创建了一个VirtualPathProvider,允许根据Request.Host移动自定义文件夹中的所有资源,以便使用一个web应用程序管理多个域 在我的本地机器上,MVC应用程序可以工作,当我发布到Azure时,我得到一个不清楚的错误(HTTP 503),我不明白我需要检查什么才能获得更多信息 以下是提供程序的实现: public class PerSiteVirtualPathProvider : VirtualPathProvider { private readonly ID

我创建了一个VirtualPathProvider,允许根据Request.Host移动自定义文件夹中的所有资源,以便使用一个web应用程序管理多个域

在我的本地机器上,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;
    }
}
公共类PerSiteVirtualPathProvider:VirtualPathProvider { 私有只读词典领域病; 公共PerSiteVirtualPathProvider(IDictionary域网) { this.domainToPath=domainToPath; } 公共覆盖布尔文件存在(字符串virtualPath) { 返回base.FileExists(virtualPath)| | perstefileexists(virtualPath); } 公共覆盖布尔目录存在(字符串virtualDir) { return base.DirectoryExists(virtualDir)| | perstefileExists(virtualDir); } 公共重写字符串GetFileHash(字符串virtualPath、IEnumerable virtualPath依赖项) { if(perstefileexists(virtualPath)) { var host=HttpContext.Current.Request.Url.host.ToLower(); 返回字符串.Concat(主机“/”,virtualPath); } 返回base.GetFileHash(virtualPath,virtualPath依赖项); } 公共重写VirtualFile GetFile(字符串virtualPath) { if(perstefileexists(virtualPath)) { var physicalPath=CombinePath(虚拟路径); 返回新的PhysicalVirtualFile(virtualPath,physicalPath); } 返回base.GetFile(virtualPath); } 公共重写CacheDependency GetCacheDependency(字符串virtualPath、IEnumerable virtualPath Dependencies、DateTime utcStart) { if(perstefileexists(virtualPath)) { var host=HttpContext.Current.Request.Url.host.ToLower(); 返回新的CacheDependency(new[]{CombinePath(virtualPath)},new[]{host}); } 返回Previous.GetCacheDependency(virtualPath、virtualPath Dependencies、utcStart); } 专用字符串组合路径(字符串虚拟路径) { var host=HttpContext.Current.Request.Url.host.ToLower(); var cleanVirtualPath=virtualPath.TrimStart(“~”,“/”).Replace(“/”,“\\”); if(!domainToPath.ContainsKey(主机)) { 抛出新的InvalidOperationException(string.Format(“指定的{0}域未注册。”,主机)); } var domainFolder=domainToPath[host]; var path=path.Combine(域文件夹,cleanVirtualPath); 返回路径; } 私有布尔PerSiteFileExists(字符串virtualPath) { var路径=组合路径(虚拟路径); var fileExists=File.Exists(路径); 返回文件存在; } }
我解决了这个问题,我使用App_数据目录读取了所有资源,这是VirtualPathProvider不允许的,请特别参阅备注段落:

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

  • Global.asax文件
  • Web.config文件
  • XmlSiteMapProvider使用的站点地图数据文件
  • 包含应用程序集或生成 应用程序程序集:Bin、App_代码、App_全局资源、任意App_本地资源
  • 应用程序数据文件夹,应用程序数据