【问题标题】:Check Internet connection C#检查 Internet 连接 C#
【发布时间】:2023-03-31 19:14:01
【问题描述】:

我已经构建了一个 dll,如果我们有互联网则返回 true,如果没有则返回 false。 我们执行以下操作: 1.调用ping我们的服务器,如果失败则尝试下一步 2. 向我们的 WCF API 之一调用 get http 请求,http://db.OurDomainName.com/WCFService.svc/GetCurrentTimeUnixFormat

这是在 win 服务中完成的。

在 PC 和某些服务器(windows server 2k R2)中,它可以连续工作好几天没有问题,每 2 分钟我们就会醒来并测试连接。

但是,在 Azure 虚拟机中,它通过了几次然后就失败了,为什么?

我们在网络浏览器中尝试过: http://db.OurDomainName.com/WCFService.svc/GetCurrentTimeUnixFormat 看看结果,我们每秒点击刷新 2 分钟,看到它从来没有失败过。

但是从我们的 WinService 做同样的事情,几次之后它就失败了,开始获取超时!!!!

我们不知道为什么,看起来像防火墙,但是为什么刷新时它不阻止浏览器!!!

这是我们在 .Net 中所做的:

      private static bool IsConnectedToInternetHttpRequest(string url = "http://db.OurDomainName.com/WCFService.svc/GetCurrentTimeUnixFormat")
        {

//GET http://db.OurDomainName.com/WCFService.svc/GetCurrentTimeUnixFormat HTTP/1.1
//Host: db.tako.com
//Connection: keep-alive
//Cache-Control: max-age=0
//Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
//User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.76 Safari/537.36
//Accept-Encoding: gzip,deflate,sdch
//Accept-Language: en-US,en;q=0.8

            try
            {
                var request = (HttpWebRequest)WebRequest.Create(url);
                request.Timeout = (int)new TimeSpan(0, 0, 30).TotalMilliseconds;
                request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
                request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.76 Safari/537.36";
                request.CachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.Refresh);
                request.KeepAlive = true;

                var response = (HttpWebResponse)request.GetResponse();

                if (response.StatusCode == HttpStatusCode.OK)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch (Exception )
            {
                return false;
            }
        }

【问题讨论】:

    标签: c# wcf http azure xmlhttprequest


    【解决方案1】:
    public Contructor(){
    System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged += new System.Net.NetworkInformation.NetworkAvailabilityChangedEventHandler(NetworkChange_NetworkAvailabilityChanged);
    }
    
    private void NetworkChange_NetworkAvailabilityChanged(object sender, System.Net.NetworkInformation.NetworkAvailabilityEventArgs e)
            {
    
                    if (e.IsAvailable)
                    {
                        //connected
                    }
                    else
                    {
                       //disconnected
                    }
    
            }
    

    【讨论】:

      【解决方案2】:
      [DllImport("wininet.dll", SetLastError = true)]
      static extern bool InternetCheckConnection(string lpszUrl, int dwFlags, int dwReserved);
      
      const int  FLAG_ICC_FORCE_CONNECTION = 1;
      bool internetStatus = false;
      
      if (InternetCheckConnection("http://www.google.com", FLAG_ICC_FORCE_CONNECTION, 0) ||
          InternetCheckConnection("http://www.microsoft.com", FLAG_ICC_FORCE_CONNECTION, 0) ||
          InternetCheckConnection("http://www.facebook.com", FLAG_ICC_FORCE_CONNECTION, 0))
      {
         internetStatus = true;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-03
        • 1970-01-01
        • 1970-01-01
        • 2018-10-09
        • 1970-01-01
        • 2015-11-18
        • 2015-02-23
        相关资源
        最近更新 更多