Я создал метод для размещения размещенных веб-сайтов с сервера 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)).
Любая помощь будет полной?
Я использовал 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;
}
}
Проверьте это сообщение в блоге, в частности, последний абзац. Очень возможно, что конфликт между 32-битной и 64-битной DLL-компиляцией
И клиент, и я создавали 32-битные.NET-приложения, а COM-интерфейс для состояния выполнения FTP реализован в 64-разрядной DLL-версии. Как только мы изменили наши проекты для компиляции для 64-битных платформ, мы оба смогли запустить код. (Кстати, все, что у меня было, было 32-битной системой, когда я написал свой оригинальный блог, поэтому я, вероятно, столкнулся бы с этим раньше, если бы у меня тогда был 64-битный системный путь. -])