Как подавить всплывающие окна при построении отчета?
kin9pin
Mosvegas
Добрый день. Столкнулся с огромной проблемой.
Написал WCF-сервис, который делает примерно следующее. Он имеет метод для создания договоров и сохранения их на сервере CreateContract(int orderId), где orderId - идентификатор записи заказа в БД MySQL. Внутри происходит примерно вот такой фэншуй:
В самом Contract.frx подключен плагин FastReport.MySQL.dll, происходит связывание данных, выбор необходимых сведений из БД... Тут проблем никаких нету.
Если на сервере под Windows Server 2003 запустить сервис как консольное приложение, то проблем никаких нету, всё прекрасно генерируется, сохраняется.
Но если WCF-сервис на сервере поднять именно как Windows-сервис с автоматическим запуском под учетной записью LocalSystem (это необходимо на тот случай, если вдруг сервер перезагрузили или было отключение электричества, то он сам должен подняться), то происходит такая картина. По логам вижу, что сервис после ребута сервера поднимается, ждет команд, но если вызвать CreateContract, то возникает ошибка "Показ модального диалогового окна или формы является допустимой операцией, только если приложение запущено в режиме UserInteractive. Для отображения уведомления из служебного приложения укажите стиль ServiceNotification или DefaultDesktopOnly". Поковырявшись в чем дело, выяснил, что она возникает только тогда, когда внутри отчета идет обращение к БД. Если же просто в отчете для отладки вывести par_orderId, то генерация проходит без проблем, pdf успешно сохраняется, что говорит о том, что ошибка возникает только в момент работы плагина. Установка параметра "Разрешить взаимодействие с рабочим столом" не помогает, оно и понятно, ведь сервис запускается до того, как кто-то из айтишников делает логон в систему и рабочего стола для него не существует...
Попробовал использовать ODBC-драйвер, но он быстро отпал, потому что в дизайнере отчета нельзя выбрать источник из системного DNS, что тоже ставит крест на возможности использования такого отчета в работе Windows-сервиса.
Вопрос: как можно подавить выше указанную ошибку? Код, указанный выше, обязательно должен работать только на сервере, а не на стороне клиента. Предложение постоянно мониторить не было ли ребутов и самостоятельно запускать WCF-сервис в консольном приложении тоже не предлагать.
Спасибо заранее, если подскажите любой конструктивное предложение выхода из данной проблемы.
Написал 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-сервис в консольном приложении тоже не предлагать.
Спасибо заранее, если подскажите любой конструктивное предложение выхода из данной проблемы.
Комментарии
(галочка "Разрешить взаимодействие с рабочим столом" в свойствах службы, на вкладке "Вход в систему")