好的,所以我知道如何编写服务和后台应用程序,我正在寻找更多的一般意见,因为这是一个奇怪的用例,因为我无法找到这个例子在线给我指导。
基本上我遇到的问题是我有一个服务器(一个应用程序,而不是一个Web服务器),它包含我所有的应用程序逻辑,以及一组可以向服务器发送消息来执行操作的客户端。
显然,客户端是传统的UI应用程序。问题是服务器应该是什么......
它不需要GUI,当它启动时,机器上应该只有一个版本。另一方面,它应该只在至少有一个客户端运行,否则它应该关闭。
我可能会过度思考它,但是我应该将其作为第一个客户端实例化的服务或后台应用程序吗?
我引用的内容如下:Windows Service vs Windows Application - Best Practice
答案 0 :(得分:2)
使用Windows服务。它将在您的服务器启动时启动并继续运行,直到服务器关闭。
没有客户时无需关闭。如果应用程序只是在套接字上等待新连接,那么它将占用非常少量的资源:套接字和一些内存。
此外,如果您关闭服务,当客户想要连接时,您将使用什么机制重新启动它?
答案 1 :(得分:1)
我自己遇到了类似的问题,我通过编写一个自助托管的Web API应用程序来解决它。
有关说明,请参阅我的回答here。
它非常高效,与自托管WCF不同,它不会不时崩溃,它为您提供标准接口:HTTP,JSON(如果您愿意,还可以是XML)和(如果您需要它;您可以使用) REST。
答案 2 :(得分:0)
使用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
功能根据需要启动服务。