XpsDocumenWriter从Windows Service挂起,但是从控制台运行时可以正常工作

时间:2019-02-08 12:09:08

标签: c# windows-services

我有一个窗口服务,用于执行各种作业,其中之一是打印通过WPF生成的文档。运行控制台应用程序时,它可以正常运行,但是从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时,它将阻止执行(方法永远不会结束)。

所以,我做了一点调查。谷歌搜索给了我一些提示,所以

  • 我确保Windows Service在运行时具有与独立控制台相同的权限。
  • 我确保Windows Service与独立控制台一样以x64进程运行
  • 我尝试调试PrintDialog.PrintDocument方法。我从referencesource那里下载了代码,它给了我一个新的见解,但是不幸的是,这也没有解决问题,它只是指出了哪个方法阻止了执行(这是XpsDocumentWriter.Writer方法,该行460)。

现在,毕竟,我确定这一定是有关权限的事情。尽管Windows服务使用同一用户作为独立控制台应用程序(管理员用户)运行,但在我看来,它仍然没有所需的所有权限。 Windows服务在这里有什么特别之处吗?我是否缺少某些东西,在运行控制台之前还应该为Windows服务设置什么?

1 个答案:

答案 0 :(得分:0)

我解决了这个问题,所以如果有人遇到相同的情况,这就是发生的情况。

为了测试该应用程序,我使用的是Microsoft pdf打印机,因此当将控制台作为独立应用程序运行(不通过服务)时,如果使用Microsoft pdf打印机,它将在最后显示一个对话框,要求输入文件名称和位置。那行得通,因为我可以看到一个对话框,然后按一下按钮。但是,当通过Windows Service运行相同的控制台并使用相同的打印机(Microsof pdf)进行打印时,它只会挂起,原因是服务属性"Alow service to interact with desktop"。默认情况下为false,因此在注册服务时,任何用户交互都不可见,在我的情况下,这正是PrintDialog挂起的确切时间,因为它正在等待用户输入以保存pdf。更换为真正的打印机后,一切都按预期进行。

解决此问题的另一种方法是使用不同的打印API,该API无需用户交互即可正常工作(通过以编程方式传递参数)。

相关问题