在Azure asp.net中生成图像

时间:2011-02-02 13:02:28

标签: asp.net azure azure-storage image-generation

我目前正在运行一个专用服务器的站点,但希望将来使用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;
        }
    }

}

2 个答案:

答案 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)。此外,您可以使用内容传送网络来提高经常访问的图像的性能。