Frage

Ich verwende Azure Storage Queues, um eine Nachricht an einen WebJob zu senden.Dieser WebJob erstellt dann eine PDF-Datei und speichert sie in einem Blob-Container.Das funktioniert gut auf meiner Entwicklungsmaschine.Die Nachricht wird empfangen, das Objekt instanziiert und die PDF-Datei wird erstellt und im Blob-Speicher gespeichert.Wenn ich den WebJob in Azure bereitstelle, erhalte ich in dem Moment, in dem eine Nachricht empfangen wird, die Ausnahme „Nicht genügend Arbeitsspeicher“.

Wie hoch ist das Speicherlimit und wie halte ich es unter diesem Limit?

 public static void HandleNewRegistration(
        [QueueInput("pdf")] Models.Registration registration,
        [BlobOutput("pdf/{Name}.txt")] TextWriter writer,
        [BlobOutput("pdf/{Name}.pdf")] Stream pdfWriter)
    {
        try
        {
            // Store received registration in database (using EF)
            AppContext db = new AppContext();
            db.Registrations.Add(registration);
            db.SaveChanges();

            // Create PDF document (nothing fancy, just a section with a paragraph)
            var pdf = CreatePdf(registration);
            var renderer = new MigraDoc.Rendering.PdfDocumentRenderer(true, PdfSharp.Pdf.PdfFontEmbedding.Always);
            renderer.Document = pdf;
            renderer.RenderDocument();
            renderer.Save(pdfWriter,true);

        }
        catch (Exception e)
        {
            writer.WriteLine(e.Message);
            writer.WriteLine(e.StackTrace);
        }
        writer.WriteLine(registration.Name);
    }

Wenn ich dies verwende, habe ich in meinem Blob-Speicher nur eine Textdatei mit dem Stack-Trace:

Out of memory.
   at System.Drawing.Graphics.FromHwndInternal(IntPtr hwnd)
   at System.Drawing.Graphics.FromHwnd(IntPtr hwnd)
   at PdfSharp.Drawing.XGraphics..ctor(Graphics gfx, XSize size, XGraphicsUnit pageUnit, XPageDirection pageDirection)
   at MigraDoc.Rendering.DocumentRenderer.PrepareDocument()
   at MigraDoc.Rendering.PdfDocumentRenderer.PrepareDocumentRenderer(Boolean prepareCompletely)
   at MigraDoc.Rendering.PdfDocumentRenderer.PrepareRenderPages()
   at MigraDoc.Rendering.PdfDocumentRenderer.RenderDocument()
   at WebJob.Program.HandleNewRegistration(Registration registration, TextWriter writer, Stream pdfWriter) in d:\Source\Workspaces\[...]\WebJob\Program.cs:line 43
War es hilfreich?

Lösung

Offensichtlich verwenden Sie den GDI+-Build von MigraDoc – und es gibt kein GDI+ auf dem Azure-Server und Graphics.FromHwnd() scheitert.

Verwenden Sie den WPF-Build von MigraDoc und alles sollte auf dem Azure-Server einwandfrei laufen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top