Включение динамических изображений в веб-страницу - PullRequest
0 голосов
/ 05 января 2010

У меня есть веб-приложение, в котором пользователь может настраивать отчеты (ASP.NET MVC, без служб Reporting Services или чего-либо еще). Конфигурация затем представляется в виде объекта JavaScript, который отправляется на сервер в виде JSON для получения данных и создания отчета. HTML код выглядит примерно так:

<form method="post" action="/RenderReport" target="_blank">
    <input type="hidden" name="reportJson"/>
</form>

Это очень хорошо работает для открытия отчета в новом окне браузера. Тем не менее, в этом отчете я хочу включить изображения, которые генерируются из данных. Как это можно сделать хорошим способом? Очевидные способы, которые приходят на ум:

  1. Внедрить метаданные, необходимые для генерации изображений в URL, например <img src="/GenerateImage/?metadata1=2&metadata2=4"/>. Однако это не сработает, поскольку метаданные, вероятно, приведут к тому, что URL в IE будет превышать максимум 2083 символа.
  2. Используйте ajax-запрос POST, а затем, когда ответ вернется, создайте элемент изображения, например <img src="data:image/png;base64,{data_in_json_response}"/>. Однако это невозможно, поскольку мое приложение должно работать в IE6, который не поддерживает URI данных.
  3. Создание изображений при создании отчета, создание уникального ключа для каждого изображения, а затем использование URL-адресов в форме <img src="/GetCachedImage?id=23497abc289"/>. Это моя лучшая идея, но она ставит вопрос о том, где кэшировать изображения. Я могу думать о следующих местах:

    • На сессии. Преимущество: кэшированный элемент автоматически удаляется, когда сеанс прекращается. Недостаток: доступ к сеансу сериализует доступ к странице в течение сеанса. Это плохо в моем случае.
    • В базе данных: Преимущество: хорошо работает. Недостаток: ненужные накладные расходы, кэшированные элементы должны быть удалены некоторое время.
    • В объекте Application / Cache. Я действительно не продумал все преимущества и недостатки этого.

    Также возникает вопрос о том, когда удалять кэшированные элементы. Если я удаляю их сразу после показа изображения, кажется, что страница не может быть обновлена ​​или напечатана, если изображения не станут красными. Любой другой вариант означает дополнительную сложность.

Как можно решить эту проблему хорошим способом или хотя бы одной, не плохой?

Ответы [ 2 ]

0 голосов
/ 05 января 2010

Если у вас только один сервер, вы можете использовать гибридный подход. Создайте словарь кэшированных изображений, где «строка» - это значение вашего идентификатора в вашем примере. Объект - это набор параметров, необходимых для создания изображения. Затем вы можете просто сделать запрос на ваш сервер / generate / image / 123456 и вернуть соответствующий тип.

Это не сработает в ферме серверов, если у вас нет способа поделиться «объектом», который представляет ваши параметры. Вам все равно придется как-то почистить этот словарь или рискнуть его безграничным ростом.

0 голосов
/ 05 января 2010

Вы можете сделать кэш изображений с вращающимся диском довольно легко ... Google "Модуль изменения размера изображения ASP.NET", исходный код включает в себя модуль кэширования диска с настраиваемым размером.

Тем не менее,

Если отчет представляет собой HTML и содержит ссылки на изображения, у вас нет возможности узнать, как долго будет длиться этот отчет. Эти изображения могут понадобиться навсегда ... Скажем, кто-то копирует и вставляет их в электронное письмо ... Эти ссылки будут зависать и внезапно разрываться при очистке кэша.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...