ASP.Net - Несколько динамических изображений.Проблемы с производительностью из-за слишком большого количества Http-запросов

StackOverflow https://stackoverflow.com/questions/486924

Вопрос

Я использую HttpHandler для динамической отправки изображений в ASP.Сетевое веб-приложение.У меня проблема с производительностью (Firfox / Firebug / YSlow сообщает, что слишком много HttpRequests)

В некоторых случаях у меня есть от 50-100 изображений на страницу..3 древовидных представления (бизнес-единицы / категории / объекты), каждый узел которых имеет свое собственное изображение ;)

URL-адрес изображения каждого элемента задается динамически следующим образом...

Некоторое изображение.ImageUrl = "/image.axd?ImageID={0}";

Примечание:Я знаю только во время выполнения, какие изображения потребуются.

Дополнительный:Изображения расположены в файловой системе сервера, в файле ресурсов, а также в базе данных - пользователи могут загружать свои собственные изображения для сопоставления с объектами my system, а обработчик изображений будет определять местоположение каждого изображения динамически)

В web.config httphandler настроен и работает должным образом...добавить глагол="ПОЛУЧИТЬ" путь="image.axd" тип="Vision.OnsightManager.Обработчик изображений"

В HttpHandler байты необработанного изображения возвращаются в ответ на каждый запрос изображения.Таким образом, в методе WriteResponse() обработчика изображений возвращаются байты изображения, вот так...

контекст.Ответ.Двоичная запись (байты);

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

Вопрос:

Какой подход вы рекомендуете, помимо уменьшения количества изображений ;), для минимизации всех HttpRequests, генерируемых для каждого изображения?Может быть, объединение в один Http-запрос?

Я читал статьи об объединении нескольких css-запросов в один запрос, использовании сопоставления изображений (одно комбинированное изображение со смещениями) и т.д., Но, похоже, ни один из них не подходит для моего конкретного сценария?

Премного благодарен!

Это было полезно?

Решение

Одним из способов уменьшить нагрузку на сервер при повторных запросах является использование кэшируемости страницы.

Добавьте это перед ответом.Напишите в HttpHandler:

// Set for how long you want the image to be cached.
context.Response.Cache.SetExpires(DateTime.Now.AddDays(1)); 
context.Response.Cache.SetCacheability(HttpCacheability.Public);
context.Response.Cache.SetValidUntilExpires(true);
context.Response.Cache.VaryByParams["ImageId"] = true;

Это заставит сервер кэшировать результат (в зависимости от параметра ImageID), но это, конечно, поможет только при повторных запросах одного и того же изображения, а не при первом, так что это зависит от того, в чем на самом деле заключается проблема.

Не зная очень много о вашем приложении, кажется, что вам нужно изменить несколько вещей, чтобы найти лучшее решение...

Другие советы

Это не похоже на отличный способ обработки изображений.В первом случае вы должны избавить свой сервер от некоторых хлопот, разместив изображения на сервере в виде реальных изображений, а не получая их через ASP-страницу.

Затем вы устанавливаете срок действия содержимого на какой-то этап в будущем.Это, по крайней мере, упростит последующие запросы.

Я бы также попытался немного рационализировать изображения.Даже если у вас есть три древовидных представления, вы, вероятно, сможете найти много общих элементов.

Наконец, хотя для реализации потребуется некоторая работа, вы могли бы объединить изображения на стороне сервера, чтобы возвращать только одно изображение для дерева, я бы позаботился о том, чтобы вы где-нибудь кэшировали результат, если вы сделаете это, поскольку это увеличит нагрузку на сервер во время его генерации.

Вы могли бы попробовать увеличить количество рабочих потоков в вашем файле конфигурации asp.net.

Более подробную информацию можно найти здесь:
http://williablog.net/williablog/post/2008/12/02/Increase-ASPNET-Scalability-Instantly.aspx http://msdn.microsoft.com/en-us/library/ms187024.aspx

Я также добавлю, что стандарт HTTP ограничивает количество одновременных подключений к одному серверу всего 2 подключениями на клиента.IE, безусловно, применяет это ограничение, но Firefox, как я полагаю, ограничивает себя 4.Боюсь, эти ограничения настраиваются клиентом (вы не можете изменить их со стороны сервера).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top