2

好的,所以我知道如何编写服务和后台应用程序,我正在寻找更多的一般意见,因为这是一个奇怪的用例,因为我无法在网上找到这样的例子来给出我指导。

基本上我遇到的问题是我有一个包含所有应用程序逻辑的服务器(一个应用程序,而不是 Web 服务器),以及一组可以向服务器发送消息以执行操作的客户端。

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

它不需要图形用户界面,当它启动时,机器上应该只有一个版本。另一方面,它应该只在至少有一个客户端的情况下运行,否则它应该关闭。

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

我引用的内容如下:Windows 服务与 Windows 应用程序 - 最佳实践

4

3 回答 3

2

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

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

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

于 2013-06-10T20:36:18.993 回答
1

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

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

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

于 2013-06-10T19:47:55.113 回答
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需要使用该功能启动服务。

于 2013-06-14T02:29:01.367 回答