2013-10-04 3 views
0

Я неожиданно получаю исключение «Параметр не достоверно» на моем производственном сервере IIS (с тех пор, как сбрасывается исключение, Reboot). У меня есть отчет Telerik, в котором есть элемент управления PictureBox, который я использую, чтобы показать подпись пользователей. Подпись хранится на SQL Server как varbinary (max). Я импортировал его, используя этот код:Параметр недействителен при рендеринге PDF с полем PictureBox

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-файлов можно использовать много памяти, вы можете быть видя проблему, которая является проявлением памяти issue (см. 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, да, это [convenientsyntax для удаления объектов, которые реализуют IDisposable] (http://msdn.microsoft.com/en-us/library/yh598w02.aspx). Как правило, любой объект, который использует IDisposable, должен быть заключен в блок использования (или, по крайней мере, он должен быть явно удален). –

+0

Как вы справились со своей проблемой в формате PDF? Устранена ли проблема с RenderingResult? –