Непредсказуемый веб-вьювер

Обсуждение Stimulsoft Reports.NET
mimas
Сообщения: 31
Зарегистрирован: 21 мар 2008, 07:43
Откуда: Samara

Непредсказуемый веб-вьювер

Сообщение mimas »

Постоянно сталкиваемся с проблемой:
открываем в веб-вьювере отчет. страниц на 40 например. вьюевер покрутил-подумал и выдал белую страницу.
кнопки доступны.. отчета нет. если нажать экспорт в эксель например, то всё отлично экспортится.
восновном конечно пролема всплывает когда отчеты не самые маленькие (от десятков страниц). но численных экспериментов не проводил. Иногда один и тот же отчет то открывается, то нет. пользователи таких приколов не понимают - чистый лист - значит у этих айтишников ничего не работает. приходится минуя вьювер сразу в респонс эксель выкидывать.

Давайте кат-то вылечим этот косячок.
Аватара пользователя
Vladimir
Сообщения: 415
Зарегистрирован: 06 авг 2008, 09:48
Откуда: Earth

Непредсказуемый веб-вьювер

Сообщение Vladimir »

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

Скорее всего, Ваша проблема связана с переполнением кэша на сервере.
Сообщите следующие данные:
1. В каком событии происходит рендеринг отчёта (присвоение его WebViewer-у)
2. Какое значение выбрано у RenderMode
3. Какое значение установлено у ServerTimeOut

Спасибо.
mimas
Сообщения: 31
Зарегистрирован: 21 мар 2008, 07:43
Откуда: Samara

Непредсказуемый веб-вьювер

Сообщение mimas »

1. на Page_Load
2. было Ajax. исправил на AjaxWithCacheю но точно сказать помогло или нет не могу, ошибка не проявляется какоето время. может и помогло.
3. таймаут по умолчанию
Аватара пользователя
Vladimir
Сообщения: 415
Зарегистрирован: 06 авг 2008, 09:48
Откуда: Earth

Непредсказуемый веб-вьювер

Сообщение Vladimir »

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

Да, режим AjaxWithCache снимает нагрузку с сервера (в режиме Ajax без кэша отчёт каждый раз компилируется заново).
Так же попробуйте установить время жизни кэша 5 минут (по умолчанию установлено 15), это дополнительно немного разгрузит память сервера.

Спасибо.
mimas
Сообщения: 31
Зарегистрирован: 21 мар 2008, 07:43
Откуда: Samara

Непредсказуемый веб-вьювер

Сообщение mimas »

>>Так же попробуйте установить время жизни кэша 5 минут (по умолчанию установлено 15), это дополнительно немного разгрузит память сервера.

Это как сделать?
Ivan
Сообщения: 641
Зарегистрирован: 10 авг 2006, 05:40
Откуда: Stimulsoft Office

Непредсказуемый веб-вьювер

Сообщение Ivan »

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

Уменьшить таймаут кэша можно следующим образом:
1) у aspx компонента:
cc1:StiWebViewer ID="StiWebViewer1" runat="server" ServerTimeOut="00:05:00"

или 2) в коде:
StiWebViewer1.ServerTimeOut = new TimeSpan(0, 5, 0);

Спасибо.
mimas
Сообщения: 31
Зарегистрирован: 21 мар 2008, 07:43
Откуда: Samara

Непредсказуемый веб-вьювер

Сообщение mimas »

Вобщем не помогло.. в связи с чем прошу проконсультируйте как наиболее эффективным способом нам построить веб-отчетность.
Имеем - пару десятков видов отчетов в MRT. одни проще, другие сложнее, одни совсем пухлые крос-отчеты (и проблемы восновном именно с ними). самый пухлый из них получается на основе датасета из трех тадатэйблов, который закидывается в отчет через RegData (см. код).

на основе параметров, переданных в страницу, определяем тип отчета, генерим датасет и прокидываем его в отчет, прокидываем Variables.
Ниже концептуальный код, используемый для получения отчетов.

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

private int number = -1; //номер отчета

protected void Page_Load(object sender, EventArgs e)
{
   number = Параметр_страницы_0;
   if (StiViewer.IsImageRequest) return;

   ShowReport(this.number);
}


