【问题标题】:How to determine whether a web application is currently running如何确定 Web 应用程序当前是否正在运行
【发布时间】:2011-05-12 14:29:21
【问题描述】:

我有一个在 IIS 6 下运行的 ASP.NET Web 应用程序,以及另一个负责监视和报告状态的进程。

我想通过监控进程对 Web 应用程序进行采样,以便通过访问 Web 应用程序上的专用处理程序来检查其状态,但是我不想“唤醒” Web 应用程序,以防它未运行。

是否有一个选项可以确定特定的 Web 应用程序当前是否正在运行?如果有这样的选项,我将能够首先检查应用程序是否正在运行,然后才能访问处理程序以检查其状态。

谢谢。

【问题讨论】:

    标签: c# .net asp.net iis-6


    【解决方案1】:

    今年早些时候我不得不为 IIS7 做类似的事情,不确定这是否适用于 IIS6,但这就是我所做的。

            var iis = new DirectoryEntry("IIS://" + Environment.MachineName + "/w3svc");
    
            foreach (DirectoryEntry site in iis.Children)
            {
                if (site.SchemaClassName.ToLower() == "iiswebserver")
                {
                    Console.WriteLine("Name: " + site.Name);
                    Console.WriteLine("State: " + site.Properties["ServerState"].Value);
                }
            }
    

    ServerState 返回 2 表示已启动,4 表示已停止。

    【讨论】:

    • 这看起来很酷,最优雅。我用谷歌搜索它,似乎它也受 IIS6 支持。我会试一试并更新。非常感谢!
    • 不幸的是,它似乎不起作用。我没有得到我的虚拟目录应用程序的状态。我还在检查它。
    • 您可能需要遍历所有属性键并输出它们以查看可用的内容。我是如何找到 ServerState 的,然后关闭站点以查看值的变化。
    【解决方案2】:

    您可以使用 HTTP HEAD 请求来检查站点是否已启动。这是一个执行相同操作的示例。

    http://www.eggheadcafe.com/tutorials/aspnet/2c13cafc-be1c-4dd8-9129-f82f59991517/the-lowly-http-head-reque.aspx

    【讨论】:

      【解决方案3】:

      我会在 ASP.NET 网站中包含一个 asmx 文件,一个具有简单 Ping 功能的 Web 服务,但它仍然会唤醒网站的应用程序池。

      【讨论】:

      • [WebMethod] public bool IsSiteActive { return true; /* Yes, now it is */ }
      • 这将始终返回“true”,因为当您在应用程序未启动时访问此 asmx - 这将导致应用程序启动并且 asmx 将可访问。所以不幸的是,这不是一个解决方案。
      【解决方案4】:

      您可以分析 IIS 日志文件,查看是否有最近的条目。

      如果您的应用程序使用不多,则可能仍需要刷新最新的“条目”。

      或者您可以更新文件/数据库以指示“仍处于活动状态”。

      如果你真的不想延迟,在 Application_Start 和 Application_End 中,创建和销毁一个系统互斥体。

      【讨论】:

      • 我可以创建一个标志(使用文件或数据库),它将在 Application_Start 和 Application_End 上更新,但是,您认为它足够安全吗?我可以指望 Application_End 总是会发生吗?也在申请例外?
      • 我想你必须测试一下。
      【解决方案5】:

      这是我的解决方案:

          try
          {
              WebRequest request = WebRequest.Create("http://localhost/");
              WebResponse response = request.GetResponse();
          }
          catch (WebException ex)
          { 
              // ex.Status will be WebExceptionStatus.ConnectFailure
              // if the site is not currently running
          }
      

      【讨论】:

        【解决方案6】:

        我们曾经使用 Nagios 来监控我们的网站,它会针对我们网站的图标。如果它可以拉回图标,我们就知道该站点已启动。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-08-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多