создание изображений в Azure asp.net - PullRequest
1 голос
/ 02 февраля 2011

В настоящее время я работаю с сайтом выделенного сервера, но в будущем хочу расширить его с помощью облачной платформы Microsoft Azure, но я не уверен, будет ли определенная часть моего кода работать на Azure.

Сайт состоит из галереи предметов с изображением каждого предмета. Изображения хранятся в базе данных sqlserver.

Я создал обработчик http, который кэширует изображения на диск и перенаправляет запрос на изображение (как показано в конце сообщения).

Изображения сохраняются в виртуальном каталоге под названием «imagecache» в моем приложении ASP.NET. (т.е. ~ / imagecache /).

Поскольку веб-приложение будет работать во многих экземплярах виртуальной машины на платформе Azure, изображения должны будут совместно использоваться экземплярами, верно?

Итак, мой вопрос на самом деле: каков наилучший способ достижения того, что у меня уже есть, совместимого с лазурью?

Спасибо

Код изображения .. .. 1015 *

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 ]

5 голосов
/ 02 февраля 2011

Простой ответ здесь - переместить хранилище изображений из SQL в BLOB-объекты хранилища Azure.Контейнер для этих больших двоичных объектов можно затем сделать общедоступным и доступным через URL-адрес, при этом вам не нужно выступать в качестве посредника с вашим уровнем кэширования.

Однако, если вы по-прежнему хотите, чтобы ваши приложения выполняли роль посредника через обработчик http, вы все равно сможете выполнить это с помощью 1.3 SDK.Этот версон представил полный IIS, который позволяет вам настраивать виртуальные каталоги и обработчики http внутри веб-роли.

Но я бы порекомендовал вам взглянуть на использование общедоступных контейнеров больших двоичных объектов.Это дает вам тот же уровень функциональности для значительно сниженного уровня усилий.Вы даже можете комбинировать приемы, добавляя кеширование в Azure AppFabric, чтобы добавить больше гибкости и возможностей при необходимости.

1 голос
/ 02 февраля 2011

Как сказал Брент, BLOB-объекты хранилища Azure помогут, особенно если вы включите сеть доставки контента, которая насчитывает около 2 десятков узлов по всему миру.

Кэширование локального каталога не будет работать только с локальным каталогом, так как у вас будет отдельный каталог кэша для каждого экземпляра. Вот почему многие люди используют memcached для своих потребностей в кэшировании нескольких экземпляров (Дэвид Айкен недавно опубликовал статью о настройке этого в Azure).

Брент намекнул на Azure AppFabric Cache, который в настоящее время находится в режиме предварительного просмотра (вы можете попробовать его бесплатно, но он еще не совсем готов к работе). Это позволит вам легко кэшировать данные между вашими экземплярами (даже состояние сеанса asp.net).

Как вы выбираете между BLOB-объектами и локальным кешем ??? Используя решение для кеширования, такое как memcached или AppFabric cache, вы получите больший контроль над доступом к вашему контенту, а также сможете отслеживать счетчики производительности, представляющие общее количество загруженных байтов. Работа с BLOB-объектами освобождает ваши роли от выполнения большого количества работы (работа в сети, обработка IIS и байтовое преобразование, кодирование для кэша и т. Д.) И даже ускоряет работу браузера пользователя (браузеры обычно по умолчанию используют только два одновременных подключения к определенному адресу; технически капли будут по другому URL). Кроме того, вы можете использовать сеть доставки контента для повышения производительности часто используемых изображений.

...