【问题标题】:XpsDocumenWriter hangs from Windows Service, but works fine when running from consoleXpsDocumenWriter 从 Windows 服务挂起,但从控制台运行时工作正常
【发布时间】:2019-02-08 12:09:08
【问题描述】:

我有一个窗口服务,用于执行各种工作,其中一个是打印通过 WPF 生成的文档。运行控制台应用程序时,它工作正常,但从 Windows 服务运行时,它只是挂起。

让我稍微解释一下窗口服务。为了尽量减少任何可能的副作用,Windows 服务只是实际控制台的包装器。因此,当 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 服务设置什么?

【问题讨论】:

    标签: c# windows-services


    【解决方案1】:

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

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

    解决这个问题的另一种方法是使用不同的打印 API,它可以在没有用户交互的情况下工作(通过以编程方式传递参数)。

    【讨论】:

      猜你喜欢
      • 2019-11-30
      • 2020-06-06
      • 2011-01-07
      • 2014-09-05
      • 1970-01-01
      • 2010-11-25
      • 2012-11-29
      • 1970-01-01
      • 2011-07-06
      相关资源
      最近更新 更多