Проблемы с рендером отчетов в asp.net mvc

Обсуждение Stimulsoft Reports.WEB
Ответить
avis
Сообщения: 5
Зарегистрирован: 04 мар 2009, 17:32
Откуда: Krasnodar

Проблемы с рендером отчетов в asp.net mvc

Сообщение avis »

Приветствую.

Собрал тестовое приложение под 2008 студией на asp.net mvc (File-New-Project-Web-Asp.net mvc web asp).

Для контроллера HomeController добавил метод Report

Код: Выделить всё

 public void Report()
        {
            DataSet data = new DataSet();

            String rep =
                @"C:\Program Files\Stimulsoft Reports.Net 2008.2\Bin\Reports\Invoice.mrt";

            data.ReadXml(@"C:\Program Files\Stimulsoft Reports.Net 2008.2\Bin\Data\Demo.xml");
            data.ReadXmlSchema(@"C:\Program Files\Stimulsoft Reports.Net 2008.2\Bin\Data\Demo.xsd");

            StiReport report = new StiReport();

            report.RegData("Demo", data);

            report.Load(rep);
            report.Render(false);

            report.ExportDocument(StiExportFormat.Html, Response.OutputStream);
        }
Далее иду на http://localhost:4373/home/report и получаю
Ошибка сервера в приложении '/'.
Не удалось найти часть пути "D:\project\novag\traiding\assembla\WebReportTest\Home".
Описание: Необработанное исключение при выполнении текущего веб-запроса. Изучите трассировку стека для получения дополнительных сведений о данной ошибке и о вызвавшем ее фрагменте кода.

Сведения об исключении: System.IO.DirectoryNotFoundException: Не удалось найти часть пути "D:\project\novag\traiding\assembla\WebReportTest\Home".

Ошибка источника:

Строка 39:
Строка 40: report.Load(rep);
Строка 41: report.Render(false);
Строка 42:
Строка 43: report.ExportDocument(StiExportFormat.Html, Response.OutputStream);


Исходный файл: D:\project\novag\traiding\assembla\WebReportTest\Controllers\HomeController.cs Строка: 41

Трассировка стека:

[DirectoryNotFoundException: Не удалось найти часть пути "D:\project\novag\traiding\assembla\WebReportTest\Home".]
System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) +492
System.IO.Directory.SetCurrentDirectory(String path) +163
Stimulsoft.Report.StiReport.Compile(String path, Stream stream, StiOutputType outputType, Boolean autoCreate, Object standaloneReportType) +2058
Stimulsoft.Report.StiReport.Compile(String path, Stream stream, StiOutputType outputType, Boolean autoCreate) +44
Stimulsoft.Report.StiReport.Compile(String path, StiOutputType outputType, Boolean autoCreate) +40
Stimulsoft.Report.StiReport.Compile(String path, StiOutputType outputType) +34
Stimulsoft.Report.StiReport.Compile(StiOutputType outputType) +33
Stimulsoft.Report.StiReport.Compile() +25
Stimulsoft.Report.Engine.StiReportV2Builder.RenderSingleReport(StiReport masterReport, StiRenderState renderState) +1000
Stimulsoft.Report.StiReport.Render(StiRenderState renderState) +522
Stimulsoft.Report.StiReport.Render(Boolean showProgress, Int32 fromPage, Int32 toPage) +62
Stimulsoft.Report.StiReport.Render(Boolean showProgress) +38
WebReportTest.Controllers.HomeController.Report() in D:\project\novag\traiding\assembla\WebReportTest\Controllers\HomeController.cs:41
lambda_method(ExecutionScope , ControllerBase , Object[] ) +61
System.Web.Mvc.c__DisplayClass1.b__0(ControllerBase controller, Object[] parameters) +17
System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +17
System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +282
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +23
System.Web.Mvc.c__DisplayClassa.b__7() +112
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +301
System.Web.Mvc.c__DisplayClassc.b__9() +19
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +214
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +311
System.Web.Mvc.Controller.ExecuteCore() +179
System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +20
System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +4
System.Web.Mvc.MvcHandler.ProcessRequest(HttpContextBase httpContext) +134
System.Web.Mvc.MvcHandler.ProcessRequest(HttpContext httpContext) +38
System.Web.Mvc.MvcHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext httpContext) +4
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +358
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +64


Информация о версии: Платформа Microsoft .NET Framework, версия:2.0.50727.1433; ASP.NET, версия:2.0.50727.1433
Т.е. для работы необходимо создать папку home в корне web-проджекта, что не особо хорошо.
Соответственно - для чего репортам эта папка, какие права на нее нужны и можно ли обойтись без нее?

Сорсы приложил в аттаче к посту.
Вложения
WebReportTest.zip
(236.85 КБ) 315 скачиваний
Jan
Сообщения: 495
Зарегистрирован: 19 фев 2009, 11:14

Проблемы с рендером отчетов в asp.net mvc

Сообщение Jan »

Здравствуйте,

