4

我正在尝试超出服务器的时间。

首先,我尝试过:

string URL = "http://google.com"; 
System.Net.HttpWebRequest rq2 = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(URL);
System.Net.HttpWebResponse res2 = (System.Net.HttpWebResponse)rq2.GetResponse();
DateTime xd = rq2.Date;

但这很慢,而且不包含毫秒。

然后我发现,我实际上可以从目标服务器使用的 ntp 服务器获取服务器时间。

 InternetTime.SNTPClient sntp = new InternetTime.SNTPClient("time-b.timefreq.bldrdoc.gov");
 sntp.Connect(false); // true to update local client clock
 DateTime dt = sntp.DestinationTimestamp.AddMilliseconds(sntp.LocalClockOffset);
 string timeStampNow = dt.ToString("dd/MM/yyyy HH:mm:ss.fff");

它工作得很好,但是,我不确定我的目标服务器是否使用 ntp 服务器,如果是,我不知道如何找到它。我花了很多时间研究,所以我决定在这里问。

编辑2:我无权访问该服务器(除了访问它的 www 页面),我知道该服务器正在使用Microsoft-IIS/7.5 web server

4

1 回答 1

3

没有办法可靠地获得比响应标头中返回的分辨率更高的随机 HTTP 服务器时间。正如您所发现的,这仅精确到秒。这不是当前时间,而是服务器填充标头的时间。您不知道是请求进入的时间,响应发送的时间,还是某个愚蠢的程序员为了让您的生活变得困难而塞进标头的随机时间。你只能说,“这是服务器报告的时间。”

即使您知道有问题的服务器从哪个 NTP 服务器获取时间,并且假设您可以访问该服务器,从它获取时间也不会为您提供服务器时间的准确值。服务器通过 NTP 定期更新其时钟,但这可能是每天、每周、每月或“只要管理员决定”。NTP 服务器的时间不会准确反映特定服务器的时间。在一般情况下,当然不在毫秒范围内。如果服务器在一段时间内没有将其时钟与 NTP 服务器同步,甚至可能在几分钟内都不会。

顺便说一句,如果您要查找的只是服务器返回的时间,那么您可能应该在可能的情况下执行 HEAD 请求。但是你也必须支持执行 GET 请求,因为许多服务器会返回 405 错误以响应 HEAD 请求。

于 2013-03-01T19:32:02.757 回答