【问题标题】:Why can't I launch WinForms application from a Web Service为什么我不能从 Web 服务启动 WinForms 应用程序
【发布时间】:2017-10-20 20:58:42
【问题描述】:

我正在使用客户的 WinForms 应用程序将其包装为 Web 服务 - 这并不理想,但我目前唯一的选择。

可以通过命令行调用 WinForms 应用程序并使用一些参数,使其能够生成一些输出文件,然后我可以处理这些输出文件并将其返回给用户。这个命令行界面基本上是启动 GUI,预填充一些输入字段(通过命令行参数提供),生成输出文件,然后退出。

在我的 Web 服务中,我使用 Process.Start() 来运行应用程序,等待它退出,然后处理输出文件以返回给客户端。 (虽然 GUI 会在服务器上显示自己,但我不希望任何用户看到它)。

当使用 IIS Express 在调试模式 (Visual Studio 2017) 下运行时,代码按预期工作 - 我对 Web 服务进行了适当的调用,WinForms 应用程序启动(我可以在屏幕上看到它)并且确实它的东西,然后它会自动关闭,并在预期的位置找到预期的输出文件。基本上,一切都完全按照设计运行。

但是,当我部署到同一台服务器但托管在 IIS(而不是 IIS Express)下时,它不再起作用。当我调用 Web 服务时,我可以在任务管理器中看到 WinForms 应用程序正在启动......但是它立即停止,UI 本身没有出现。在此之后,与 WinForms 应用程序关联的内存保持不变(比正常工作时低得多),API 调用最终超时。

我已将 IIS 中的 AppPool 更改为使用我的管理员帐户,并且与 WinForms 应用程序关联的所有文件夹都对同一管理员帐户具有“完全控制”权限。当 WinForms 应用程序启动时,它也与同一个管理员帐户相关联(这也与 IIS Express 使用的帐户相同)。

可能是因为 IIS 没有权限启动带有 GUI 的应用程序,但 IIS Express 可以?

我已经搜索过类似的问题,但没有任何帮助解决这个问题(大多数处理访问不在 Web 服务根目录下的文件时可能出现的常见文件夹访问权限)。

Web 服务托管在 Windows Server 2016 Datacenter 上。

编辑

我已经取得了一些进展 - 根据IIS7 does not start my Exe file by Process Start but it's running in task bar 的答案之一,我将应用程序池设置更改为 Load User Profile = True (https://i.stack.imgur.com/2pIyr.png)。现在,当我尝试时,我可以在任务管理器中看到 WinForms 应用程序,内存的变化与我预期的相似,并且该应用程序似乎退出了。 GUI 未显示,未创建预期的输出文件,Web 服务 process.WaitForExit() 似乎没有收到退出事件(它抛出错误,因为 WinForms 应用程序退出时流程实例丢失) .

编辑

只是澄清一下,这是一个演示,所以解决方案不需要反映生产的最佳实践。

【问题讨论】:

  • 您是否将“万维网发布服务”配置为“允许服务与桌面交互”? (在我的 Win10pro 机器上,这是在“登录”选项卡上,但仅在选择“本地系统”帐户时可用。
  • 感谢您的建议。我没试过。我更改了设置并执行了重新启动。这似乎没有任何区别。我想知道是否还有其他需要类似权限的服务。
  • 有一种叫做“会话隔离”的东西。了解这一点并了解系统会话和登录会话之间的障碍是什么,然后您将看到应该做什么。
  • 从 IIS 启动 GUI 进程将比它的价值更麻烦。我的猜测是,您正在启动的进程正在崩溃,因为它正在运行的权限/API 限制,因为它在服务中的应用程序池用户下运行。向该应用程序添加错误处理/日志记录以查看问题所在,但我建议将该实用程序重写为可以从 IIS 进程中使用的控制台应用程序或 DLL。
  • 鉴于它可以使用 IIS Express 进行托管,但不能使用 IIS,我想知道使用 OWIN 进行自托管是否可行...

标签: c# winforms web-services iis windows-server


【解决方案1】:

鉴于问题似乎与 IIS 相关(我还远未完全理解),并且使用 IIS Express 在调试模式下运行正常,而且这是用于演示(不是生产),我决定简单地托管在 IIS Express 中并使用 VS 2017 (https://marketplace.visualstudio.com/items?itemName=vs-publisher-1448185.ConveyorbyKeyoti) 的 Conveyor 插件来允许远程调用(默认情况下 IIS Express 不允许这样做)。

安装 Conveyor 并在服务器防火墙上打开适当的端口(并添加到我用于此演示的 Azure VM 上的网络接口)后,一切都按预期工作。

这不是一个长期的解决方案,当然也不是一个生产解决方案,但它符合当前的目的。我可以轻松拒绝 WinForms 应用程序运行时传入的任何请求。

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    • 2013-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多