De exceção de memória usando PdfSharp em uma azure webjob
-
21-12-2019 - |
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
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.