استثناء نفاد الذاكرة باستخدام PdfSharp في وظيفة الويب الزرقاء

StackOverflow https://stackoverflow.com//questions/24015551

سؤال

أنا أستخدم قوائم انتظار تخزين Azure لإرسال رسالة إلى WebJob.يقوم WebJob بعد ذلك بإنشاء ملف PDF وتخزينه في حاوية كبيرة الحجم.هذا يعمل بشكل جيد على جهاز التطوير الخاص بي.يتم استلام الرسالة وإنشاء مثيل للكائن وإنشاء ملف PDF وتخزينه في مخزن البيانات الثنائية الكبيرة.عندما أقوم بنشر 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);
    }

باستخدام هذا، انتهى بي الأمر بملف نصي فقط في مخزن البيانات الثنائية الكبيرة الخاص بي مع تتبع المكدس:

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
هل كانت مفيدة؟

المحلول

من الواضح أنك تستخدم إصدار GDI+ من MigraDoc - ولا يوجد GDI+ على خادم Azure و Graphics.FromHwnd() فشل.

استخدم إصدار WPF الخاص بـ MigraDoc ويجب أن تسير الأمور بشكل جيد على خادم Azure.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top