我想把我拥有的程序变成服务,这样我就可以在不记录的情况下使用它。基本上它的作用是使用 SSH 将指定的文件夹备份到指定的位置。但是我遇到的问题是我不知道如何告诉它这些项目。我只知道如何启动、停止和运行只有一个带参数的整数的自定义命令。
我怎样才能做到这一点?
Windows 服务,而不是 Web 服务
编辑:它备份的文件夹不会保持一致,并且会在每次运行时更新
我想把我拥有的程序变成服务,这样我就可以在不记录的情况下使用它。基本上它的作用是使用 SSH 将指定的文件夹备份到指定的位置。但是我遇到的问题是我不知道如何告诉它这些项目。我只知道如何启动、停止和运行只有一个带参数的整数的自定义命令。
我怎样才能做到这一点?
Windows 服务,而不是 Web 服务
编辑:它备份的文件夹不会保持一致,并且会在每次运行时更新
您可以使用 ServiceController 类实例化您的服务并传递命令行参数。
using (ServiceController serviceController = new ServiceController(serviceName))
{
string[] args = new string[1];
args[0] = "arg1";
serviceController.Start(args);
}
当 Windows 启动服务时,“arg1”将在 main() 中作为常规命令行参数使用。
我看到您(或某人)对 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 服务将公开为您提供应用程序状态(当前文件夹、进度、忙碌/空闲等)的方法。处理完成后,它将返回空闲状态,等待为其提供下一组文件夹。
这样做会使远程控制变得非常容易——你甚至可以为它制作一个在线管理面板,可以从任何地方访问。
问题在于,虽然传入参数并不困难,但当机器重新启动并且 Windows 尝试重新启动服务时,这些参数不存在。它们仅在有人从命令行启动服务时才存在。
例如。我有一个托管 WCF 服务的 Windows 服务。我希望用户能够为 WCF 服务指定一个非默认端口号来监听。他们通过像这样启动 Windows 服务来做到这一点...... MyService -port:xxxxx
哪个工作正常,直到服务器重新启动,然后 Windows 重新启动 MyService(但没有参数)并且 wcf 服务默认为原始端口 #
是否可以使用配置文件来指定这些项目?
将服务的启动参数存储在注册表中:然后,当注册表启动时,它应该从注册表中读取其启动参数。
任何服务都能够在启动时接收命令行参数。
Windows 服务与任何其他服务一样具有可执行文件。我相信您可以编写它来接受命令行参数并在 Windows 服务配置中指定这些参数。您也可以让它读取配置文件。如果您使用的是 .NET,则框架中有配置文件类。
为什么不在 Windows 服务中托管一个 WCF 服务来获得这样的“管理”功能呢?(远程也可以)
回复:配置文件。
当然可以使用配置文件。并且可以在服务运行时更改文件。
如果配置文件实际上发生了变化,这将是一个很好的解决方案。我所有的服务都使用一个 XML 配置文件,封装在一个类中以便于重用。
包装器可以选择使用 fileMonitor 监视 XML 文件的更改,可选择自动刷新配置文件的内容,最后向服务类引发事件。然后,该服务可以根据需要选择“重置”自身以将新值合并到 XML 配置文件中。
将配置放入注册表有几个问题:
XML 文件易于复制、编辑、共享、查看和理解的地方。加入一些好的 COMMENT 块和详细的 XSD 文件,它也成为好的文档的来源。
查看 XPath 以便在 XML 文件中轻松导航和提取值。
0.02 美元 ... 大卫 ...
关于 app.config 文件 - 我很确定您的服务会在我以这种方式编写所有 Windows 服务时读取和使用这些文件;)所以只需将 app.config 中所需的所有内容放在“应用程序”下(不是用户)并在“InstallUtil”服务所在的文件夹中编辑“yourname.exe.config”。