Получить имена размещенных веб-сайтов от IIS

1

Я создал метод для размещения размещенных веб-сайтов с сервера IIS в следующем фрагменте кода.

       ServerManager serverManager = new ServerManager();

        try
        {
            foreach (Site site in serverManager.Sites)
            {
                Console.WriteLine(site);
            }

        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);

            Console.ReadLine();
        }

Когда я запускаю его на своей локальной машине, он отлично работает (Windows 7/IIS 7 with 32bits) Но когда я запускаю его на сервере (Windows server 2003 R2 with IIS 6) он не работает. Он дает следующую ошибку

Получение фабрики COM-класса для компонента с CLSID {2B> 52-803546CE3344} завершилось ошибкой из-за следующей ошибки: 80040154> d (Исключение из HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).

Любая помощь будет полной?

Теги:
iis
com
.net-assembly

2 ответа

2
Лучший ответ

Я использовал System.DirectoryServices вместо того, чтобы использовать Microsoft.Web.Administration и он решил мою проблему. Он также будет работать с IIS6 и IIS7.

    public class IisManager
    {
        public static int IisVersion
        {
            get
            {
                int iisVersion;

                using (RegistryKey iisKey = Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\InetStp"))
                {
                    if (iisKey == null)
                        throw new Exception("IIS is not installed.");
                    iisVersion = (int)iisKey.GetValue("MajorVersion");
                }

                return iisVersion;
            }

        }

        public static IList<IisWebSite> GetIisSites()
        {
            List<IisWebSite> sites = new List<IisWebSite>();

            using (DirectoryEntry iisRoot = new DirectoryEntry("IIS://localhost/W3SVC"))
            {
                iisRoot.RefreshCache();
                sites.AddRange(iisRoot.Children.Cast<DirectoryEntry>().Where(w => w.SchemaClassName.ToLower(CultureInfo.InvariantCulture) == "iiswebserver").Select(w => new IisWebSite(w.Name, w.Properties["ServerComment"].Value.ToString())));
            }

            return sites;
        }

        public static IList<string> GetIisAppPools()
        {
            List<string> pools = new List<string>();
            using (DirectoryEntry poolRoot = new DirectoryEntry("IIS://localhost/W3SVC/AppPools"))
            {
                poolRoot.RefreshCache(); pools.AddRange(poolRoot.Children.Cast<DirectoryEntry>().Select(p => p.Name));
            }
            return pools;
        }

    }
1

Проверьте это сообщение в блоге, в частности, последний абзац. Очень возможно, что конфликт между 32-битной и 64-битной DLL-компиляцией

И клиент, и я создавали 32-битные.NET-приложения, а COM-интерфейс для состояния выполнения FTP реализован в 64-разрядной DLL-версии. Как только мы изменили наши проекты для компиляции для 64-битных платформ, мы оба смогли запустить код. (Кстати, все, что у меня было, было 32-битной системой, когда я написал свой оригинальный блог, поэтому я, вероятно, столкнулся бы с этим раньше, если бы у меня тогда был 64-битный системный путь. -])

http://blogs.iis.net/robert_mcmurray/archive/2012/06/29/error-class-not-registered-0x80040154-when-querying-ftp-runtime-state.aspx

Ещё вопросы

Сообщество Overcoder
Наверх
Меню