鉴于您在上面的评论,为什么不创建一个后台任务,在上传时将大小调整为所有可接受的大小,并将每个任务存储到 Azure blob 存储中。你是对的,如果你根据请求调整大小,你会遇到一些延迟和滞后,因为你需要下载源图像,调整大小,然后上传到 blob 存储,然后将用户重定向到你的 blob 存储 url。鉴于 blob 存储的“便宜”,我认为多花几毛钱购买额外的存储将超过上述场景的潜在缓慢性。
伪代码如下:
[HttpPost]
public ActionResult FileUpload(HttpPostedBaseFile file){
if(ValidateFile(file)){
//fire off a background tasks that resizes and stores each file size to the azure
//blog storage. You could use a naming scheme such as id_size.imageTypeExtension
}
}
现在,当被要求提供文件时,您仍然可以使用相同的例程,但不是返回文件结果,而是返回重定向结果
public ActionResult GetImage(string hash){
//do stuff to get image details
return Redirect("http://yourAzureBlobStorageDomain.com/Assets/Images/Cache/" + imageDetails")
}
这很酷,因为您不需要将图像下载到 Web 服务器然后提供它,而只需将请求直接重定向到 blob 存储!这会影响如下的图像标签
<img src="@Url.RouteUrl("GetImage", "Images" new {hash = hash})"/>
会影响您的 Web 应用程序,强制重定向到 Blob 存储中的实际图像位置。
您不想在 Azure Web 角色上永久存储任何内容是正确的,因为 Web 角色可以随时移动,从而丢失任何本地存储的数据。
这只是一种简单的方法,可以让您的代码库保持现在的状态,只需进行最少的更改。您可以修改它以使其行为更像您现在所拥有的,因为如果图像存在,您可以查询 blob 存储,如果存在,则重定向,如果不存在,则生成,存储和重定向,但我相信您会发现您会鉴于您需要下载源图像,完成您的工作,然后重新上传图像,然后再指示用户的浏览器去哪里找到它,此时还有更多延迟问题。
但是,这将由您决定是否值得花费额外的时间来按需调整大小与存储每个图像的多个大小的成本。附带说明一下,当从我们的 web/worker 角色使用 blob 存储时,我们没有注意到明显的延迟问题。显然它高于从磁盘中检索,但它并没有真正构成我们能够看到的显着增加。