none
A generic error occurred in GDI+. - Probleme beim Hosting RRS feed

  • Frage

  • Hallo,

    Ich habe meine asp.net Seite gehoste, kriege jedoch nach ausführung meines Codes folgenden Fehler, den ich beim lokalen testen nicht bekomme.

    Komisch ist das in der Fehlermeldung meine lokalen Pfade angegeben sind. Woran kann das liegen?

    P.S.: Ich habe meinen Usernamen durch xx ersetzt.

    Server Error in '/hairpinASP' Application.
    A generic error occurred in GDI+.
    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
    
    Exception Details: System.Runtime.InteropServices.ExternalException: A generic error occurred in GDI+.
    
    Source Error:
    
    An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.
    
    Stack Trace:
    
    [ExternalException (0x80004005): A generic error occurred in GDI+.]
      System.Drawing.Image.Save(String filename, ImageCodecInfo encoder, EncoderParameters encoderParams) +461268
      System.Drawing.Image.Save(String filename, ImageFormat format) +69
      RodeoSmallBusiness.execute.drawNow(Object ypbreite, Object xphoehe, Object ema, Object geo) in C:\Users\xx\Documents\Visual Studio 2010\Projects\RodeoSmallBusiness\RodeoSmallBusiness\excecute\execute.aspx.vb:1061
      RodeoSmallBusiness.execute.weiter(Object inputarray, Object xphoehe, Object ypbreite, Object af) in C:\Users\xx\Documents\Visual Studio 2010\Projects\RodeoSmallBusiness\RodeoSmallBusiness\excecute\execute.aspx.vb:928
      RodeoSmallBusiness.execute.einlesen() in C:\Users\xx\Documents\Visual Studio 2010\Projects\RodeoSmallBusiness\RodeoSmallBusiness\excecute\execute.aspx.vb:283
      RodeoSmallBusiness.execute.btnBerechnen_Click(Object sender, EventArgs e) in C:\Users\xx\Documents\Visual Studio 2010\Projects\RodeoSmallBusiness\RodeoSmallBusiness\excecute\execute.aspx.vb:1234
      System.Web.UI.WebControls.Button.OnClick(EventArgs e) +118
      System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +112
      System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
      System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
      System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +36
      System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +5563
    
    
    Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.1 
    

    Mittwoch, 2. März 2011 14:15

Antworten

  • Hi,

    Das kann ich leider nicht sagen. Hab auch schon ausprobiert die Bilder im Root Verzeichnis abzulegen ebenfalls kein Erfolg.

    im Root geht das meist gar nicht, auch nicht in den normalen Ordnern der Anwendung. Probier mal App_Data (ggfs. anlegen, wenns nicht vorhanden ist). Ansonsten gibt es evtl. ein vorgefertigtes Verzeichnis für Access Datenbanken oder ähnliches. Wenn es sowas gibt (trifft auch auf App_Data zu), kannst Du dort aber nur schreiben, nicht per Http abrufen :)

    Wie kann ich den rausfinden (Script o.ä.??) ob ich Ändern Rechte habe? Ich kann bei dem Provider so gut wie gar nichts einstellen.

    Einfach probieren, bspw. per System.IO.File.WriteAllText( "X:\Ordner\Datei.txt", "Abc" ) eine Textdatei zu schreiben.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    • Als Antwort markiert megahairpin Samstag, 12. März 2011 17:48
    Samstag, 12. März 2011 17:25
    Moderator

