Я создал 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;
}
}