0

現在、次のコードを使用して、IISWebサイトが開始/一時停止/停止されているかどうかを検出できます。

public int GetWebsiteStatus(string machineName, int websiteId)
{
    DirectoryEntry root = new DirectoryEntry(
        String.Format("IIS://{0}/W3SVC/{1}", machineName, websiteId));
    PropertyValueCollection pvc = root.Properties["ServerState"];
    return pvc.Value
    // - 2: Website Started
    // - 4: Website Stopped
    // - 6: Website Paused
}

また、ウェブサイトが一時停止されているかどうかを検出したいと思います。ウェブサイトが一時停止されている場合でも、上記の方法は2(これは正しい)を返しますが、私には十分ではありません。

IIS6以降で機能するコードが見つかりません。

4

2 に答える 2

5

ああ、タイムアウト設定のためにアプリプールが停止したという意味ですか?これはウェブサイトとは別の状態です覚えていますか?確かに、リサイクルされないように設定を変更することはできますが、このようなコードを使用することもできます。

まず、\ Windows \ System32 \ inetsrv \ Microsoft.Web.Administration.dllへの参照を追加し、次に;

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Web.Administration;
namespace MSWebAdmin_Application
{
    class Program
    {
        static void Main(string[] args)
        {
            ServerManager serverManager = new ServerManager();
            Site site = serverManager.Sites["Default Web Site"];

            // get the app for this site
            var appName = site.Applications[0].ApplicationPoolName;
            ApplicationPool appPool = serverManager.ApplicationPools[appName];

            Console.WriteLine("Site state is : {0}", site.State);
            Console.WriteLine("App '{0}' state is : {1}", appName, appPool.State);

            if (appPool.State == ObjectState.Stopped)
            {
                // do something because the web site is "suspended"
            }
        }
    }
}

そのコードは、Webサイトではなく、appPoolの状態を独立してチェックします。Webサイトが「開始済み」を返し、appPoolが「停止済み」を返す可能性があります。

それがあなたのケースで機能するかどうかを確認してください。

于 2012-10-11T16:45:48.620 に答える
1

次のコードを使用して、独自のロジックを追加し、もちろん整理することをお勧めします...しかし、本質的には、次のことを実行し、必要に応じてコードを変更する必要があります。

次の列挙型を追加します

public enum ServerState
        {
            Unknown = 0,
            Starting = 1,
            Started = 2,
            Stopping = 3,
            Stopped = 4,
            Pausing = 5,
            Paused = 6,
            Continuing = 7
        }

サイトを検索して処理します...

DirectoryEntry w3svc = new DirectoryEntry("IIS://" + "localhost" + "/W3SVC");
//check each site
foreach (DirectoryEntry site in w3svc.Children)
{
    foreach (var s in site.Properties)
    {
        try
        {
            ServerState state =
                (ServerState)
                Enum.Parse(typeof (ServerState), site.Properties["ServerState"].Value.ToString());

            if (state == ServerState.Paused)
            {
                //Do action
            }
        }
        catch (Exception)
        {

        }

    }
}

これがあなたにも役立つことを願っています...

http://csharp-tipsandtricks.blogspot.co.uk/2009_12_01_archive.html

于 2012-10-11T13:41:07.113 に答える