2013-10-04 26 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是否解决了这个问题? –