1

我有一个通常是典型的 GUI 文档编辑应用程序的应用程序。它具有“批处理模式”,因此用户可以使用一些参数运行它并获得结果文档。问题是应用程序即使在批处理模式下运行时也会显示 UI(它显示、执行某些操作,然后自行退出)。

问题是 - 我可以在服务器上的 IIS 中托管一个以批处理模式运行此应用程序的 WCF 服务吗?

我花了两天时间试图做到这一点,但没有成功。我看到该进程正在服务器上的任务资源管理器中运行,但它什么也不做,不产生任何结果并且不正常退出。

从 IIS 托管的 WCF 服务运行 UI 的应用程序是否有任何限制?

4

2 回答 2

1

是的,服务在与桌面交互方面存在限制。

将您的业务逻辑放在一个单独的库中,将您的服务提取到一个单独的项目中,最后将您的 GUI 连接到两者。现在,您已经重新构建了已有的应用程序,并添加了一个额外功能:您现在可以创建一个新的库或 Windows 服务项目,其中包含对业务逻辑和服务代码的引用。然后,这个最终项目可以托管在 IIS 中或作为 Windows 服务,而无需显示任何 GUI。

于 2013-05-28T11:50:05.143 回答
1

@CodeCaster 是对的。WCF 服务本身不会公开 UI。但是,正如您所说,您的应用程序能够以批处理模式运行;在这种模式下,它仍然显示一个 UI。

可能有一种方法可以让 WCF 服务以批处理模式启动和运行这个 GUI 程序。您需要创建一个运行服务的 Windows 用户帐户。创建 WCF 服务并将该服务安装为 Windows 服务后,从管理工具中打开服务小程序。右键单击该服务并选择Properties。然后单击登录选项卡并指定您为服务创建的 Windows 用户帐户的用户名和密码。(当然,Windows Server 2008 R2 和 2012 有新的服务帐户也可以解决问题。)

这种情况的问题是,您必须为您创建与桌面交互的用户帐户提供权限。这是一个安全问题,因为您可能有一个管理员级别的帐户(取决于您如何设置它)自主运行并有权与桌面交互。

这种方法的另一个问题是,如果 GUI 程序需要任何类型的用户输入(即发生错误或显示对话框),服务帐户将无法单击任何按钮或确认任何内容。这就是不鼓励这种方法的原因。

如果程序是用 .NET 编写的并且是您公司的内部代码,您可以尝试将 ILDASM 转换为程序二进制文件或使用 ILSpy 或 Red Gate 的 .NET Reflector 等工具对程序进行逆向工程并将其拆分为组成部分(假设代码没有被混淆)——一个提供批处理的服务 DLL,以及当您想要交互式运行程序时的 GUI。然后可以重新使用服务 DLL(如@CodeCaster 所说)通过您将创建的 WCF 服务以“批处理”模式运行逻辑,同时避免与运行当前程序所需的桌面权限进行讨厌的交互图形用户界面。

这并不是一个完美的答案(如果有答案的话),但我希望它有所帮助。

于 2013-05-28T13:08:40.217 回答