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