我编写了一个Windows服务,它使用一个监视各种系统活动的WCF Web服务。 其启动类型设置为“自动”,并在系统启动时按预期启动。在Windows 7 VirtualBox VM中进行一些测试时,我注意到对WCF服务的初始调用是超时的。
在做了一些研究之后,我发现在我的任何一个c#服务中,任何类型的呼叫都可以在没有让系统“安顿下来”的情况下进入互联网,导致系统基本上挂了大约一分钟半。我在其他裸机盒上试过这个,时间有点短,但它仍然会发生。 (可能是我之前没有注意到的原因。) 所以症状似乎是这样。如果我将服务启动设置为自动(延迟启动),则只会立即执行只能访问IP网站的测试服务。如果我使服务自动启动并首先休眠约20秒,它也会立即执行,没有延迟。如果我在启动时立即尝试执行该命令,那么服务就在那里以1:15到1:45。
初步结论是,当我尝试访问网络时,有一个进程正在启动,但我不知道是什么导致了这一点。 我可以将服务设置为延迟启动并完成它,但这会冒犯我正确做事的感觉。
如果它是一个正在开始的服务我想让我的服务依赖于它......等等。 有任何想法吗?
我试图彻底,但这是我的第一个问题。我很乐意提供任何其他细节。感谢。
以下是测试服务OnStart事件:
protected override void OnStart(string[] args)
{
Logging.WriteLog("Starting");
ServiceController sc = new ServiceController("Tcpip");
Logging.WriteLog("TCPIP Status: " +sc.Status.ToString());
sc = new ServiceController("DHCP");
Logging.WriteLog("DHCP Status: " + sc.Status.ToString());
sc = new ServiceController("Dnscache");
Logging.WriteLog("DNS Status: " + sc.Status.ToString());
Logging.WriteLog("Internal IP: " + getInternalIp());
Logging.WriteLog("External IP: " + getExternalIp());
Logging.WriteLog("Stopping");
}
以下是getExternalIP方法的代码:
private string getExternalIp()
{
try
{
string externalIP = "";
try
{
//code hangs here
externalIP = (new WebClient()).DownloadString("http://ipv4.icanhazip.com");
externalIP = (new Regex(@"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"))
.Matches(externalIP)[0].ToString();
}
catch (Exception ex)
{
Logging.WriteLog(ex);
}
return externalIP;
}
catch (Exception ex)
{
Logging.WriteLog(ex);
return null;
}
}
以下是立即开始的输出:
3/16/2017 7:57:08 AM:开始
2017/3/16 7:57:09 AM:TCPIP状态:正在运行
3/16/2017 7:57:09 AM:DHCP状态:正在运行
2017/3/16 7:57:09 AM:DNS状态:正在运行
2017/3/16 7:57:11 AM:内部IP:192.168.2.103
3/16/2017 7:58:30 AM:外部IP:xxx.xxx.xxx.xxx< - 1分钟19秒延迟
3/16/2017 7:58:30 AM:停止
这里是延迟开始输出:
3/16/2017 8:03:39 AM:开始
3/16/2017 8:03:39 AM:TCPIP状态:正在运行
3/16/2017 8:03:39 AM:DHCP状态:正在运行
3/16/2017 8:03:39 AM:DNS状态:正在运行
3/16/2017 8:03:40 AM:内部IP:192.168.2.103
3/16/2017 8:03:40 AM:外部IP:xxx.xxx.xxx.xxx< - 无延迟
3/16/2017 8:03:40 AM:停止
答案 0 :(得分:0)
在您的应用中使用Async,这样主线程就不会停止。但是,由于调用外部网站可能需要一些时间来解决,因此这将打破首先显示“停止”然后IP的一致性。我建议打电话给ExternalIP
WebClient client = new WebClient();
client.DownloadDataCompleted += DownloadDataCompleted;
client.DownloadDataAsync(new Uri("http://ipv4.icanhazip.com"));
static void DownloadDataCompleted(object sender,
DownloadDataCompletedEventArgs e)
{
byte[] raw = e.Result;
string data = System.Text.Encoding.Default.GetString(raw);
data = (new Regex(@"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"))
.Matches(data)[0].ToString();
Logging.WriteLog("External IP: " + data);
}