我正在做一个Windows服务,启动时必须有网络连接。代码是 c# 的,我将服务设置为依赖于其他人
serviceInstaller.ServicesDependedOn = new string[] { "Tcpip" };
我可以看到在 Windows 服务管理器上正确输入了依赖项,但重新启动后我的服务无法启动,因为它无法连接到网络,在主机获取 IP 后,服务正确启动。
我尝试使用“Tcpip”和“Dhcp”服务。应该依赖哪个服务?
服务需要网络连接,因为其目的是通过 ssh 安装单元
谢谢!
我们一直在让我们的服务,依赖于网络开始启动,依赖于“Server”服务。它的实际名称是“LanmanServer”。这对我们来说一直运行良好。如果你看一下它的描述,它会说:
支持此计算机通过网络进行文件、打印和命名管道共享。如果该服务停止,这些功能将不可用。如果禁用此服务,任何明确依赖它的服务都将无法启动。
我们的想法是,如果计算机准备好执行这些功能,那么就必须启动网络。
取决于@user957902在接受的答案中提到的
LanmanServer
在Windows Server 2019和2022上不起作用(好吧,至少对我和其他一些人来说)。
在 Windows Server 2019 和 2022 中,我认为不可能使用服务依赖项来解决此问题。
编辑:最好使用
NetworkListManager
而不是 WinInet
,因为根据 MS 文档 - 不建议使用 WinInet
(正如 @JanPaulmann 注意到的那样)。下面的代码使用WinInet,因此不建议使用。我不会在这里使用 NetworkListManager
发布另一个代码,因为这个问题专门询问了有关 Windows 服务依赖项的问题,所以请参阅 对另一个问题的回答 - 它包含使用 NetworkListManager
的漂亮代码
我在 Windows 服务中通过等待互联网连接建立来解决了这个问题,使用以下代码(只需调用
WaitUntilInternetConnectionAvailable
方法):
public static class WinINet
{
[DllImport("wininet.dll")]
public static extern bool InternetGetConnectedState(out int description, int reservedValue);
}
...
public static bool WaitUntilInternetConnectionAvailable(TimeSpan timeout, TimeSpan checkEvery)
{
var sw = Stopwatch.StartNew();
while (sw.Elapsed < timeout)
{
if (IsInternetConnectionAvailable())
{
return true;
}
Thread.Sleep(checkEvery);
}
return false;
}
public static bool IsInternetConnectionAvailable()
{
return WinINet.InternetGetConnectedState(out _, 0);
}
我使用“Tcpip”、“Dhcp”、“Dnscache”。对我来说工作正常。