在Asp.net中运行外部可执行文件的内存限制
我在运行于.NET4.0的C#web应用程序中使用WkhtmltoPdf从HTML文件生成PDF。一般来说,除了HTML文件的大小低于250KB外,其他一切都可以正常工作。一旦HTML文件大小增加超过该值,运行wkhtmltopdf.exe的进程将出现以下异常。在任务管理器上,我看到wkhtmltopfd.exe进程的内存值没有增加到40096k以上,我认为这就是为什么在这两者之间放弃该进程的原因 我们如何配置以增加外部EXE的内存限制?有没有其他办法解决这个问题 更多信息:在Asp.net中运行外部可执行文件的内存限制,asp.net,memory-management,wkhtmltopdf,external-process,Asp.net,Memory Management,Wkhtmltopdf,External Process,我在运行于.NET4.0的C#web应用程序中使用WkhtmltoPdf从HTML文件生成PDF。一般来说,除了HTML文件的大小低于250KB外,其他一切都可以正常工作。一旦HTML文件大小增加超过该值,运行wkhtmltopdf.exe的进程将出现以下异常。在任务管理器上,我看到wkhtmltopfd.exe进程的内存值没有增加到40096k以上,我认为这就是为什么在这两者之间放弃该进程的原因 我们如何配置以增加外部EXE的内存限制?有没有其他办法解决这个问题 更多信息: 当我直接从命令行运
当我直接从命令行运行转换时,PDF生成得很好。因此,WkhtmlToPdf不太可能出现问题 错误来自本地主机。我在DEV服务器上尝试了同样的方法,得到了相同的结果 编辑: 更具体的异常消息:-用于 进程对象,错误显示-{“仅为ReadProcessMemory或 WriteProcessMemory请求已完成“},使用NativeErrorCode 价值-299 例外情况:
> [Exception: Loading pages (1/6) [>
> ] 0% [======> ]
> 10% [======> ] 11%
> [=======> ] 13%
> [=========> ] 15%
> [==========> ] 18%
> [============> ] 20%
> [=============> ] 22%
> [==============> ] 24%
> [===============> ] 26%
> [=================> ] 29%
> [==================> ] 31%
> [===================> ] 33%
> [=====================> ] 35%
> [======================> ] 37%
> [========================> ] 40%
> [=========================> ] 42%
> [==========================> ] 44%
> [============================> ] 47%
> [=============================> ] 49%
> [==============================> ] 51%
> [============================================================] 100%
> Counting pages (2/6)
> [============================================================] Object
> 1 of 1 Resolving links (4/6)
> [============================================================] Object
> 1 of 1 Loading headers and footers (5/6)
> Printing pages (6/6) [>
> ] Preparing [=>
> ] Page 1 of 49 [==>
> ] Page 2 of 49 [===>
> ] Page 3 of 49 [====>
> ] Page 4 of 49 [======>
> ] Page 5 of 49 [=======>
> ] Page 6 of 49 [========>
> ] Page 7 of 49 [=========>
> ] Page 8 of 49 [==========>
> ] Page 9 of 49 [============>
> ] Page 10 of 49 [=============>
> ] Page 11 of 49 [==============>
> ] Page 12 of 49 [===============>
> ] Page 13 of 49 [================>
> ] Page 14 of 49 [==================>
> ] Page 15 of 49 [===================>
> ] Page 16 of 49 [====================>
> ] Page 17 of 49 [=====================>
> ] Page 18 of 49 [======================>
> ] Page 19 of 49 [========================>
> ] Page 20 of 49 [=========================>
> ] Page 21 of 49 [==========================>
> ] Page 22 of 49 [===========================>
> ] Page 23 of 49 [============================>
> ] Page 24 of 49 [==============================>
> ] Page 25 of 49 [===============================>
> ] Page 26 of 49 [=================================>
> ] Page 27 of 49 [==================================>
> ]
我使用的代码:
var fileName = " - ";
var wkhtmlDir = ConfigurationManager.AppSettings[Constants.AppSettings.ExportToPdfExecutablePath];
var wkhtml = ConfigurationManager.AppSettings[Constants.AppSettings.ExportToPdfExecutablePath] + "\\wkhtmltopdf.exe";
var p = new Process();
string switches = "";
switches += "--print-media-type ";
switches += "--margin-top 10mm --margin-bottom 10mm --margin-right 5mm --margin-left 5mm ";
switches += "--page-size A4 ";
switches += "--disable-smart-shrinking ";
var startInfo = new ProcessStartInfo
{
CreateNoWindow = true,
FileName = wkhtml,
Arguments = switches + " " + url + " " + fileName,
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
RedirectStandardInput=true,
WorkingDirectory=wkhtmlDir
};
p.StartInfo = startInfo;
p.Start();
WkHtmlToPdf.exe进程的调试器屏幕截图:
这就是你想要的: 我找不到任何其他与“增加”进程内存限制相关的内容,尽管我听说有人使用
MaxWorkingSet
限制进程内存,但我相信这只是在应用程序用尽所有可能后才用于虚拟内存
作业对象是一个很好的起点,它们只是一组易于控制的流程
使用此库,您可以创建作业对象、创建和分配作业
流程到作业,控制流程和作业限制,并注册
各种与流程和作业相关的通知事件。”
这也可能有用:
看看每个进程的线程数限制是否会在这里发挥作用。这是一个长期目标(我不知道IIS对外部进程施加了任何内存限制),但请注意文档中的这一点:
因为此属性定义了
可以同时执行,此设置应保持默认值
值,除非您的ASP应用程序正在对
外部组件。在这种情况下,可以增加
每个处理器的线程数限制。这样做可以让服务器创建更多
线程来处理更多并发请求
也许这会有帮助:你从哪里看到内存不足的问题?@SimonMourier:从运行应用程序时,wkhtmltopdf.exe的内存值在任务管理器中达到某个固定限制后不会增加这一事实来看。然而,当通过命令提示符运行相同的命令时,执行是很好的。此外,如果输入HTML文件的大小较小,那么通过应用程序它就可以正常工作。在固定大小的HTML文件之后,即使是一个附加字符也不起作用。你认为这可能是内存以外的其他问题吗?可能是其他问题,是的,因为没有证据表明这是内存问题,异常不清楚,没有显示内存的任何信息。如果您看到进程内存增加,比如1或2GB,那么情况可能会是这样,但事实似乎并非如此。你确定这不是WkhtmlToPdf中的错误吗?@SimonMourier:当我通过命令提示符运行WkhtmlToPdf时,它工作正常。所以,我想这不是WkhtmlToPdf。对于Process对象的MainModule属性,错误为-{“仅完成了ReadProcessMemory或WriteProcessMemory请求的一部分”},NativeErrorCode值为-299。感谢您的回答。我不确定它是否与IIS有关,因为我试图从Windows应用程序中执行类似的代码,但存在相同的问题。嗯。有两个想法。检查这是否可能是32/64位问题。尝试显式地将可执行文件定位在32位或64位,看看这是否会改变情况。(请参阅)其次,我注意到您正在重定向派生进程的输出,但您没有处理该输出。可能有一个输出缓冲区正在耗尽。尝试为Process.OutputDataReceived添加事件处理程序以处理输出。或者禁用重定向。谢谢您的回答。我试图改变MaxWorkingSet,但正如你所说,它似乎不起作用。我在其他一些SO帖子中读到,它在执行时总是被修剪成更小的值。我必须尝试作业对象包装器,但一开始看起来有点复杂。:-)