2016-06-16 4 views
1

La plupart des questions sur cette erreur (et wow, il y en a beaucoup) tournent autour de l'enregistrement dans un fichier, ce que je ne fais pas.Une erreur générique s'est produite dans GDI + avec iTextSharp, seulement sur un serveur particulier

Mon code est la suivante - 4.5 .NET, MVC3, IIS7.5, Win2008R2:

string fileName = /* something.png */; 
string imageLocation = HttpContext.Current.Server.MapPath(
    string.Format(@"~/Content/images/{0}", fileName)); 

var image = iTextSharp.text.Image.GetInstance(
    System.Drawing.Image.FromFile(imageLocation), 
    System.Drawing.Imaging.ImageFormat.Png); 

décompilation iTextSharp, la méthode GetInstance ressemble à:

public static Image GetInstance(Image image, ImageFormat format) 
{ 
    MemoryStream memoryStream = new MemoryStream(); 

    image.Save(memoryStream, format); // <-- Exception here 

    return Image.GetInstance(memoryStream.ToArray()); 
} 

L'exception que je reçois est :

System.Runtime.InteropServices.ExternalException (0x80004005):

Une erreur générique s'est produite dans GDI +.

à System.Drawing.Image.Save (flux Stream, encodeur ImageCodecInfo, EncoderParameters encoderParams)

à iTextSharp.text.Image.GetInstance (image d'image, format ImageFormat)

Il est donc défaut lors de la tentative de sauvegarde de l'image dans un MemoryStream, pas dans un fichier ou dans la réponse HTTP.

Cela a juste commencé à arriver à une application existante qui fonctionnait bien auparavant. Le même code fonctionne parfaitement sur un serveur différent et ma machine locale (tous les 3 sont 2008R2), et cela arrive à toutes les applications sur mon serveur de production (j'en ai 4), et même une toute nouvelle avec le même code que là-bas pour tester ce problème.

Donc je suppose qu'il y a quelque chose avec mon serveur de production spécifique, peut-être IIS. Les mises à jour de Windows semblent être les mêmes entre les deux serveurs, donc je ne pense pas que ce soit ça.

Autre chose que vous pourriez penser qui pourrait être spécifique à l'environnement pour causer cette erreur? Je peux retravailler le code pour nettoyer un peu notre partie, comme créer une nouvelle image en mémoire au lieu d'utiliser celle créée à partir du fichier, mais puisque c'est mon système de production, je préfèrerais trouver un court terme solution sans un correctif de code.

EDIT

Certaines choses intéressantes que je dépannage ... J'ai ajouté une application de la console au serveur, et il a couru en utilisant le même compte que l'application Web, avec le même code (seulement ceux quelques lignes), et cela a bien fonctionné. J'ai ajouté une application MVC vide avec les mêmes lignes, en utilisant un nouveau pool d'applications, et cela a bien fonctionné - j'ai changé ce pool d'applications pour utiliser le même compte utilisateur que l'application principale, et cela a toujours fonctionné.

J'ai changé la nouvelle application de test pour le même pool d'applications que l'application, et elle a échoué avec la même exception que l'application normale. Donc quelque chose ne va pas avec ce pool d'applications, mais ce n'est pas l'utilisateur.

Les pools d'applications sont identiques pour autant que je sache. Et le principal recycle du jour au lendemain, et j'ai vu le problème hier, alors un recyclage ne l'a pas coupé.

Si je n'arrive pas à comprendre quelque chose, je vais réinitialiser IIS et/ou le serveur ce soir et voir si cela l'efface.

EDIT 2

Je viens d'essayer diverses combinaisons de ce (à partir this question) sur mon application factice, ainsi que de mettre une autre image intermédiaire là-bas, et toujours rien ...

var image = System.Drawing.Image.FromStream(
    new MemoryStream(System.IO.File.ReadAllBytes(imageLocation))); 

var image3 = iTextSharp.text.Image.GetInstance(
    image, System.Drawing.Imaging.ImageFormat.Png); 
+0

Avez-vous regardé [this] (http://stackoverflow.com/questions/1772083/when-drawing-an-image-system-runtime-interopservices-externalexception-a-gener) question? –

+0

@FredrikLundvall Oui, j'ai vu ça, mais si je lis bien, ça ne devrait pas être aussi cohérent, non? Cela ne se produirait que selon l'humeur de l'éboueur à ce moment-là? À l'heure actuelle, 100% du temps sur mon serveur de production, j'obtiens l'erreur et 0% du temps dans mes deux autres. –

+0

Je suppose que vous avez raison, il ne devrait pas échouer tout le temps. –

Répondre

1

me rend fou ...

Cela a été résolu avec la "solution Microsoft" de l'éteindre et de le rallumer - une réinitialisation IIS avec iisreset /restart sur la ligne de commande, et il travaillé à nouveau.

Donc, je n'ai aucune idée de ce qui a causé le problème, ou si cela se reproduira.