Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C“Windows服务”;暂停“;在引导期间启动系统时_C#_Windows_Wcf_Service_Network Programming - Fatal编程技术网

C# C“Windows服务”;暂停“;在引导期间启动系统时

C# C“Windows服务”;暂停“;在引导期间启动系统时,c#,windows,wcf,service,network-programming,C#,Windows,Wcf,Service,Network Programming,我编写了一个windows服务,它使用一个WCF Web服务来监视各种系统活动。 其启动类型设置为自动,并在系统启动时按预期启动。在Windows7VirtualBox虚拟机上进行测试时,我注意到对WCF服务的初始调用超时 在做了一些研究之后,我发现在我的任何一个c#服务中,在引导后不让系统“稳定”一点的情况下对互联网进行任何形式的呼叫,都会导致系统基本上挂起大约一分半钟。我在其他裸露的金属盒子上试过这个,时间稍微短了一点,但还是发生了。 (可能是我以前没有注意到的原因。) 所以症状似乎是这样的

我编写了一个windows服务,它使用一个WCF Web服务来监视各种系统活动。 其启动类型设置为自动,并在系统启动时按预期启动。在Windows7VirtualBox虚拟机上进行测试时,我注意到对WCF服务的初始调用超时

在做了一些研究之后,我发现在我的任何一个c#服务中,在引导后不让系统“稳定”一点的情况下对互联网进行任何形式的呼叫,都会导致系统基本上挂起大约一分半钟。我在其他裸露的金属盒子上试过这个,时间稍微短了一点,但还是发生了。 (可能是我以前没有注意到的原因。) 所以症状似乎是这样的。如果我将服务启动设置为自动(延迟启动),则只访问IP网站的测试服务将立即执行,不会延迟。如果我让服务自动启动并先休眠约20秒,它也会立即执行,不会延迟。如果我尝试在启动时立即执行命令,服务将在那里停留1:15到1:45

初步结论是,当我尝试访问网络时,有一个过程正在启动,但我无法确定是什么导致了这一点。 我可以将服务设置为延迟启动并完成它,但这违背了我正确操作的感觉

如果这是一个正在启动的服务,我想让我的服务依赖于它…等等。 有什么想法吗

我想说得很透彻,但这是我的第一个问题。我很乐意提供更多的细节。谢谢

以下是测试服务启动事件:

    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");
    }
       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;
        }
    }
下面是getExternalIP方法的代码:

    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");
    }
       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;
        }
    }
这是立即启动的输出:

    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");
    }
       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;
        }
    }
2017年3月16日上午7:57:08:开始

2017年3月16日上午7:57:09:TCPIP状态:运行

2017年3月16日上午7:57:09:DHCP状态:正在运行

2017年3月16日上午7:57:09:DNS状态:正在运行

2017年3月16日上午7:57:11:内部IP:192.168.2.103


2017年3月16日上午7:58:30:外部IP:xxx.xxx.xxx.xxx在应用程序中使用异步,以便主线程不会停止。但是,这将破坏您先显示“停止”,然后显示IP的一致性,因为对外部网站的呼叫可能需要一些时间才能解决。我建议打电话给警察

  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);                            
}

在应用程序中使用异步,以便主线程不会停止。但是,这将破坏您先显示“停止”,然后显示IP的一致性,因为对外部网站的呼叫可能需要一些时间才能解决。我建议打电话给警察

  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);                            
}
我经常对内部服务使用自动(延迟启动),以允许低级服务首先启动。或者,您可以进行研究以准确确定您的服务需要哪些服务,并将它们配置为服务的依赖项。我经常对内部服务使用自动(延迟启动),以允许低级服务首先启动。或者,您可以进行研究以准确确定您的服务需要哪些服务,并将它们配置为服务的依赖项。