我目前正在运行一个专用服务器的站点,但希望将来使用Microsofts Azure云平台进行扩展,但我不确定我的代码的一部分证书是否适用于azure。
该网站包含一个项目库,每个项目都有一个图片。 图像存储在sqlserver数据库中。
我创建了一个http处理程序,将图像缓存到磁盘并将请求重定向到图像(如帖子末尾所示)。
图像被保存到ASP.NET应用程序中名为“imagecache”的虚拟目录中。 (即〜/ imagecache /)。
由于Web应用程序将在Azure平台上的许多虚拟机实例中运行,因此需要在实例之间共享图像吗?
所以我的问题确实是..实现我已经拥有的最好的方法是兼容机智?
由于
图片代码..
public class getimage : IHttpHandler {
private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public void ProcessRequest (HttpContext context) {
try
{
string uniqueid = "";
if(context.Request.QueryString["id"]) uniqueid = context.Request.QueryString["id"].ToString();
string dir = "~/imagecache/";
string image_target_path = dir + "image-file-" + uniqueid + ".png";
byte[] data = null;
context.Response.ContentType = "image/png";
if (!System.IO.File.Exists(context.Server.MapPath(image_target_path)))
{
if (context.Request.QueryString["id"] != null)
{
// get image data from the database
data = ImageHelper.getDatabaseImageDataByID(Convert.ToInt32(uniqueid));
using (System.Drawing.Image img = System.Drawing.Image.FromStream(new System.IO.MemoryStream(data)))
{
// save image to disk in the virtual dir
img.Save(context.Server.MapPath(image_target_path));
}
}
else
{
// set a sample image if no id is set
image_target_path = "~/images/noimage.png";
}
}
// redirect request to image file
context.Response.Redirect(image_target_path, false);
}
catch (Exception ex)
{
log.Error(ex.Message, ex);
}
}
public bool IsReusable {
get {
return false;
}
}
}
答案 0 :(得分:5)
这里的简单答案是将图像存储从SQL移动到Azure存储Blob。然后,可以将这些blob的容器公开并通过URL访问,而无需您充当缓存层的中介。
但是,如果您仍希望您的应用程序通过http处理程序充当该中介,那么您仍然可以使用1.3 SDK完成该操作。本节介绍了完整的IIS,它允许您在Web角色中配置虚拟目录和http处理程序。
但我真的建议你看一下使用公共可读的blob容器。它为您提供了相同级别的功能,可显着降低工作量。您甚至可以将这些技术结合起来,投入一小撮Azure AppFabric缓存,以便在需要时添加更多灵活性和功能。
答案 1 :(得分:1)
正如布伦特所说,Azure存储blob会有所帮助,特别是如果您启用Content Delivery Network,它在全球拥有大约2个节点。
本地目录缓存不仅适用于本地目录,因为每个实例都有一个单独的缓存目录。这就是为什么许多人一直在使用memcached来满足他们的多实例缓存需求(David Aiken最近发布了一个article关于在Azure中设置它的原因。)
布伦特暗示Azure AppFabric Cache,目前处于'预览'模式(你可以免费试用,但还没有为生产做好准备)。这将允许您在实例之间缓存数据(甚至是asp.net会话状态)。
如何在Blob和本地缓存之间进行选择???使用memcached或AppFabric缓存等缓存解决方案,您可以更好地控制访问内容的人员,以及捕获表示下载总字节数的性能计数器的能力。使用Blob可以减轻大量工作的角色实例(网络,IIS处理和字节转换,缓存编码等),甚至可以加快用户的浏览器体验(浏览器通常默认只有两个并发连接到特定地址; blob在技术上会在不同的URL)。此外,您可以使用内容传送网络来提高经常访问的图像的性能。