使用PictureBox字段呈现PDF时参数无效

时间:2013-10-04 17:55:29

标签: asp.net asp.net-mvc iis pdf-generation telerik-reporting

我的生产IIS服务器上突然出现“参数无效”异常(Reboot已经清除了异常)。我有一个Telerik报告,它有一个PictureBox控件,用于显示用户签名。签名作为varbinary(max)存储在SQL Server上。我使用以下代码导入它:

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 个答案:

答案 0 :(得分: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,其中突出显示因图像无效而可能出现的问题,这听起来很像您的问题。