0

我正在编写一个安装 IIS 并在将文件部署到网站之前配置网站的小应用程序。在新重置的 Windows 10 上,第一次尝试总是失败并出现 0x80040154 COM+ 组件故障,如本问题中所述

我查看了我正在使用的版本,它是适用于 .net 标准(4.8)的最新且正确的版本,而不是适用于 .net 核心的版本

当我按下按钮重新运行该功能时,它总是正确完成。我尝试使用重试例程,每次重试时都会失败,但按下按钮时再次运行良好。我假设的原因是服务器管理器对象在遇到 catch 块时没有被释放,因为它在 using 语句中。

我可以解决这个问题,但我真的很想了解这个问题并进行永久修复。

我的例程只是在 IIS 中创建一个网站并创建一个应用程序池来分配给它。

它以提升的权限运行

供参考:机器是可下载媒体创建器提供的最新 Windows 10。Microsoft.Web.Administrator 版本为 7.0.0.0 应用程序为 .net 4.8 标准 windows 窗体

using (var serverManager = new ServerManager())
{
    string iisrootdir = drive;
    //Check for inetpub/wwwroot
    if (!Directory.Exists(iisrootdir)) //Check for Drive D
    {
        iisrootdir = @"C:\";
    }

    string iiscmsdir = Path.Combine(iisrootdir, "webdir", "appdir");

    if (!Directory.Exists(iiscmsdir))
        Directory.CreateDirectory(iiscmsdir);

    var settings = new ApplicationSettings();
    settings.ReadFromFile();
    settings.CMSPATH = iiscmsdir;
    settings.SaveToFile();

    try
    {
        string poolName = "DefaultAppPool";

        if (serverManager.Sites.Count > 0)
        {
            Site myDefualtWebsite = serverManager.Sites[0];
            if (myDefualtWebsite != null)
            {
                OnRaiseInstallEvent(new InstallEventArgs("CreateWebsite", ProcessState.Started,
                    "Remove Default Website"));
                serverManager.Sites.Remove(myDefualtWebsite);
                serverManager.CommitChanges();
            }
        }

        if (!WebsiteExists("sitename"))
        {
            mySite.ServerAutoStart = true;
        }

        Site site = serverManager.Sites["sitename"];
        
        if (!AppPoolExists(poolName))
        {
            serverManager.ApplicationPools.Add(poolName);
        }
        
        ApplicationPool apppool = serverManager.ApplicationPools[poolName];
        apppool.ManagedPipelineMode = ManagedPipelineMode.Integrated;

        apppool.ManagedRuntimeVersion = "";
        serverManager.Sites["sitename"].ApplicationDefaults.ApplicationPoolName = poolName;
        foreach (var item in serverManager.Sites["sitename"].Applications)
        {
            item.ApplicationPoolName = poolName;
        }

        serverManager.CommitChanges();
        apppool.Recycle();
        serverManager.CommitChanges();
    }
    catch (Exception ex)
    {
        if (ex.Message.Contains("80040154") && errorCount < 4)
        {
            if (serverManager != null)
                serverManager.Dispose();
            errorCount++;
            OnRaiseInstallEvent(new InstallEventArgs("CreateWebsite", ProcessState.Started,
                "Error encountered with COM+ object, trying again: " + errorCount));
            CreateWebsite(@"D:\");
        }
        else
        {
            if (serverManager != null)
                serverManager.Dispose();
            errorCount = 0;
            OnRaiseErrorEvent(new InstallErrorEventArgs("CreateWebsite", ProcessState.Error, ex));
            return false;
        }
    }
    finally
    {
        serverManager?.Dispose();
    }
4

1 回答 1

0

谢谢你们的帮助。我发现了问题。

DISM 在自己的线程中运行。Process 对象在它启动的那一刻就退出了。然后我的函数在完成安装之前尝试配置 IIS。

于 2020-11-04T09:50:54.273 回答