Pergunta

Eu estou usando Azure Storage Filas para enviar uma mensagem para um WebJob.Este WebJob, em seguida, cria um PDF e as armazena em um contêiner de blob.Isso funciona bem no meu dev-máquina.A mensagem é recebida, o objeto instanciado e PDF é criado e armazenado no armazenamento de blob.Quando eu implantar o WebJob para Azure recebo uma de exceção de Memória no momento em que recebe uma mensagem.

O que são o limite de memória e como faço para manter abaixo dos limites?

 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);
    }

Usando isso eu acabar apenas com um ficheiro de texto no meu armazenamento de blob com o rastreamento de pilha:

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
Foi útil?

Solução

Obviamente, você está usando o GDI+ build de MigraDoc - e não há GDI+ no Azure Servidor e Graphics.FromHwnd() falha.

Usar o WPF construir de MigraDoc e as coisas devem funcionar bem no Azure Servidor.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top