【问题标题】:What is the accepted pattern for an application that can be run as a service or as a console application可以作为服务或控制台应用程序运行的应用程序的可接受模式是什么
【发布时间】:2009-06-24 11:12:39
【问题描述】:

我有一个项目作为 Windows 服务部署到生产环境。然而,出于本地开发目的,将其作为控制台应用程序运行会很有用。目前,我有一个名为 ReportingHost 的类,它提供了我的核心功能,还有一个名为 ReportingServiceHost 的类,它继承自 ServiceBase 并允许我将应用程序作为服务运行。在我的 ReportingServiceHost 上还有一个带有 main 方法的程序类调用 ServiceBase.Run

我想我需要编写一个ReportingConsoleHost 类,让我可以在控制台中运行该功能。然后我需要修改我的Main 以响应命令行开关并选择其中一个。这是我遇到的两个问题。

我查看了this 并尝试使用该代码,但我的应用程序立即退出,它不显示控制台窗口,并且在关闭前不等待 Enter。

部分问题是我对这些事情的工作原理没有深入的了解。一种用于拆分我的功能的明确模式,我运行该功能的两种不同方式,以及基于命令行参数选择其中一种方式的主要方法是我希望实现的。

【问题讨论】:

    标签: c# wcf windows-services


    【解决方案1】:

    我怀疑您的测试项目被配置为 Windows exe,而不是控制台 exe。使用 windows exe Console.ReadLine 会立即返回。

    要让控制台 exe 同时作为服务和命令行工作,请将其作为服务项目启动(在 Visual Studio 中) - 并在 Environment.UserInteractive 上添加检查 - 即

    static void Main() {
        if(Environment.UserInteractive) {
            // code that starts the listener and waits on ReadLine
        } else {
            // run the service code that the VS template injected
        }
    }
    

    您当然也可以使用命令行开关。我在microsoft.public.dotnet.languages.csharp 上有一个示例,它充当:

    • 安装程序/卸载程序
    • 一项服务
    • 控制台模式应用

    取决于开关

    【讨论】:

    • 要让 VS 在您使用此解决方案按 F5 时为您生成控制台窗口,您必须更改项目属性,在应用程序选项卡下设置输出到控制台应用程序。据我所知,它仍然可以让它作为服务自行安装。
    【解决方案2】:

    我之前通过实现一个普通的 Windows 服务(通过从 ServiceBase 派生)来做到这一点,但在 main 方法中进行检查以检查命令行参数。

    如果args包含/console,则启动控制台版本,否则启动服务。

    类似这样的:

    internal class MyService : ServiceBase
    {
        internal static void Main(string[] args)
        {
            if (args.Length == 0)
            {
                // run as a service....
                ServiceBase[] servicesToRun = new ServiceBase[] {new MyService()};
                Run(servicesToRun);
            }
            else
            {
                // run as a console application....
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      我的建议?将服务的所有逻辑放在单独的程序集中。 (类库或 DLL。)然后创建一个项目作为服务,它引用您的类库并将代码用作服务。创建第二个控制台项目,该项目也引用您的类库,但可以将其作为控制台应用程序使用。 您最终会在您的解决方案中拥有三个不同的项目,但它确实允许您将事情分开。实际上,这也可以将您的服务扩展到其他几种形式。例如,您可以创建第 4 个项目作为 Web 服务,从而从客户端系统上的 Web 浏览器调用您的服务。由于软件逻辑与使用逻辑分离,因此您可以对其进行大量控制。

      请注意,与控制台应用程序相比,服务可能会受到更多限制。通常,服务默认没有网络访问权限,没有分配给它们的监视器来显示错误消息,并且通常使用有限的用户帐户或系统帐户运行。您的服务可能会作为控制台工作,但会因此而作为服务失败。

      【讨论】:

        【解决方案4】:

        上面已经有两个很好的答案 - 但我想我会发布一个指向 Brian Noyes' Debuggable Self-Host Windows Service Project 博客文章的链接 - 它讨论了 WCF,但应该适用于任何“Windows 服务”。

        最好的是示例代码 - 如果您无法确定上述示例的“适合”位置,请获取完整的项目并查看它是如何工作的。谢谢Brian

        【讨论】:

          猜你喜欢
          • 2011-05-07
          • 2018-12-19
          • 2015-11-03
          • 1970-01-01
          • 1970-01-01
          • 2011-02-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多