我有一个通常是典型的GUI文档编辑应用程序的应用程序。它具有“批处理模式”,因此用户可以使用一些参数运行它并获取生成的文档。问题是,即使在批处理模式下运行,应用程序也会显示UI(它显示,执行某些操作,然后退出)。
问题是 - 我可以托管在服务器上的IIS中以批处理模式运行此应用程序的WCF服务吗?
我花了两天时间试图做到这一点却没有成功。我看到该进程正在服务器上的任务资源管理器中运行,但它什么都不做,没有产生任何结果,也没有正常退出。
来自IIS托管的WCF服务的具有UI runnig的应用程序是否有任何限制?
答案 0 :(得分:1)
是的,服务在与桌面交互方面存在局限性。
将您的业务逻辑粘贴到一个单独的库中,将您的服务提取到一个单独的项目中,最后将您的GUI连接到两者。现在,您已经重建了已有的应用程序,现在可以创建一个新的库或Windows服务项目,并引用业务逻辑和服务代码。然后,最终项目可以在IIS或Windows服务中托管,而无需显示任何GUI。
答案 1 :(得分:1)
@CodeCaster是对的。 WCF服务不会公开UI本身。但是,正如您所说,您的应用程序能够以批处理模式运行;在这种模式下,它仍然显示一个UI。
可能有一种方法可以让WCF服务以批处理模式启动和运行此GUI程序。您需要创建一个运行该服务的Windows用户帐户。创建WCF服务并将服务安装为Windows服务后,从“管理工具”中打开“服务”小程序。右键单击该服务,然后选择属性。然后单击登录选项卡,并指定为该服务创建的Windows用户帐户的用户名和密码。 (当然,Windows Server 2008 R2和2012都有新的服务帐户,这也可以解决问题。)
此方案的问题是,您必须为您创建的用户帐户与桌面交互权限。这有点担心安全问题,因为您可能拥有一个管理员级别的帐户(取决于您的设置方式),并且可以自主运行并具有与桌面交互的权限。
这种方法的另一个问题是,如果GUI程序需要任何类型的用户输入(即发生错误或显示对话框),服务帐户将无法点击任何按钮或以任何方式确认任何内容。这就是为什么不鼓励这种方法的原因。
如果程序是用.NET编写的并且是您公司的内部代码,您可以尝试将ILDASM用于程序二进制文件或使用ILSpy或Red Gate的.NET Reflector等工具并对程序进行反向工程并将其拆分为组件部分(假设代码没有被混淆) - 一个提供批处理的服务DLL,以及一个用于何时以交互方式运行程序的GUI。然后可以重新使用服务DLL(如@CodeCaster所说)通过您将创建的WCF服务以“批处理”模式运行逻辑,同时避免令人讨厌的与桌面交互正确运行当前程序的GUI所必需的。
这不是一个完美的答案(如果答案的话),但我希望它有所帮助。