Alle Antworten

  • Hi,

    das kann (leider) an vielem liegen. Ich tippe auf ein Grafikformat, welches nicht verarbeitet werden kann, ein Jpeg mit mehreren Bildern in einer Datei (bspw. Thumbnail und Normalgröße) oder auch einfach fehlerhafte Werte in den Encoderparametern bzw. der CodecInfo.

    Am hilfreichsten wäre es, wenn Du genau die Grafikdatei, die hier Probleme macht, nimmst und ein aufs absolute Minimum reduziertes Beispiel aufbaust. Wenn dort auch nicht nachvollziehbar ist, wo das Problem nun liegt, poste beides mal hier.

    BTW: GDI+ und Co. sind in ASP.NET nicht supported (sollten aber eigentlich dennoch funktionieren, Ausnahmen bestätigen leider oft die Regel :)

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Mittwoch, 2. März 2011 23:10
    Moderator
  • Hallo Stefan,

    Erstmal vielen dank für deine Antwort!!!

    Ich hab eher das Gefühl das da was mit den Server Einstellungen nicht passt oder das Problem ganz woanders begraben ist. Wie schon erwähnt wenn ich den Code lokal auf meinem IIS laufen lasse läuft es ohne Probleme. Sobald ich es aber auf den Server hochlade und ausführe (web.config geändert) kommt diese Fehlermeldung s.o. . Ich poste hier mal den Code der die Graphik erstellt.

    Was auch noch sein könnte, das auf dem Web Server das 3.5 Framework läuft und bei mir lokal das 4.0 ...

      Sub drawNow(ByVal ypbreite, ByVal xphoehe, ByVal ema, ByVal geo)
    
        Dim gt(0, 1), g1(1, 4), gmax As Double
        'Versuchsweise Graphische Ausgabe
        Dim schrift As System.Drawing.Font = New System.Drawing.Font("Arial", 10)
        Dim gtext As String
        Dim mittex, gtemp As Double
        Dim mittey As Double
        Dim ueberstand As Double
        Dim k, k3 As Integer
    
        k = ema.GetUpperBound(0)
        ueberstand = Val(boxueberstand.Text)
    
        Do While ema(k, 3 + gtemp * 4) <> 0
          gtemp = gtemp + 1
        Loop
    
        Dim width As Integer = ypbreite
        Dim height As Integer = xphoehe
        Dim bmp As New Bitmap(width + 30, height + 30)
        Dim g As Graphics = Graphics.FromImage(bmp)
    
        Dim rectToFill As New System.Drawing.Rectangle()
    
        Dim stringFormat As New StringFormat()
        stringFormat.FormatFlags = StringFormatFlags.DirectionVertical
    
        g.SmoothingMode = SmoothingMode.HighQuality
    
        rectToFill.Width = width + 30
        rectToFill.Height = height + 300
    
        g.FillRectangle(Brushes.White, rectToFill)
        g.DrawRectangle(Pens.Black, 20, 20, width, height)
    
        g.DrawString(CStr(xphoehe), schrift, Brushes.Black, 0, xphoehe / 2, stringFormat)
        g.DrawString(CStr(ypbreite), schrift, Brushes.Black, ypbreite / 2, 0)
    
        'Graphik end
    
        gt(0, 0) = ueberstand    '% gt = temporärer Startpunkt links unten
        gt(0, 1) = ueberstand
    
        For k2 = 1 To gtemp     '% Für jeden Schritt
    
          For k3 = 1 To ema(k, 4 + (k2 - 1) * 4) '% Für jedes Exemplar
    
            gmax = ema(k, 1 + (k2 - 1) * 4) Xor ema(k, 3 + (k2 - 1) * 4) - 2  ' % Index der Primärkoordinate
            For k4 = 0 To 4
              g1(0, k4) = gt(0, 0)
              g1(1, k4) = gt(0, 1)
            Next
    
            g1(0, 2) = g1(0, 2) + geo(ema(k, 2 + (k2 - 1) * 4), 2 + gmax) - 2 * ueberstand
            g1(0, 3) = g1(0, 3) + geo(ema(k, 2 + (k2 - 1) * 4), 2 + gmax) - 2 * ueberstand
    
            g1(1, 1) = g1(1, 1) + geo(ema(k, 2 + (k2 - 1) * 4), 3 - gmax) - 2 * ueberstand
            g1(1, 2) = g1(1, 2) + geo(ema(k, 2 + (k2 - 1) * 4), 3 - gmax) - 2 * ueberstand
    
            gtext = geo(ema(k, 2 + (k2 - 1) * 4), 0) + 1
            'Zuordnung der Punkte
    
            Dim punkt1 As PointF = New PointF(g1(0, 0) + 20, g1(1, 0) + 20)
            Dim punkt2 As PointF = New PointF(g1(0, 1) + 20, g1(1, 1) + 20)
            Dim punkt3 As PointF = New PointF(g1(0, 2) + 20, g1(1, 2) + 20)
            Dim punkt4 As PointF = New PointF(g1(0, 3) + 20, g1(1, 3) + 20)
    
            g.DrawLine(Pens.Black, punkt1, punkt2)
            g.DrawLine(Pens.Black, punkt2, punkt3)
            g.DrawLine(Pens.Black, punkt3, punkt4)
            g.DrawLine(Pens.Black, punkt4, punkt1)
    
            mittex = (punkt1.X + punkt2.X + punkt3.X + punkt4.X) / 4
            mittey = (punkt1.Y + punkt2.Y + punkt3.Y + punkt4.Y) / 4
    
            If gmax = 0 Then
              g.DrawString(gtext, schrift, Brushes.Black, mittex, mittey)
    
    
            Else
              g.DrawString(gtext, schrift, Brushes.Black, mittex, mittey, stringFormat)
            End If
    
            gt(0, 0 + ema(k, 1 + (k2 - 1) * 4)) = gt(0, 0 + ema(k, 1 + (k2 - 1) * 4)) + geo(ema(k, 2 + (k2 - 1) * 4), 0 + ema(k, 3 + (k2 - 1) * 4)) ' % gt ein Exemplar weiter
    
          Next
    
          gt(0, 1 - ema(k, 1 + (k2 - 1) * 4)) = gt(0, 1 - ema(k, 1 + (k2 - 1) * 4)) + geo(ema(k, 2 + (k2 - 1) * 4), 5 - ema(k, 3 + (k2 - 1) * 4)) '% gt eine Reihe weiter rücken
    
          gt(0, 0 + ema(k, 1 + (k2 - 1) * 4)) = gt(0, 0 + ema(k, 1 + (k2 - 1) * 4)) - (k3 - 1) * geo(ema(k, 2 + (k2 - 1) * 4), 0 + ema(k, 3 + (k2 - 1) * 4)) ' % Exemplarrückung rückgängig
    
        Next
    
        bmp.Save(Server.MapPath("/images/" & auftragsnr.Text & ".jpg"), ImageFormat.Jpeg)
    
        imgAusgabe.ImageUrl = "/images/" & auftragsnr.Text & ".jpg"
        imgAusgabe.Visible = True
    
        btnPDF.Enabled = True
    
        Dim heightwindow As String = CStr(height + 50)
        Dim widhtwindow As String = CStr(width + 50)
    
        ScriptManager.RegisterClientScriptBlock(btnBerechnen, Me.GetType(), "Bildopen", "window.open('/images/" & auftragsnr.Text & ".jpg','Ausgabe AuftragNr.: " & auftragsnr.Text & "','height=" + heightwindow + ",width=" + widhtwindow + ",left=20,top=20');", True)
    
      End Sub

     

    Donnerstag, 3. März 2011 00:54
  • Hi,

    was mir grundsätzlich schon mal auffällt, ist, dass nirgends auch nur irgendwas wieder freigegeben wird.

    Gerade bei Bitmaps, Graphics, ... ist es (wie auch bei Streams) enorm wichtig, dass die Objekte wieder geschlossen/terminiert/... werden. Als Grundsatz kannst Du dir merken: Wenn eine solche Klasse eine Dispose Methode hat, ruf sie auch auf, wenn das Objekt nicht mehr benötigt wird. Bei Close dasselbe (vor Dispose).

    Den Rest muss ich mir noch genauer anschauen.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Donnerstag, 3. März 2011 15:06
    Moderator
  • Hi,

    Erstmal danke für den Tipp wurde umgesetzt.

    Leider ist mein Problem immer noch nicht behoben. Ich vermute inzwischen das er Probleme hat das Bild abzuspeichern. Hab dazu probiert das Bild im Root Verzeichnis abzuspeichern etc. . Hat leider alles kein Erfolg gebracht.

    Ich verstehe auch überhaupt nicht warum er in der Fehlermeldung meine lokalen Pfade ausgibt und nicht die vom Server.

    Was ist da los????

    Die Seite ist http://www.aspspider.com gehostet vielleicht liegt es auch daran ?!??!

    Danke für die hoffentlich helfende Antwort! :)

    Donnerstag, 3. März 2011 17:53
  • Keiner ne Idee???
    Samstag, 12. März 2011 10:45
  • Hi,

    Leider ist mein Problem immer noch nicht behoben. Ich vermute inzwischen das er Probleme hat das Bild abzuspeichern. Hab dazu probiert das Bild im Root Verzeichnis abzuspeichern etc. . Hat leider alles kein Erfolg gebracht.

    Ich verstehe auch überhaupt nicht warum er in der Fehlermeldung meine lokalen Pfade ausgibt und nicht die vom Server.

    die lokalen Pfade sind im StackTrace erstmal egal. Wichtiger wäre, dass das Serververzeichnis "images" Ändern-Rechte für den Account hat, der den Application Pool ausführt (meist bspw. Netzwerkdienst, bei einem Provider aber ggfs. ein eigener Account)

    Hast Du ein bestimmtes Verzeichnis, dass definitiv Schreib- bzw. Ändern-Rechte für den Account hat?

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Samstag, 12. März 2011 16:29
    Moderator
  • Hi,

    Das kann ich leider nicht sagen. Hab auch schon ausprobiert die Bilder im Root Verzeichnis abzulegen ebenfalls kein Erfolg.

    Wie kann ich den rausfinden (Script o.ä.??) ob ich Ändern Rechte habe? Ich kann bei dem Provider so gut wie gar nichts einstellen.

    Danke

    Samstag, 12. März 2011 16:51
  • Hi,

    Das kann ich leider nicht sagen. Hab auch schon ausprobiert die Bilder im Root Verzeichnis abzulegen ebenfalls kein Erfolg.

    im Root geht das meist gar nicht, auch nicht in den normalen Ordnern der Anwendung. Probier mal App_Data (ggfs. anlegen, wenns nicht vorhanden ist). Ansonsten gibt es evtl. ein vorgefertigtes Verzeichnis für Access Datenbanken oder ähnliches. Wenn es sowas gibt (trifft auch auf App_Data zu), kannst Du dort aber nur schreiben, nicht per Http abrufen :)

    Wie kann ich den rausfinden (Script o.ä.??) ob ich Ändern Rechte habe? Ich kann bei dem Provider so gut wie gar nichts einstellen.

    Einfach probieren, bspw. per System.IO.File.WriteAllText( "X:\Ordner\Datei.txt", "Abc" ) eine Textdatei zu schreiben.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    • Als Antwort markiert megahairpin Samstag, 12. März 2011 17:48
    Samstag, 12. März 2011 17:25
    Moderator
  • Hi,

    Danke für die Hilfe, liegt wohl an den Schreibrechten, hab nun den Provider gewechselt. Dort funktioniert alles problemlos.

     

    Danke!!!

    Samstag, 12. März 2011 17:48