2009-01-28 8 views
2

J'utilise un HttpHandler pour diffuser dynamiquement des images dans une application Web ASP.Net. J'ai un problème de performance (Firfox/Firebug/YSlow signale qu'il y a trop de requêtes HttpRequests)ASP.Net - Images dynamiques multiples. Problèmes de performances dus à trop de requêtes HTTP

J'ai parfois entre 50 et 100 images par page .. 3 arborescences (unités/catégories/objets) avec chacune noeud ayant sa propre image;)

image Chaque élément url est défini dynamiquement comme si ...

SomeImage.ImageUrl = "/image.axd?ImageId={0}";

Remarque: Je ne connais que les images qui seront nécessaires au moment de l'exécution.

supplémentaires: Les images sont situés sur le système de fichiers du serveur, dans un fichier de ressources et aussi dans la base de données - Les utilisateurs peuvent télécharger leurs propres images pour associer à mes objets système et le ImageHandler détermineront chaque emplacement d'image dynamique)

Dans le web.config le HttpHandler est configuré et fonctionne comme prévu ... ajouter verbe = "GET" path = type "image.axd" = "Vision.OnsightManager.ImageHandler"

Dans le HttpHandler l'image brute les octets sont renvoyés en réponse à chaque requête d'image. Ainsi, dans la méthode WriteResponse() du gestionnaire d'images, les octets d'image sont renvoyés, comme cela ...

context.Response.BinaryWrite (bytes);

Toutes les images afficher correctement, mais l'application a des problèmes de performance comme prévu où de nombreuses images sont affichées ...

Question:

Quelle approche préconisez-vous, en plus de réduire le nombre d'images;), pour minimiser toutes les requêtes HttpRequests générées pour chaque image? Peut-être combiner en une seule demande Http?

J'ai lu des articles sur la combinaison de plusieurs requêtes CSS en une seule requête, en utilisant un mappage d'image (image combinée unique avec des décalages), etc., mais aucune ne semble convenir à mon scénario particulier.

Beaucoup obligé!

+0

Je suggère à la fois [la mise en cache du disque] (http://imageresizing.net) et envoyer des en-têtes de mise en cache client afin que les demandes répétées n'aient pas à toucher le serveur. Cela ressemble à une application métier, où la plupart des utilisateurs la visitent plusieurs fois, et la mise en cache corrige probablement le nombre de requêtes. –

Répondre

5

Une façon de réduire les risques sur le serveur lors de demandes répétées consiste à utiliser la mise en cache des pages.

Ajouter cette avant Response.Write dans le 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; 

Cela rendra le serveur à mettre en cache le résultat (en fonction de la ImageID param) mais cela bien sûr que l'aide sur les demandes répétées de la même image, pas le premier, donc cela dépend de l'endroit où le problème est réellement.

Sans connaître beaucoup sur votre application, il semble que vous devez changer plusieurs choses pour trouver une meilleure solution ...

+0

Wow. Merci pour toutes les bonnes réponses. Y a-t-il un moyen de répondre à la première demande? L'approche du cache client ne fait que commencer après que la demande initiale, qui sera lente, le cache pré-client est utilisé? – Konrad

2

Cela ne semble pas être un excellent moyen de gérer les images. Dans un premier temps, vous devriez épargner de la peine à votre serveur en plaçant les images comme de vraies images sur le serveur plutôt que de les obtenir via une page ASP.

Ensuite, vous définissez l'expiration du contenu à un certain stade dans le futur. Cela rendra au moins les demandes ultérieures plus simples.

Je voudrais aussi essayer de rationaliser les images un peu. Même si vous avez trois vues arborescentes, vous pouvez probablement trouver de nombreux éléments communs. Enfin, même si cela prendrait du travail à implémenter, vous pouvez combiner le côté serveur d'images pour que vous ne retourniez qu'une seule image pour un arbre, je ferais en sorte de mettre en cache le résultat quelque part si vous le faites car cela mettra charger sur le serveur pendant qu'il génère.

1

Vous pouvez essayer d'augmenter le nombre de threads de travail dans votre fichier de configuration asp.net.

Plus d'informations peuvent être trouvées ici:
http://williablog.net/williablog/post/2008/12/02/Increase-ASPNET-Scalability-Instantly.aspx http://msdn.microsoft.com/en-us/library/ms187024.aspx

Je vais aussi ajouter que la norme HTTP limite le nombre de connexions simultanious à un seul serveur à seulement 2 connexions par client. IE applique certainement cette restriction, mais Firefox je crois qu'il se limite à 4. Ces restrictions sont configurables par le client J'ai peur (vous ne pouvez pas les changer du côté du serveur).

Questions connexes