Проблема в том, что в Вашем отчете судя по всему содержаться картинки. Формат Html не имеет возможности содержать в себе картинки. Поэтому генератор отчетов пытается сложить их в текущей папке. Для того, чтобы корректно экспортировать отчет в html в Вашей ситуации понадобится специльный хост класс, унаследованный от класса Stimulsoft.Report.Export.StiHtmlImageHost. Метод GetImageString этого класса получает на вход картинку, а вернуть должен строку которая заменит путь к этой картинке. К примеру путь к этой картинке. Пример класса я приложил к ответу. Ваш код необходимо немного изменить:

Код: Выделить всё

StiHtmlExportService export = new StiHtmlExportService();
export.HtmlImageHost = WebImageHost;
export.ExportHtml(report, Response.OutputStream);
Спасибо.
Вложения
StiHtmlImageHost.cs
(3.38 КБ) 620 скачиваний
avis
Сообщения: 5
Зарегистрирован: 04 мар 2009, 17:32
Откуда: Krasnodar

Проблемы с рендером отчетов в asp.net mvc

Сообщение avis »

Хм, спасибо.
Вечером попробую, но, насколько я помню, тоже самое было и при экспорте в pdf - картинки так же будут ложится в папку по умолчанию?
При экспорте в pdf я сначала писал все в файл и уже отдавал файл клиенту, но падало так и на том же месте, как и при экспорте в html.
Jan
Сообщения: 495
Зарегистрирован: 19 фев 2009, 11:14

Проблемы с рендером отчетов в asp.net mvc

Сообщение Jan »

Здравствуйте,
avis писал(а):Хм, спасибо.
Вечером попробую, но, насколько я помню, тоже самое было и при экспорте в pdf - картинки так же будут ложится в папку по умолчанию?
При экспорте в pdf я сначала писал все в файл и уже отдавал файл клиенту, но падало так и на том же месте, как и при экспорте в html.
Приношу извинения. Дал ответ на автомате. Просто это очень типичный вопрос - про экспорт в html и картинки. Судя по стеку ошибки, валится при попытке скомпилировать отчет. Метод Compile вызвается методом Render. Вариант решения попробуйте такой:

report.Compile("Разрешенный путь к сборке отчета.dll");
report.Render(false);

Если не поможет, тогда надо будет отчет грузить из сборки или подключать в ввиде класса.

Спасибо.
avis
Сообщения: 5
Зарегистрирован: 04 мар 2009, 17:32
Откуда: Krasnodar

Проблемы с рендером отчетов в asp.net mvc

Сообщение avis »

Окс, попробую.
avis
Сообщения: 5
Зарегистрирован: 04 мар 2009, 17:32
Откуда: Krasnodar

Проблемы с рендером отчетов в asp.net mvc

Сообщение avis »

Jan писал(а):Здравствуйте,
avis писал(а):Хм, спасибо.
Вечером попробую, но, насколько я помню, тоже самое было и при экспорте в pdf - картинки так же будут ложится в папку по умолчанию?
При экспорте в pdf я сначала писал все в файл и уже отдавал файл клиенту, но падало так и на том же месте, как и при экспорте в html.
Приношу извинения. Дал ответ на автомате. Просто это очень типичный вопрос - про экспорт в html и картинки. Судя по стеку ошибки, валится при попытке скомпилировать отчет. Метод Compile вызвается методом Render. Вариант решения попробуйте такой:

report.Compile("Разрешенный путь к сборке отчета.dll");
report.Render(false);

Если не поможет, тогда надо будет отчет грузить из сборки или подключать в ввиде класса.

Спасибо.
К сожалению, проблемы те же - как падало, так и падает.

Немного повозился, сделал так:
String reportTmpDir = "разрешенная папка";

StiConfig.ApplicationDirectory = reportTmpDir;
report.Compile(Path.Combine(reportTmpDir, String.Format("{0}.dll", Guid.NewGuid())));

report.Render(false);
Работает на ура, но, как я понимаю, мне нужно будет за собой "убирать" после выдачи отчета?
Или же есть вариант засейвить скомпиленный отчет в бд/иное место и работать с бинарником?


Jan
Сообщения: 495
Зарегистрирован: 19 фев 2009, 11:14

Проблемы с рендером отчетов в asp.net mvc

Сообщение Jan »

Здравствуйте,
avis писал(а): Работает на ура, но, как я понимаю, мне нужно будет за собой "убирать" после выдачи отчета?
Все верно, нужно убирать, но есть проблема. .Net будет "держать" эту сборку до выгрузки домена приложения в котором была загружена скомпилированная сборка. Причем метод Compile только создает сборку, не загружая ее. А вот если вызвать метод Render, то сборка будет загружена. Варианты решения проблемы:

1. Использовать отчеты в виде классов на c#;
2. Использовать отчеты в виде прекомпилированных сборок;
3. Строить отчеты в другом домене приложения (очень медленно);
4. Перед построением отчета проверить, а нет ли скопилированной версии отчета и если есть, то загрузить ее.
Или же есть вариант засейвить скомпиленный отчет в бд/иное место и работать с бинарником?
Сохранить можно, и даже можно загрузить сборку из массива байтов (есть перегрузки метода Load в классе StiReport), но реально .Net все равно скопирует сборку куда то (к примеру во временную папку) и уже оттуда загрузит его.

Спасибо.
Ответить