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

时间:2017-10-20 20:58:42

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

我正在使用客户端的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 Datacenter上。

修改

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

修改

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

1 个答案:

答案 0 :(得分:0)

鉴于问题似乎与IIS有关(我完全不了解),并且在IIS Express的调试模式下运行正常,而且这是一个演示(不是生产),我决定只是主持在IIS Express中使用VS 2017的传送器插件(https://marketplace.visualstudio.com/items?itemName=vs-publisher-1448185.ConveyorbyKeyoti)允许远程调用(默认情况下IIS Express不允许)。

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

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