2016-11-26 40 views
1

我正在Unity上开发一款游戏,每2小时需要重置玩家的生命,并避免作弊我试图使用互联网时间。为此,我在C#上使用了一个简单的方法从microsoft.com获取DateTime。问题是,有时连接失败,我希望它发生这种情况时返回一个布尔,所以我可以得到System.DateTime.Now,并尽快连接可用时再次检查Internet时间。我尝试了一些东西,但没有奏效。这里是我使用的代码:当连接失败时,让HttpWebRequest.GetResponse()返回一个值

public DateTime GetInternetTime() 
    { 
     var myHttpWebRequest = (HttpWebRequest)WebRequest.Create("http://www.microsoft.com"); 
     myHttpWebRequest.Timeout = 5000; 
     myHttpWebRequest.ReadWriteTimeout = 5000; 
     var response = myHttpWebRequest.GetResponse(); 

     if (response == null) 
     { 
      dateTime = DateTime.Now; 
      connecionFailed = true; 
     } 
     string todaysDates = response.Headers["date"]; 
     dateTime = DateTime.ParseExact(todaysDates, "ddd, dd MMM yyyy HH:mm:ss 'GMT'", CultureInfo.InvariantCulture.DateTimeFormat, DateTimeStyles.AssumeUniversal); 
     connecionFailed = false; 
     return dateTime; 
    } 

请帮忙!我真的被困在这!

+0

请解释“连接失败” - 你得到了什么确切的错误信息,以及代码行。 – PhillipH

+0

这是一款Android游戏,有时用户无法访问互联网,或者只是超时。发生这种情况时,控制台会抛出:WebException:请求超时System.net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)。我想知道的是当用户无法访问互联网或者超时时如何获取{connectionFailed = true}。 – ronald677br

回答

2

发生错误时,GetResponse引发异常。例如,如果主机无法解析。所有你需要的是抓住它并且在它之后采取适当的行动。

在下面的代码中,我处理WebException,但在此方法中可能会发生其他一些异常。所以你可以改为一般的Exception类。

public DateTime GetInternetTime() 
    { 
     var myHttpWebRequest = (HttpWebRequest)WebRequest.Create("http://www.microsoft.com"); 
     myHttpWebRequest.Timeout = 5000; 
     myHttpWebRequest.ReadWriteTimeout = 5000; 

     try 
     { 
      var response = myHttpWebRequest.GetResponse(); 
      string todaysDates = response.Headers["date"]; 
      dateTime = DateTime.ParseExact(todaysDates, "ddd, dd MMM yyyy HH:mm:ss 'GMT'", CultureInfo.InvariantCulture.DateTimeFormat, DateTimeStyles.AssumeUniversal); 
      connectionFailed = false; 
     } catch(WebException) 
     { 
      connectionFailed = true; 
      dateTime = DateTime.Now; 
     } 

     return dateTime; 
    } 
+0

谢谢你的帮助!这真的有用! – ronald677br