0

我正在使用 Azure 存储队列向 WebJob 发送消息。然后,此 WebJob 创建 PDF 并将其存储在 blob 容器中。这在我的开发机器上运行良好。接收到消息、实例化对象并创建 PDF 并将其存储在 blob 存储中。当我将 WebJob 部署到 Azure 时,我收到一条消息时出现内存不足异常。

什么是内存限制,我如何保持低于这些限制?

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

使用这个我最终在我的 blob 存储中只有一个带有堆栈跟踪的文本文件:

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
4

1 回答 1

2

显然,您使用的是 MigraDoc 的 GDI+ 版本 - Azure 服务器上没有 GDI+ 并且Graphics.FromHwnd()失败了。

使用 MigraDoc 的 WPF 版本,在 Azure 服务器上应该可以正常运行。

于 2014-06-03T13:06:40.200 回答