0

可以通过以下步骤手动将应用程序的处理程序映射还原为父级:

  • 在 IIS 管理控制台上选择应用程序
  • 双击处理程序映射
  • 单击“操作”窗格上的“还原为父级”

有没有办法以编程方式完成相同的任务(appcmd.exe、VBScript、C#..)?

注意:如果已经为应用程序定义了自定义设置,aspnet_regiis -i 命令不起作用。到目前为止,我发现的唯一方法是从 IIS 中删除应用程序并通过代码再次添加它。

4

2 回答 2

1

我的不幸任务是将多个 IIS6 服务器迁移到 IIS8.5。我上周的试运行效果很好,只是使用 web deploy 来复制所有内容。我只有几个烦人的问题,通过修复一两个网站很容易解决。我将 IIS 备份恢复到上周运行 web deploy 之前,然后重新运行 web deploy 以像上周一样将所有内容复制回来(由于自上周以来创建了几个新站点)。令我震惊的是,当您在处理程序映射的操作页面上恢复为父级时,我遇到了所有可怕的错误消息。

由于有 570 个奇怪的站点,并且出于某种疯狂的原因,选择站点、选择处理程序映射、单击还原、回答问题、单击下一个站点并加载的过程需要 18 秒。如果我不暂停一秒钟,我将花费近 3 个小时来处理这台服务器。

我永远感激能找到这个话题。我编写了一个快速控制台应用程序来运行并恢复到我所有网站上的父级。我每天都会在 2.8 小时内花 2 分钟多一点的时间!我只是想我会分享完整的东西,以防其他人遇到这个问题。

using System;
using System.DirectoryServices;
using System.Collections;

namespace IISHandlerMappingsRevertToParentAll
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args == null || args.Length != 3)
            {
                Console.WriteLine("IISHandlerMappingsRevertToParentAll.exe WebServer UserName Password");
                Console.WriteLine("Example: IISHandlerMappingsRevertToParentAll WebServer1 WebServer1\\MyUserName MyPassword");
            }
            else
            {
                DateTime dt = DateTime.Now;
                int cleared = 0;
                using (DirectoryEntry root = new DirectoryEntry("IIS://" + args[0] + "/W3SVC", args[1], args[2], AuthenticationTypes.FastBind))
                {
                    foreach (DirectoryEntry r in root.Children)
                    {
                        if (r.SchemaClassName == "IIsWebServer")
                        {
                            foreach (DirectoryEntry e in r.Children)
                            {
                                if (e.SchemaClassName == "IIsWebVirtualDir")
                                {
                                    ArrayList ScriptMaps = new ArrayList(e.Properties["ScriptMaps"]);
                                    if (ScriptMaps.Count > 0)
                                    {
                                        Console.WriteLine("Clearing for " + e.Properties["Path"].Value);
                                        cleared++;
                                        e.Properties["ScriptMaps"].Clear();
                                        root.CommitChanges();
                                    }
                                }
                            }
                        }
                    }
                }
                Console.WriteLine("Reset " + cleared + " took " + DateTime.Now.Subtract(dt).TotalSeconds + "s ");
            }
        }
    }
}
于 2016-04-21T05:06:29.330 回答
0

以下适用于该问题:

using System;
using System.Text;
using System.DirectoryServices;

namespace RevertToParentHandlerMappings
{
    class Program
    {
        static void Main(string[] args)
        {

            string vDirPath = "IIS://localhost/W3SVC/1/ROOT/AppName";

            DirectoryEntry vDir = new DirectoryEntry(vDirPath);

            vDir.Properties["ScriptMaps"].Clear();

            vDir.CommitChanges();

        }
    }
}
于 2013-02-25T12:48:16.790 回答