创build一个服务或后台应用程序?

好的,所以我知道如何编写一个服务和后台应用程序,我正在寻找更多的一般意见,因为这是一个奇怪的用例,因为我没有find这个在线的例子给予我指导。

基本上我遇到的问题是我有一个服务器(一个应用程序,而不是一个Web服务器),其中容纳了我所有的应用程序逻辑和一组客户端,可以发送消息到服务器做事情。

显然,客户端是传统的UI应用程序。 问题是服务器应该是…

它不需要GUI,启动时,机器上只能有一个版本。 另一方面,只有至less有一个客户端才应该运行,否则应该closures。

我可能会过度思考,但是我应该将这个服务还是由第一个客户端实例化的后台应用程序?

我参考的东西是: Windows服务与Windows应用程序 – 最佳实践

使用Windows服务。 它将在您的服务器启动并开始运行直到服务器关闭时启动。

没有客户时,无需关闭。 如果应用程序没有做任何事情,只是等待一个新的连接的套接字,那么它将占用非常少量的资源:套接字和一些内存。

另外,如果你关闭你的服务,当客户想要连接时,你将使用什么机制来重新启动它?

我自己有一个类似的问题,我通过编写一个Windows服务,这是一个自我托管的Web API应用程序来解决它。

有关说明,请参阅我的答案。

与自托管的WCF不同的是,它非常高效,它不会随时崩溃,它为您提供了一个标准接口:HTTP,JSON(或者XML,如果您愿意的话)和(如果您需要的话;您可以使用)REST。

使用Windows服务,以便服务器始终以一致的上下文运行。

配置服务,以便客户端可以根据需要启动它:

wchar_t sddl[] = L"D:" L"(A;;CCLCSWRPWPDTLOCRRC;;;SY)" // default permissions for local system L"(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)" // default permissions for administrators L"(A;;CCLCSWLOCRRC;;;AU)" // default permissions for authenticated users L"(A;;CCLCSWRPWPDTLOCRRC;;;PU)" // default permissions for power users L"(A;;RP;;;IU)" // added permission: start service for interactive users ; PSECURITY_DESCRIPTOR sd; ConvertStringSecurityDescriptorToSecurityDescriptor(sddl, SDDL_REVISION_1, &sd, NULL); SetServiceObjectSecurity(service, DACL_SECURITY_INFORMATION, sd); 

您可能需要稍微调整ACL以满足您的确切需求。 请注意,为简单起见,错误检查已被排除。

客户可以使用StartService功能根据需要启动服务。