XpsDocumenWriter зависает от службы Windows, но отлично работает при запуске из консоли - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть Window Service, который используется для выполнения различных заданий, в том числе для печати документа, созданного с помощью WPF.При запуске консольного приложения оно работает нормально, но при запуске из службы Windows просто зависает.

Позвольте мне немного объяснить службу Windows.Чтобы свести к минимуму любые возможные побочные эффекты, Windows Service - это просто оболочка для самой консоли.Итак, когда Window Service запущен (в его методе start), существует простой вызов Process.Start, который вызывает консоль, например:

Process.Start("[path_to_my_console_exe]");

Теперь, когда вызывается код для печати, он простовисит.Я использую PrintDialog API для печати документа.Вызов для печати документа прост:

var printDialog = new PrintDialog();                
printDialog.PrintDocument(doc.DocumentPaginator);

Когда нажата PrintDocument, он заблокирует выполнение (метод никогда не завершится).

Итак, я провел небольшое исследование.Googling дал мне несколько советов, поэтому

  • Я убедился, что служба Windows работает с теми же разрешениями, что и автономная консоль.
  • Я убедился, что служба Windows работает как процесс x64, так же, как и автономная консоль
  • Я попытался отладить метод PrintDialog.PrintDocument.Я буквально загрузил код из ReferenceSource , и это дало мне новое понимание, но, к несчастью, это не решило проблему, просто он определил, какой метод блокирует выполнение (это метод XpsDocumentWriter.Writer., строка 460).

Теперь, после всего этого, я уверен, что это должно быть что-то относительно разрешений.Хотя служба Windows использует того же пользователя для запуска в качестве автономного консольного приложения (администратор), мне кажется, что он по-прежнему не обладает всеми необходимыми разрешениями.Есть ли что-то особенное с Windows Service здесь?Я что-то упустил, есть ли что-то еще, что должно быть установлено для службы Windows перед запуском консоли?

1 Ответ

0 голосов
/ 26 апреля 2019

Я решил проблему, поэтому, если кто-то попадет в ту же ситуацию, вот что случилось.

Для тестирования приложения я использовал принтер Microsoft PDF, поэтому при запуске консоли в качестве автономного приложения (не через службу), когда используется принтер Microsoft pdf, в конце отобразится диалоговое окно с запросом имени и местоположения файла.Это может сработать, потому что я мог видеть диалог и нажимать кнопку.Но при запуске той же консоли через службу Windows и использовании одного и того же принтера (Microsof pdf) для печати она просто зависнет, и причина в том, что свойство службы «Разрешить взаимодействие службы с рабочим столом» .По умолчанию это false, поэтому при регистрации службы любое взаимодействие с пользователем не будет видно, и в моем случае это была именно та точка, где зависает PrintDialog, потому что он ожидает ввода пользователя для сохранения pdf.После замены на настоящий принтер все заработало как положено.

Еще один способ решить эту проблему - использовать другой API печати, который мог бы работать без взаимодействия с пользователем (передавая аргументы программно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...