Создание PDF с использованием Diagnostics.Process и Wkhtmltopdf медленно на сервере - PullRequest
0 голосов
/ 29 ноября 2018

People,

Я создаю файл PDF в приложении .NET, используя wkhtmltopdf внутри System.Diagnostics.Process

Хотя этот процесс занимает ок.1 секунда для запуска на моем локальном компьютере (Win 10 Pro 16gb mem) после развертывания на сервере и использования тех же данных, это занимает ок.40 секунд на сервере (win server 2012 8 Гб памяти).Результирующий PDF-файл в обоих случаях составляет всего около 34 КБ.

Было выполнено несколько диагностических тестов для каждой строки кода. Я обнаружил, что именно эта строка занимает все время.

if (!process.WaitForExit(120000))

Я попытался изменить разрешения для выходной папки, а также изменить выходную папку.Я также изменил удостоверение в пуле приложений IIS.При таком несоответствии в производительности я не уверен, что это проблема кода, просто конфигурация.Может кто-нибудь пролить свет на это.Немного сокращенный код, приведенный ниже, я должен также упомянуть, что я запускал procmon на сервере, в то время как запуск на нем, кажется, делает очень мало после первоначальной загрузки программы.

        var temp = HttpContext.Current.Server.MapPath("~//temppdf//")

        var outputPdfFilePath = Path.Combine(temp,
                String.Format("{0}.pdf", Guid.NewGuid()));

        document.Url = "-";

        ProcessStartInfo si;

        StringBuilder paramsBuilder = new StringBuilder();

        paramsBuilder.Append("--page-size A4 ");
        paramsBuilder.Append("--zoom 1.000 ");
        paramsBuilder.Append("--disable-smart-shrinking ");
        paramsBuilder.AppendFormat("\"{0}\" \"{1}\"", document.Url, outputPdfFilePath);

        si = new ProcessStartInfo();
        si.CreateNoWindow = false;
        si.FileName = environment.WkHtmlToPdfPath; //path to exe in programs file(x86)
        si.Arguments = paramsBuilder.ToString();
        si.UseShellExecute = false;
        si.RedirectStandardError = false;
        si.RedirectStandardInput = true;

        try
        {
            using (var process = new Process())
            {
                process.StartInfo = si;
                process.Start();
                if (document.Html != null)
                    using (var stream = process.StandardInput)
                    {
                        byte[] buffer = Encoding.UTF8.GetBytes(document.Html);
                        stream.BaseStream.Write(buffer, 0, buffer.Length);
                        stream.WriteLine();
                    }

                if (!process.WaitForExit(120000))
                    throw new PdfConvertTimeoutException();
                // THis above command takes 1 sec locally and 42 secs on server
            }

        }
        finally
        {
                if (delete && File.Exists(outputPdfFilePath))File.Delete(outputPdfFilePath);
        }

1 Ответ

0 голосов
/ 18 декабря 2018

Ну, наконец, дошло до сути и не имеет абсолютно никакого отношения к коду.Оказывается, что HTML, который я пытался преобразовать, имел ссылки на изображения на живом веб-сайте.Хотя этот веб-сайт был доступен с моей локальной машины, он был недоступен с сервера.Поэтому задержка из-за тайм-аутов при попытке доступа к недоступным изображениям.

Doh !!!

...