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

本文关键字:服务 后台 应用程序 一个 创建 | 更新日期: 2023-09-27 18:17:42

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

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

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

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

我可能想得太多了,但是我应该把它作为一个服务还是一个由第一个客户端实例化的后台应用程序?

我引用的东西像:Windows服务与Windows应用程序-最佳实践

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

使用Windows服务。它将在服务器启动时启动,并一直运行直到服务器关闭。

当没有客户端时,不需要关闭。如果应用程序什么都不做,只是等待套接字的新连接,那么它将占用非常少的资源:套接字和一些内存。

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

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

请参阅我的回答。

它真的很高效,不像自托管的WCF,它不会时不时崩溃,它为你提供了一个标准的接口:HTTP, JSON(或XML,如果你喜欢)和(如果你需要它;

使用Windows Service,使服务器始终运行在一致的上下文中。

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

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函数启动服务