如何判断一个Web应用程序是否正在运行?

7
我有一个在IIS 6下运行的ASP.NET Web应用程序,另一个进程负责监视和报告状态。
我想通过监视进程对Web应用程序进行采样,以通过访问Web应用程序上的专用处理程序来检查其状态,但是,如果Web应用程序没有运行,我不想“唤醒”它。
是否有一种选项可以确定特定的Web应用程序当前是否正在运行?如果有这样的选项,我将能够首先检查应用程序是否正在运行,然后再访问处理程序以检查其状态。
谢谢。
6个回答

2

我今年早些时候也需要为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的支持。我会试一下并更新。非常感谢! - Satumba
不幸的是,它似乎没有起作用。我的虚拟目录应用程序状态没有显示出来,我还在检查中。 - Satumba
你可能需要循环遍历所有属性键并将它们输出以查看可用的内容。这就是我发现ServerState的方式,然后关闭站点以查看值的变化。 - Phill

1

0

我们曾经使用Nagios来监控我们的网站,它会针对我们网站的favicon进行监测。如果它能够获取到图标,我们就知道网站是正常的。


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

[WebMethod] public bool IsSiteActive { return true; /* Yes, now it is */ } - GvS
1
无论何时访问此asmx,它将始终返回'true'。由于这会导致应用程序启动并且asmx可访问,因此这不是一种解决方案。 - Satumba

0

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

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

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

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


我可以创建一个标志(使用文件或数据库),该标志将在Application_Start和Application_End上更新,但是,您认为这样足够安全吗?我能否指望Application_End始终发生?还有应用程序异常的情况下呢? - Satumba
1
我认为你需要进行测试。 - GvS

0
这是我的解决方案:
    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
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接