2013-10-04 28 views
0

我突然在我的生產IIS服務器上發生「參數無效」異常(重新啓動已清除異常)。我有一個Telerik報告,其中有一個PictureBox控件,用於顯示用戶簽名。簽名作爲varbinary(max)存儲在SQL Server上。我進口它使用此代碼:使用PictureBox字段渲染PDF時參數無效

SET EmployeeSignature = (SELECT BulkColumn FROM OPENROWSET(
     Bulk 'C:\Signatures\Justin.bmp', SINGLE_BLOB)AS BLOB) 
     EmployeeNumber = '999999' 

我渲染的報告,像這樣一個PDF:

public ActionResult PrintPoReport(string id) 
    { 

     var irs = new InstanceReportSource(); 
     irs.ReportDocument = new LogisticsReports.PoHeader(); 
     irs.Parameters.Add(new Parameter("PoID", id)); 
     Telerik.Reporting.Processing.ReportProcessor rp = new Telerik.Reporting.Processing.ReportProcessor(); 
     Telerik.Reporting.Processing.RenderingResult result = rp.RenderReport("PDF", irs, null); 
     byte[] contents = result.DocumentBytes; 
     return File(contents, "application/pdf", "P0 #" + id + ".pdf"); 

    } 

從一切我已閱讀似乎與這個特殊的例外,各種口味的相關性圖像文件,字體文件等等。正如我上面所述,IIS服務器的重新啓動暫時停止了ecxception,但我需要在它再次發生之前找出原因。或者找到更好的方式在報告上顯示用戶簽名。有什麼建議麼?

我得到以下異常報告停止工作時:

ArgumentException: Parameter is not valid.] 
    System.Drawing.Image.get_RawFormat() +1624719 
    Telerik.Reporting.PictureBox.set_Value(Object value) +145 
    LogisticsReports.PoHeader.InitializeComponent() +59097 
    ArctecLogisticsWebFiles.Controllers.LogisticsToolsController.PrintPoReport(String id) +64 
    lambda_method(Closure , ControllerBase , Object[]) +127 
    System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +264 
    System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +39 
    System.Web.Mvc.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12() +129 
    System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +826106 
    System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +314 
    System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +825328 
    System.Web.Mvc.Controller.ExecuteCore() +159 
    System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +335 
    System.Web.Mvc.<>c__DisplayClassb.<BeginProcessRequest>b__5() +62 
    System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +20 
    System.Web.Mvc.<>c__DisplayClasse.<EndProcessRequest>b__d() +54 
    System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +469 
    System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +375 

回答

1

正如創建PDF可以使用大量內存的過程中,你可能會看到是一個問題,這是一個記憶的體現問題(請參閱here;生成大型位圖時會出現類似的錯誤)。 可能發生的事情是您的IIS服務器內存不足以運行應用程序的應用程序池。

從看Telerik文檔我可以看到"IReportDocument"實現了IDisposable,但是你的代碼沒有配置這個對象。

所以我想先更改代碼,以便擁有的ReportDocument它的內存妥善處置:

public ActionResult PrintPoReport(string id) 
{ 
byte[] contents; 
Telerik.Reporting.Processing.RenderingResult result; 

using (var reportDocument = new LogisticsReports.PoHeader()) 
{ 
    var irs = new InstanceReportSource(); 
    irs.ReportDocument = reportDocument ; 
    irs.Parameters.Add(new Parameter("PoID", id)); 
    var reportProcessor = new Telerik.Reporting.Processing.ReportProcessor(); 
    result = reportProcessor.RenderReport("PDF", irs, null); 
    contents = result.DocumentBytes; 
} 

return File(contents, "application/pdf", "P0 #" + id + ".pdf"); 
} 

(注:請原諒在此代碼的任何錯誤我還沒有編譯它)

在IIS服務器上運行一些診斷程序以查找內存問題。你檢查了IIS日誌的問題?

您是否確定數據庫中的所有簽名圖像都是有效的,即不是損壞的?請參閱此article,其中突出顯示了由於無效圖像而可能出現的問題,這聽起來很像您的問題。

+0

非常感謝代碼示例。我確實發現了一個簡單的編譯問題,並且'結果'被聲明瞭兩次。糾正後,我能夠打印報告。我幾乎只使用兩個用戶簽名,所以我不認爲這是一個腐敗問題,我傾向於內存泄漏。唯一讓我感到困惑的是,除了沒有簽名塊以外,我還有其他一些報告以相同的方式呈現,並且他們從未失敗過。我要更改所有報告中的代碼並查看會發生什麼。問題是,使用語句是什麼處理內存? –

+0

Doh,錯過了重複的定義,我更新了代碼。這些簽名塊是大文件嗎?我猜不是。對於我們所知道的Telerik功能可能會使用大量內存來處理小圖像。留意內存使用情況。至於using語句,是的,它是[處理實現IDisposable的對象的方便語義](http://msdn.microsoft.com/zh-cn/library/yh598w02.aspx)。作爲一個經驗法則,任何使用IDisposable的對象都應該包含在一個使用塊中(或者至少應該明確處理它)。 –

+0

您是如何處理PDF問題的?處理RenderingResult是否解決了這個問題? –