1

我因为 OpenDNS 和其他服务(即:roadrunner)而感到沮丧,即使您输入任何无效的 url,现在总是返回 ping,即:lkjsdaflkjdsjf.com --- 我已经创建了供我自己使用的软件,可以 ping 一个 url 来验证该网站是否已启动。这不再有效。有人对此有任何想法吗?

要求:

  1. 它应该适用于任何有效的网站,即使是我无法控制的网站
  2. 它应该能够从任何可以访问 Internet 的网络运行

我将不胜感激听到其他人现在如何处理这个问题。我想补充一下,我试图在 c# 中使用 System.Net 来做到这一点

非常感谢你:-)

新增功能:寻找一个我可以购买并在我的 Windows 机器上运行的解决方案,或者在 c# 中编程。:-)

更新:

非常感谢大家的回答。最终我最终通过这样做创建了一个解决方案:

  1. 创建一个从 url 下载指定页面的简单网络客户端(可能更改为仅标题或使用它来通知页面更改)
  2. 读取 xml 文件,该文件仅列出要检查的站点/页面的完整 url
  3. 创建了一个 Windows 服务来托管解决方案,以便它可以恢复服务器重新启动。
  4. 出错时,将向定义的收件人列表发送电子邮件和短信
  5. 大多数值(interval、smtp、to、from 等)都在 .config 中定义,以便于更改

稍后我将采纳您的一些建议来添加“功能”,其中包括:

  • 用于实时监控的 AJAX 页面。我将使用 WCF 从 asp.net 页面连接到现有的 windows 服务
  • 仅下载标题(带有页面更改比较选项)
  • 更可配置(即:在通知之前重试失败)
4

10 回答 10

4

Wget是一个不错的选择。它不仅会检查机器是否处于活动状态,还会检查 HTTP 服务器是否正在接受连接。

于 2008-10-13T22:22:36.993 回答
2

要查看服务是否启动,您不仅应该 ping,而且最好拥有能够访问服务(例如网站)并获得有效响应的脚本。我过去使用过 What's Up Gold,而不是自己编写。我喜欢这样的产品的所有功能。例如在服务关闭时向我发送一个页面。

于 2008-10-13T22:24:20.717 回答
2

您可以创建一个简单的网页,其中包含网站的地址栏和一些使用 AJAX 访问网站的 javascript。如果您在异步回调中收到除 200 以外的任何 HTTP 响应,则该站点无法正常工作。

<html>
  <head>
     <script language="javascript" type="text/javascript">
     <!--
        var ajax = new XMLHttpRequest();

        function pingSite() {
           ajax.onreadystatechange = stateChanged;
           ajax.open('GET', document.getElementById('siteToCheck').value, true);
           ajax.send(null);
        }

        function stateChanged() {
           if (ajax.readyState == 4) {
              if (ajax.status == 200) {
                 document.getElementById('statusLabel').innerHTML = "Success!";
              }
              else {
                 document.getElementById('statusLabel').innerHTML = "Failure!";
              }
           }
        }
     -->
     </script>
  </head>

  <body>
     Site To Check:<br />
     <input type="text" id="siteToCheck" /><input type="button" onclick="javascript:pingSite()" />

     <p>
        <span id="statusLabel"></span>
     </p>
  </body>

这段代码取决于浏览器不是 IE,我还没有测试过,但它应该给你一个非常好的主意。

于 2008-10-13T22:27:40.400 回答
1

作为记录,lkjsdaflkjdsjf.com 是一个主机名(目前尚未向任何人注册)。ping 不适用于 URL,ping 可用于主机名。使用域名系统查找主机名。当主机名未注册时,DNS 应该会失败。

问题是某些服务(显然是您的 ISP,肯定是 OpenDNS)不会使未注册主机名的 DNS 请求失败。相反,它们会返回其网络上的主机的 IP 地址,该地址会为任何 http 请求提供搜索页面。

您似乎想知道两件事:这个名字是真实的(也就是说,是否有一个使用这个名字的主机注册到某个实际的机器上)?那台机器运转正常吗?

