2

我想把我拥有的程序变成服务,这样我就可以在不记录的情况下使用它。基本上它的作用是使用 SSH 将指定的文件夹备份到指定的位置。但是我遇到的问题是我不知道如何告诉它这些项目。我只知道如何启动、停止和运行只有一个带参数的整数的自定义命令。

我怎样才能做到这一点?

Windows 服务,而不是 Web 服务

编辑:它备份的文件夹不会保持一致,并且会在每次运行时更新

4

10 回答 10

6

您可以使用 ServiceController 类实例化您的服务并传递命令行参数。

using (ServiceController serviceController = new ServiceController(serviceName))
{
   string[] args = new string[1];
   args[0] = "arg1";
   serviceController.Start(args);
}

当 Windows 启动服务时,“arg1”将在 main() 中作为常规命令行参数使用。

于 2009-01-19T19:19:54.910 回答
2

我看到您(或某人)对 Sebastian Sedlak 的回答投了反对票,因为他提到在 Windows 服务中托管 WCF 服务。你的回复是

It's in nice bold lettering in the question. Not a Web Service, therefor WCF is out of the question

我想你误解了他的意思。他不是在谈论Web 服务。他正在谈论您的Windows 服务中托管WCF 服务。

这与同一件事相去甚远。您可以在任何 Windows(窗体/控制台/服务)应用程序中托管 WCF 服务。这样做的目的是,应用程序可以通过其内部 WCF 服务进行通信,就像您可以与 Web 服务进行通信一样您也可以IIS 中托管 WCF 服务,顺便说一句,这将使它们“Web 服务”,在您所指的意义上)。

在 Windows 服务中,这意味着您可以向它发送任何命令,还可以从它获取您想要的任何信息 - 在它运行时。

事实上,我现在正在做一个项目,这是一个 Windows 服务,我需要能够在运行时联系它并将命令传递给它 - 并从中获取信息。例如,我希望能够告诉它在哪里存储某些东西,记录什么,让它重置/重新启动 - 并轮询它以获取状态消息。我通过在 Windows 服务中托管 WCF 服务来做到这一点。该 WCF 服务公开了一组方法,在我的例子中包括接收命令和返回状态信息。因此,当Windows 服务运行时,我可以通过其内置的WCF 服务联系它(甚至远程)并告诉它要做什么。

这是一个非常容易实现的事情,并且在 Windows 服务的情况下,可以为您提供比通过基本标准命令更丰富的服务接口。


但是,您指定希望 Windows 服务在每次启动时都接收其文件夹设置,这使得这种被动设置不太理想(因为在您将正确的文件夹传递给它之前它无法执行任何操作)。

解决这个问题的一种方法(使用托管的 WCF 服务)是让 Windows 服务一直运行即自动启动)。它的默认状态是空闲的。然后,您可以向它发出“开始处理”命令,为其提供要处理的正确文件夹(通过调用相应的 WCF 服务方法)。类似地,WCF 服务将公开为您提供应用程序状态(当前文件夹、进度、忙碌/空闲等)的方法。处理完成后,它将返回空闲状态,等待为其提供下一组文件夹。

这样做会使远程控制变得非常容易——你甚至可以为它制作一个在线管理面板,可以从任何地方访问。

于 2010-10-31T01:29:33.113 回答
2

问题在于,虽然传入参数并不困难,但当机器重新启动并且 Windows 尝试重新启动服务时,这些参数不存在。它们仅在有人从命令行启动服务时才存在。

例如。我有一个托管 WCF 服务的 Windows 服务。我希望用户能够为 WCF 服务指定一个非默认端口号来监听。他们通过像这样启动 Windows 服务来做到这一点...... MyService -port:xxxxx

哪个工作正常,直到服务器重新启动,然后 Windows 重新启动 MyService(但没有参数)并且 wcf 服务默认为原始端口 #

于 2011-08-30T17:05:31.267 回答
1

是否可以使用配置文件来指定这些项目?

于 2009-01-19T18:50:03.020 回答
1

将服务的启动参数存储在注册表中:然后,当注册表启动时,它应该从注册表中读取其启动参数。

于 2009-01-19T18:51:16.700 回答
1

任何服务都能够在启动时接收命令行参数。

于 2009-01-19T18:51:39.040 回答
1

Windows 服务与任何其他服务一样具有可执行文件。我相信您可以编写它来接受命令行参数并在 Windows 服务配置中指定这些参数。您也可以让它读取配置文件。如果您使用的是 .NET,则框架中有配置文件类。

于 2009-01-19T18:53:12.703 回答
1

为什么不在 Windows 服务中托管一个 WCF 服务来获得这样的“管理”功能呢?(远程也可以)

于 2009-01-19T19:26:49.763 回答
1

回复:配置文件。

当然可以使用配置文件。并且可以在服务运行时更改文件。

如果配置文件实际上发生了变化,这将是一个很好的解决方案。我所有的服务都使用一个 XML 配置文件,封装在一个类中以便于重用。

包装器可以选择使用 fileMonitor 监视 XML 文件的更改,可选择自动刷新配置文件的内容,最后向服务类引发事件。然后,该服务可以根据需要选择“重置”自身以将新值合并到 XML 配置文件中。

将配置放入注册表有几个问题:

  • 安全性(即:安装程序被授予访问权限),取决于使用的树
  • 该服务将不知道更改
  • 可移植性 - 尽管安装应该设置注册表设置很小

XML 文件易于复制、编辑、共享、查看和理解的地方。加入一些好的 COMMENT 块和详细的 XSD 文件,它也成为好的文档的来源。

查看 XPath 以便在 XML 文件中轻松导航和提取值。

0.02 美元 ... 大卫 ...

于 2011-10-01T01:51:32.153 回答
0

关于 app.config 文件 - 我很确定您的服务会在我以这种方式编写所有 Windows 服务时读取和使用这些文件;)所以只需将 app.config 中所需的所有内容放在“应用程序”下(不是用户)并在“InstallUtil”服务所在的文件夹中编辑“yourname.exe.config”。

于 2011-08-30T17:11:36.143 回答