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

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

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

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

SomeImage.ImageUrl = "/image.axd?ImageId= enj0‹";

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

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

В файле web.config httphandler настроен и работает как положено ... add verb = "GET" path = "image.axd" type = "Vision.OnsightManager.ImageHandler"

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

context.Response.BinaryWrite (байт);

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

Вопрос:

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

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

С большим удовольствием!

Ответы [ 3 ]

5 голосов
/ 28 января 2009

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

Добавьте это перед Response.Write в 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), но это, конечно, поможет только при повторных запросах одного и того же изображения, а не первого, поэтому это зависит от того, где на самом деле проблема. 1006 *

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

2 голосов
/ 28 января 2009

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

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

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

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

1 голос
/ 28 января 2009

Вы можете попробовать увеличить количество рабочих потоков в файле конфигурации 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 ограничивает количество одновременных подключений к одному серверу всего двумя подключениями на клиента. IE, конечно, применяет это ограничение, но, по-моему, Firefox I ограничивает себя до 4. Эти ограничения настраиваются клиентом, я боюсь (их нельзя изменить со стороны сервера).

...