1

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

}
4

2 回答 2

5

这里的简单答案是将图像存储从 SQL 移动到 Azure 存储 Blob。然后可以将这些 blob 的容器公开并通过 URL 访问,而无需您充当缓存层的中介。

但是,如果您仍然希望您的应用程序通过 http 处理程序充当中介,您应该仍然能够使用 1.3 SDK 来实现。此版本引入了完整的 IIS,它允许您在 Web 角色中配置虚拟目录和 http 处理程序。

但我真的建议你看看公共可读的 blob 容器的使用。它为您提供相同级别的功能,但大大减少了工作量。您甚至可以结合这些技术,在需要时加入一些 Azure AppFabric 缓存,以增加更多的灵活性和功能。

于 2011-02-02T13:38:07.657 回答
1

正如 Brent 所说,Azure 存储 blob 会有所帮助,特别是如果您启用内容交付网络,该网络在全球拥有大约 2 打节点。

本地目录缓存不适用于仅本地目录,因为每个实例都有一个单独的缓存目录。这就是为什么许多人一直在使用 memcached 来满足他们的多实例缓存需求(David Aiken 最近发布了一篇关于在 Azure 中进行设置的文章)。

Brent 暗示了 Azure AppFabric 缓存,它目前处于“预览”模式(您可以免费试用,但还没有完全准备好投入生产)。这将很容易让您在实例之间缓存数据(甚至是 asp.net 会话状态)。

你如何在 Blob 和本地缓存之间进行选择???使用缓存解决方案(例如 memcached 或 AppFabric 缓存),您可以更好地控制访问内容的人员,以及捕获表示下载总字节数的性能计数器的能力。使用 Blob 可以减轻您的角色实例的大量工作(网络、IIS 处理和字节转换、缓存编码等),甚至加快用户的浏览器体验(浏览器通常默认只有两个到特定地址的并发连接;从技术上讲,blob 将位于不同的 URL)。此外,您可以使用内容交付网络来提高经常访问的图像的性能。

于 2011-02-02T16:07:07.770 回答