如果您已经知道有问题的名称是真实的(例如,您想知道 www.google.com 是否已启动),那么您可以使用 ping,因为您知道该名称将解析为真实地址(ISP 可以'不要返回他们的 IP 以获得注册名称),你只会测量那台机器是否在运行。

如果您不知道该名称是否真实,那么问题就更难了,因为您的 ISP 正在向您的 DNS 请求返回虚假数据。这里唯一的解决方案是找到一个不会对未解析名称撒谎的 DNS 服务器。

我能想到区分您的 ISP 的虚假记录和真实记录的唯一方法是对您返回的 IP 进行反向查找,看看该 IP 是否在您的 ISP 网络中。这个技巧的问题在于,如果 ISP 没有该 IP 的反向 DNS 信息,您将不知道是 ISP 还是只是一些没有正确配置他的 DNS 的笨蛋(我犯了很多错误过去的时间)。

我确信还有其他技术,但 DNS 位于一切之下的事实使得处理这个问题变得困难。

于 2008-10-13T22:44:35.263 回答
1

不要直接知道 c# 中的任何现成选项,但如果没有几个可用的选项,我会非常惊讶。

几年前我写过类似的东西,不再有代码了,因为它属于其他人,但基本思想是使用 WebClient 访问域默认页面,并检查 http 状态代码 200。

然后,您可以围绕此操作的成功或失败连接任何通知逻辑。

如果带宽是一个问题,您可以将其修剪为仅使用 HEAD 请求。

对于您控制的更复杂的站点,您可以连接一个运行状况监控页面,该页面在发送响应之前进行一些更深入的测试,例如数据库连接是否正常等。

通常,在端口 80 上死机的机器仍会响应 ping,因此测试端口 80(或您感兴趣的任何其他端口)将是一种更可靠的方法。

于 2008-10-13T23:42:21.607 回答
0

我发现 ping 非常不可靠,因为您必须跳过所有跃点,而介于两者之间的东西总是会干扰。

尝试打开与 Web 服务器的 http 连接可能是最好的方法。

于 2008-10-13T22:24:40.733 回答
0

如果您有 cygwin 可用,您可以尝试运行“httping”或

http://freshmeat.net/projects/httping/

于 2008-10-13T22:31:11.157 回答
0

据我所见,这里的问题是 OpenDNS 将无效域解析回它们自己以将您转发到接近您所追求的东西(因此,如果您输入错误 ggooggllee.com,您最终会通过从OpenDNS 服务器)。(如我错了请纠正我)

如果是这种情况,您应该能够检查您解析的IP是否== OpenDNS的任何IP?没有更多的 ping - 没有协议 (HTTP) 级别的东西 - 只是检查例外情况?

于 2008-10-13T23:00:54.670 回答
0

如果您倾向于 sys-admin 解决方案而不是编程解决方案,您可以安装一个本地名称服务器,并告诉它除了 NS 记录之外不接受任何内容用于仅授权区域。这是我(我假设互联网上的其他人)在网络解决方案/威瑞信上次破坏时使用的修复程序。我在几台本地机器上安装了 BIND,告诉我的 DHCP 服务器将这些地址作为本地名称服务器分发,并为我关心的每个仅委托区域设置如下内容:

zone "com" { type delegation-only; };
zone "net" { type delegation-only; };

想到这一点,我认为这可能会在以后的 BIND 版本中默认打开。作为一个额外的好处,您往往会获得比大多数 ISP 提供的更稳定的 DNS 解析,您可以控制自己的缓存、一些补丁,并且您不必依赖您的 ISP 来修复最新的 DNS 攻击等。

于 2008-10-13T23:08:26.090 回答
0

我喜欢CALM这类东西,因为它记录到数据库并提供电子邮件通知以及状态仪表板

您可以在网站上设置一个测试页面并定期在其上执行 GET 以接收“真实”结果(一切正常)或通过电子邮件发送给您的错误消息结果

警告:我是 CALM 的作者

于 2008-10-14T01:02:20.213 回答