Question

Il semble très facile d'utiliser System.Drawing pour créer des vignettes dans votre application ASP.NET. Mais MSDN vous indique :

  

Les classes de l'espace de noms System.Drawing ne sont pas prises en charge pour une utilisation dans un service Windows ou ASP.NET. Tenter d’utiliser ces classes à partir de l’un de ces types d’application peut générer des problèmes inattendus, tels que des pertes de performances du service et des exceptions au moment de l’exécution.

Je constate des erreurs intermittentes de «mémoire insuffisante» dans ce type de code GDI +. Je commence à croire que c'est la cause.

Comment les gens manipulent-ils les images côté serveur? Quelqu'un peut-il recommander une solution de rechange qui ne fera PAS exploser mon serveur?

Le code pertinent ci-dessous. L'exception se produit par intermittence dans System.Drawing.Graphics.DrawImage. Je viens juste d'hériter de ce projet. Je devrais donc consulter les journaux pour voir à quelle fréquence il est touché / à quelle fréquence nous recevons une exception ...

public byte[] Resize(int newWidth, int newHeight, Image orignalImage)
{
    Bitmap bitmap = new Bitmap(newWidth, newHeight);
    Graphics g = Graphics.FromImage(bitmap);
    g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;

    Rectangle r = new Rectangle(0, 0, newWidth, newHeight);
    g.DrawImage(orignalImage, r, r.X, r.Y, orignalImage.Width, orignalImage.Height, GraphicsUnit.Pixel);

    MemoryStream stream = new MemoryStream();
    bitmap.Save(stream, ImageFormat.Jpeg);

    // clean up memory leaks
    if (bitmap != null)
    {
        bitmap.Dispose();
        bitmap = null;
    }
    if (g != null)
    {
        g.Dispose();
        g = null;
    }


    return stream.ToArray();
}

UPDATE : j'ai cherché dans tout le projet où que nous utilisions GDI + et mis using () {} autour de tout ce qui est identifiable . Je n'ai pas vu d'exception "mémoire insuffisante" depuis que je l'ai fait.

Était-ce utile?

La solution

En supposant que vous fassiez des "choses" à la demande, les problèmes peuvent être

  1. Opération intensive en processeur: manipulation d'images, ce qui peut prendre du temps.

  2. Si vous enregistrez le fichier, des problèmes de disque risquent de se produire.

  3. Vous pouvez envisager d’utiliser Gestionnaires HTTP ,

  4. La disposition des objets System.Drawing doit être une priorité ( utilisation de () {} instruction)

  5. Les pages asynchrones peuvent être explorées ici.

Autres conseils

Pourquoi ne configurez-vous pas un serveur de travail séparé exposé via un service Web?

Je vous recommanderais d'insérer un code de traitement des exceptions autour de ces opérations afin de vous assurer de disposer de vos objets GDI +. Il est également recommandé de fermer vos flux ... bien que, à ma connaissance, l’objet MemoryStream soit géré, il devrait donc se fermer lui-même lorsqu’il est affiché.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top