XpsDocumenWriter从Windows服务挂起,但从控制台运行时工作正常
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XpsDocumenWriter从Windows服务挂起,但从控制台运行时工作正常相关的知识,希望对你有一定的参考价值。
我有一个用于执行各种作业的窗口服务,其中一个是打印通过WPF生成的文档。运行控制台应用程序时,它工作正常,但从Windows服务运行时,它只是挂起。
让我解释一下Window Service。为了尽量减少任何可能的副作用,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服务的运行权限与独立控制台相同。
- 我确保Windows服务作为x64进程运行,与独立控制台相同
- 我试图调试PrintDialog.PrintDocument方法。我真的从referencesource下载了代码,它给了我一个新的见解,但不幸的是,它既没有解决问题,它只是进一步指出哪个方法阻止了执行(它是XpsDocumentWriter.Writer方法,第460行)。
现在,在所有这些之后,我确信它必须是关于权限的东西。虽然Windows服务使用相同的用户作为独立控制台应用程序(管理员用户)运行,但在我看来仍然没有所需的所有权限。 Windows服务有什么特别之处吗?我错过了什么,在运行控制台之前还有什么应该为Windows服务设置的吗?
我解决了这个问题,所以如果有人遇到同样的情况,这就是发生的事情。
为了测试应用程序,我使用的是Microsoft pdf打印机,因此当作为独立应用程序(而非通过服务)运行控制台时,使用Microsoft pdf打印机时,它会在最后显示一个对话框,询问文件名和位置。这可能有效,因为我可以看到一个对话框并按下按钮。但是,当运行相同的控制台,通过Windows服务,并使用相同的打印机(Microsof pdf)进行打印时,它只会挂起,原因是服务属性"Alow service to interact with desktop"。这默认为false,因此在注册服务时,任何用户交互都不可见,在我的情况下,这是PrintDialog挂起的确切点,因为它正在等待用户输入来保存pdf。在换成真正的打印机之后,一切都按照要求进行了操作。
解决此问题的另一种方法是使用不同的打印API,这可以在没有用户交互的情况下工作(通过以编程方式传递参数)。
以上是关于XpsDocumenWriter从Windows服务挂起,但从控制台运行时工作正常的主要内容,如果未能解决你的问题,请参考以下文章
有啥方法可以从 Windows 7 上的 Windows 服务启动 GUI 应用程序?