protected void ShowReport(int number)
{

        StiReport report = null;
        switch(number)
        {
            case -1:
                break;
						case 32:
                report = InitReport(number);
                if (report != null)
                {
                    DataTable dt1 = new DataTable("Registr");
                    DataTable dt2 = new DataTable("Date");
                    DataTable dt3 = new DataTable("ValueProgress");

                    DataSet ds = new DataSet();
                    ds.Tables.Add(dt1);
                    ds.Tables.Add(dt2);
                    ds.Tables.Add(dt3);

                    SqlDataReader dr1 = GetReport_RegistrDocument(Параметр_страницы_1);
                    dt1.Load(dr1, LoadOption.OverwriteChanges);

                    SqlDataReader dr2 = GetReport_DateRegistrDocument();
                    dt2.Load(dr2, LoadOption.OverwriteChanges);

                    SqlDataReader dr3 = GetReport_ValueProgressRegistrDocument();
                    dt3.Load(dr3, LoadOption.OverwriteChanges);

                    report.RegData(ds);
                    
                    PrepareViewer(report, StiViewer);
                 }
                 break;
             case 33:
                report = InitReport(number);
                if (report != null)
                {
                    report.Dictionary.Variables["ProjectName"].Value = "ла-ла-ла"
                    report.Dictionary.Variables["StageName"].Value = "ла-ла-ла"
                    report.Dictionary.Variables["ps"].Value = Параметр_страницы_1;
                    report.Dictionary.Variables["cat"].Value = Параметр_страницы_2;
                    report.Dictionary.Variables["voidtype"].Value = Параметр_страницы_3;

                    report.Dictionary.Synchronize();
                    report.Compile();
                    PrepareViewer(report, StiViewer);
                }
                break;
            default:
                throw new Exception("Отчета с таким номером не существует");
                break;
        }
    }

}

    protected Stimulsoft.Report.StiReport InitReport(int number)
    {
        Stimulsoft.Report.StiReport report = new Stimulsoft.Report.StiReport();
        switch (number)
        {
            case -1:
                break;
            case 33:
                report.Load(HostingEnvironment.MapPath("~/docsinside/reports_site/DocExecutionByProjectComposition.mrt"));
                break;
            case 34:
                report.Load(HostingEnvironment.MapPath("~/docsinside/reports_site/la-la-la.mrt"));
                break;
                
            default:
                throw new Exception("Отчета с таким номером не существует");
        }
        return report;
    }

    protected void PrepareViewer(StiReport report, StiWebViewer viewer)
    {
        viewer.ServerTimeOut = new TimeSpan(0, 5, 0);
        report.Render(false);

        viewer.Report = report;
    }
Проблемы:
1) отчет не рендерится - белый лист и кнопки навигации
2) OutofMemoryException. реально самый большой отчет даже на локальной отладочной машине дохнет. процесс асп_нет кушает 600 метров оперативной и еще 600 метров виртуальной памяти. Такой показатель на отчете из примера, где на странице получается датасет, который потом регистрируется в репорте. Есть отчеты в которые таким же макарром прокидываются не датасеты а коллекции бизнес-объектов, полученные на странице.

С отчетами, построенными без участия методов получения данных на странице (т.е. конекш внутри отчета, там же свои внутренние источники данных, заполняемые на основе variables) вроде проблем не замечено.

Пробовал включать кэш. логично что толстые отчеты кэшем убьют сервер. отключил. ничего не изменилось

В самих отчетах никаких картинок и тяжелых данных - только текст.
Jan
Сообщения: 495
Зарегистрирован: 19 фев 2009, 11:14

Непредсказуемый веб-вьювер

Сообщение Jan »

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

А сколько страниц в самом большом отчете?

Спасибо.
mimas
Сообщения: 31
Зарегистрирован: 21 мар 2008, 07:43
Откуда: Samara

Непредсказуемый веб-вьювер

Сообщение mimas »

под 200 - уже отваливается. бывает и больше
Jan
Сообщения: 495
Зарегистрирован: 19 фев 2009, 11:14

Непредсказуемый веб-вьювер

Сообщение Jan »

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

А сколько памяти занимает процесс Asp.net при построении отчета на локальной машине? Обычно при 200-300 мегабайтах процесс перезапускается. Обвал начинается в момент построения отчета или в момент отображения отчета?
2. было Ajax. исправил на AjaxWithCacheю но точно сказать помогло или нет не могу, ошибка не проявляется какоето время. может и помогло.
Режимы с кэшированием отчета позволяют при обновлении страницы не перестраивать отчет (т.е. увеличить скорость), а взять его из кэша. Это занимает дополнительную память.


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