为什么我不能从 Web 服务启动 WinForms 应用程序



我正在使用客户端的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应用程序启动时,它也与同一个Admin帐户关联(该帐户也与IIS Express使用的帐户相同)。

可能是IIS没有使用GUI启动应用程序的权限,但IIS Express有权限吗?

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

该web服务托管在Windows Server 2016数据中心上。

编辑

我已经取得了一点进展——根据IIS7中的一个答案,我的Exe文件不是通过Process start启动的,但它';s正在任务栏中运行我已将应用程序池设置更改为"加载用户配置文件=True"(https://i.stack.imgur.com/2pIyr.png)。现在,当我尝试时,我可以在任务管理器中看到WinForms应用程序,内存变化与我预期的相似,应用程序似乎退出了。GUI没有显示,预期的输出文件没有创建,web服务进程也没有。WaitForExit()似乎没有接收到退出事件(它抛出一个错误,因为WinForms应用程序退出时进程实例丢失)。

编辑

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

考虑到这个问题似乎与IIS有关(我还远没有完全理解),并且使用IIS Express在调试模式下运行可以正常工作,而且这是为了演示(而不是生产),我决定简单地在IIS Express中托管,并为VS 2017使用Conveyor插件(https://marketplace.visualstudio.com/items?itemName=vs-publisher-1448185.ConveyorbyKeyoti)以允许远程调用(默认情况下IIS Express不允许远程调用)。

一旦安装了Conveyor,并在服务器防火墙上打开了适当的端口(并将其添加到我用于此演示的Azure虚拟机上的网络接口),一切都如预期的那样工作。

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

最新更新