VirtualPathProvider в Azure не работает при публикации

Я создал VirtualPathProvider, чтобы позволить перемещать все ресурсы в пользовательскую папку на основе Request.Host, чтобы управлять несколькими доменами с помощью одного веб-приложения.

На моем локальном компьютере приложение 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;
    }
}

person Matteo Migliore    schedule 09.03.2013    source источник


Ответы (1)


Я решил проблему, я использовал каталог App_Data для чтения всех ресурсов, что не разрешено для VirtualPathProvider, см. здесь, в частности, в параграфе "Примечания":

Вы не можете хранить папки или файлы приложений ASP.NET, которые создают сборки уровня приложения, в виртуальной файловой системе. Это включает в себя:

  • Файл Global.asax
  • Файлы Web.config
  • Файлы данных карты сайта, используемые XmlSiteMapProvider.
  • Каталоги, содержащие сборки приложений или генерирующие сборки приложений: Bin, App_Code, App_GlobalResources, любые App_LocalResources.
  • Папка данных приложения, App_Data
person Matteo Migliore    schedule 20.03.2013