3

ImageResizer 的 DiskCache 插件在本地运行良好,但是当我将 WebRole 部署到 Azure 时,部署分区太小而无法缓存大量文件。

具体来说,WebRole 分区在一个小角色上约为 1GB。我想将缓存目录指向:

  1. “C:”驱动器(一个小角色大约 200+GB)。
  2. 连接的驱动器(我指定的任何大小)。

问题是 WebRole 所需的写入权限。临时目录是否有简单的解决方法,或者我是否需要 PowerShell 脚本来配置虚拟目录上的 ACL 并将其附加到 WebRole 的站点?

在我走这条路之前,我想知道是否有人对此有合理的解决方法。

4

2 回答 2

2

在 ServiceDefinition.csdef 中:

<Task commandLine="makevdir.cmd" executionContext="elevated" taskType="background" />

Makevdir.cmd:

PowerShell -ExecutionPolicy Unrestricted .\makevdir.ps1 >> "%RoleRoot%\makevdir.txt" 2>&1
EXIT /B %errorlevel%

Makevdir.ps1:

# Make Virtual Directory for ImageResizer DiskCache plugin (/imagecache) 
Write-Host "makevdir.ps1 starting"

# $ImageCacheDir = $env:temp + "\imagecache"
#
# The TEMP paths are quota limited to ~100MB, so use a hard coded path:
$ImageCacheDir = "C:\Resources\AspNetTemp\imagecache"

Write-Host "ImageCacheDir = $ImageCacheDir"
md -Path $ImageCacheDir

# Set the ACL to allow IIS access to the new directory
$acl = Get-Acl $ImageCacheDir
$identity = "IIS_IUSRS"
$fileSystemRights = "Modify"
$inheritanceFlags = "ContainerInherit, ObjectInherit"
$propagationFlags = "None"
$accessControlType = "Allow"
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule($identity,          $fileSystemRights, $inheritanceFlags, $propagationFlags, $accessControlType)
$acl.SetAccessRule($rule)
Set-Acl $ImageCacheDir $acl

# Get the AppName by appending _Web/ to the RoleInstanceID environmental variable
$AppName = $env:RoleInstanceID + "_Web/"
Write-Host "AppName = $AppName"

# Retry creating the virtual directory every five seconds for a maximum of 20 tries
$tries = 0
& $Env:WinDir\system32\inetsrv\appcmd.exe add vdir /app.name:$AppName /path:/imagecache /physicalpath:$ImageCacheDir
while (!$? -and $tries -lt 20) {
$tries++
    sleep 5
& $Env:WinDir\system32\inetsrv\appcmd.exe add vdir /app.name:$AppName /path:/imagecache /physicalpath:$ImageCacheDir
}

Write-Host "makevdir.ps1 exiting"
Exit
于 2013-06-07T03:26:58.693 回答
0

由于 DiskCache 将文件服务委托给 IIS 以提高性能,因此您将需要一个 IIS 虚拟文件夹。

DiskCache 可以缓存/服务来自任何虚拟文件夹的文件,无论其物理位置如何(尽管本地存储是最好的 - 延迟是不可接受的)。

临时文件夹不起作用,因为 IIS 和 ASP.NET 运行时用户帐户都需要读/写访问权限,并且您肯定希望 DiskCache 是持久的。

听起来您确实需要为此编写设置脚本。我认为很多人都可以从这样的脚本中受益,如果你可以在它完成后分享它。下面介绍如何编写 IIS 虚拟文件夹脚本

于 2013-06-05T14:26:03.417 回答