Как подавить всплывающие окна при построении отчета?

kin9pinkin9pin Mosvegas
отредактировано 16:18 Раздел: FastReport .NET
Добрый день. Столкнулся с огромной проблемой.
Написал WCF-сервис, который делает примерно следующее. Он имеет метод для создания договоров и сохранения их на сервере CreateContract(int orderId), где orderId - идентификатор записи заказа в БД MySQL. Внутри происходит примерно вот такой фэншуй:
public void CreateContract(int orderId)
{
  using (Report report = new FastReport.Report())
  using (PDFExport export = new PDFExport())
  {
     EnvironmentSettings env = new EnvironmentSettings();
     env.ReportSettings.ShowPerformance = false;
     env.ReportSettings.ShowProgress = false;

     report.Load(Path.Combine(frOrdersTemplateFolder, "Contract.frx"));
     report.SetParameterValue("par_orderId", orderId);
     report.Prepare();

     report.Export(export, @"D:\Orders\" + id.ToString() + ".pdf");
  }
}

В самом Contract.frx подключен плагин FastReport.MySQL.dll, происходит связывание данных, выбор необходимых сведений из БД... Тут проблем никаких нету.
Если на сервере под Windows Server 2003 запустить сервис как консольное приложение, то проблем никаких нету, всё прекрасно генерируется, сохраняется.

Но если WCF-сервис на сервере поднять именно как Windows-сервис с автоматическим запуском под учетной записью LocalSystem (это необходимо на тот случай, если вдруг сервер перезагрузили или было отключение электричества, то он сам должен подняться), то происходит такая картина. По логам вижу, что сервис после ребута сервера поднимается, ждет команд, но если вызвать CreateContract, то возникает ошибка "Показ модального диалогового окна или формы является допустимой операцией, только если приложение запущено в режиме UserInteractive. Для отображения уведомления из служебного приложения укажите стиль ServiceNotification или DefaultDesktopOnly". Поковырявшись в чем дело, выяснил, что она возникает только тогда, когда внутри отчета идет обращение к БД. Если же просто в отчете для отладки вывести par_orderId, то генерация проходит без проблем, pdf успешно сохраняется, что говорит о том, что ошибка возникает только в момент работы плагина. Установка параметра "Разрешить взаимодействие с рабочим столом" не помогает, оно и понятно, ведь сервис запускается до того, как кто-то из айтишников делает логон в систему и рабочего стола для него не существует...

Попробовал использовать ODBC-драйвер, но он быстро отпал, потому что в дизайнере отчета нельзя выбрать источник из системного DNS, что тоже ставит крест на возможности использования такого отчета в работе Windows-сервиса.

Вопрос: как можно подавить выше указанную ошибку? Код, указанный выше, обязательно должен работать только на сервере, а не на стороне клиента. Предложение постоянно мониторить не было ли ребутов и самостоятельно запускать WCF-сервис в консольном приложении тоже не предлагать.

Спасибо заранее, если подскажите любой конструктивное предложение выхода из данной проблемы.

Комментарии

  • отредактировано April 2013
    kin9pin написал: »
    Добрый день. Столкнулся с огромной проблемой.
    Попробуйте службу сделать интерактивной
    (галочка "Разрешить взаимодействие с рабочим столом" в свойствах службы, на вкладке "Вход в систему")
  • kin9pinkin9pin Mosvegas
    отредактировано 16:18
    Oloth Teken написал: »
    Попробуйте службу сделать интерактивной
    (галочка "Разрешить взаимодействие с рабочим столом" в свойствах службы, на вкладке "Вход в систему")
    Ну я вообще-то так и делал, о чем сообщил сразу
    Oloth Teken написал: »
    Установка параметра "Разрешить взаимодействие с рабочим столом" не помогает, оно и понятно, ведь сервис запускается до того, как кто-то из айтишников делает логон в систему и рабочего стола для него не существует...
    Хотя на самом деле, если даже сделать вход под учетной записью какого-то пользователя, запустить сервис с этой галочкой, то тот же самый фэйл(
  • kin9pinkin9pin Mosvegas
    отредактировано May 2013
    В общем, методом народного тыка решил данную проблему. Логика такова: сперва надо загрузить шаблон, выставить кое-какие статические параметры, только потом передавать параметры в отчет и его генерировать. При этом в настройках сервиса необходимо выставить "Разрешить взаимодействие с рабочим столом"
    public void CreateContract(int orderId)
    {
      using (Report report = new FastReport.Report())
      using (PDFExport export = new PDFExport())
      {
         report.Load(Path.Combine(frOrdersTemplateFolder, "Contract.frx"));  // 1. сперва грузим шаблон в память
    
         EnvironmentSettings env = new EnvironmentSettings();                // 2. выставляем параметры, подавляющие всплывающие окна
         env.ReportSettings.ShowPerformance = false;
         env.ReportSettings.ShowProgress = false;
    
         report.SetParameterValue("par_orderId", orderId);                   // 3. передаем параметры
         report.Prepare();                                                   // 4. готовим на нашей кухне отчет
    
         report.Export(export, @"D:\Orders\" + id.ToString() + ".pdf");
      }
    

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.