2012-09-02 27 views
7

我在運行在.NET 4.0中的C#web應用程序中使用WkhtmltoPdf從HTML文件生成PDF。一般情況下,除非HTML文件的大小低於250KB,否則一切正常。一旦HTML文件的大小超過了這個範圍,那麼運行wkhtmltopdf.exe的過程將給出如下的例外。在任務管理器中,我已經看到wkhtmltopdf.exe進程的內存值不會增加超過40,096 K的值,我相信這是該進程被放棄的原因。在Asp.net中運行外部可執行文件的內存限制

如何配置外部exes的內存限制可以增加?有沒有其他解決這個問題的方法?

更多信息:
當我直接從命令行運行轉換時,PDF生成正常。所以,它不可能成爲WkhtmlToPdf的問題。

錯誤來自localhost。我已經在DEV服務器上嘗試了相同的結果。

編輯:

更具體的異常消息: - 對於 處理對象的MainModule屬性,誤差說 - { 「一個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的調試器截圖過程:

enter image description here

+0

也許這有助於:http://stackoverflow.com/a/9270159/135007 – ZippyV

+0

你在哪裏看到任何事實這是一個內存不足的問題? –

+0

@SimonMourier:從運行應用程序時,wkhtmltopdf.exe的內存值在任務管理器中的某個固定限制之後不會增加。而通過命令提示符運行相同的執行就好了。另外,如果輸入的HTML文件的大小較小,那麼通過應用程序就可以正常工作。在固定大小的HTML文件之後,即使是單個附加字符也不起作用。你認爲這可能是除記憶之外的其他問題嗎? – itsbalur

回答

0

這是你要找的內容:

http://jobobjectwrapper.codeplex.com/

我找不到任何與之相關的東西o儘管我聽說有人將進程內存限制爲MaxWorkingSet,但是我相信這隻適用於虛擬內存,但應用程序已經盡其所能地增加了進程的內存限制。

作業對象是一個很好的起點,它們只是一個容易控制的過程的集合。

「有了這個庫,你可以創建工作對象,創建和 過程分配給作業,控制過程和工作的限制,並註冊 各種流程和工作相關的通知事件。「

這可能是使用過:

Calling wkhtmltopdf to generate PDF from HTML

+0

感謝您的回答。我嘗試改變MaxWorkingSet,但正如你所建議的似乎並不奏效。我在其他一些SO帖子中讀到,它在執行時總是被修剪得更小。我必須嘗試使用​​作業對象包裝,儘管看起來有點複雜。 :-) – itsbalur

+0

是讓我知道它是如何工作的。 –

0

看一看this,看看是否每個進程的限制線程可能進來在這裏玩這是一個長鏡頭(和。我不知道IIS對外部進程施加任何內存限制),但請注意以下文檔:

因爲此屬性定義了最大數量的ASP請求 可以同時執行,除非您的ASP應用程序正在對 外部組件進行擴展調用,否則此設置應保持默認值 的值。在這種情況下,您可能會增加 線程每處理器限制的值。這樣做可以讓服務器創建更多的線程來處理更多的併發請求。

+0

感謝您的回答。我不確定它與IIS有關,因爲我嘗試從Windows應用程序執行類似的代碼,並且存在相同的問題。 – itsbalur

+0

嗯。兩個想法。檢查這是否可能是32/64位問題。嘗試在32位或64位顯式指定您的可執行文件,看看這是否會改變事情。 (見http://stackoverflow.com/questions/10986486/c-sharp-only-part-of-a-readprocessmemory-or-writeprocessmemory-request-was-compl)其次,我注意到你重定向輸出從產生的過程,但你沒有處理那個輸出。也許有一個輸出緩衝區正在耗盡。嘗試爲Process.OutputDataReceived添加一個事件處理程序來處理輸出。或者禁用重定向。 – Olly