如何通过代码还原到IIS 7(或更高版本)上应用程序的父处理程序映射

本文关键字:版本 应用程序 映射 程序 处理 高版本 还原 代码 何通过 IIS | 更新日期: 2023-09-27 18:01:06

可以通过以下步骤手动恢复应用程序到父级的处理程序映射:

  • 在IIS管理控制台上选择应用程序
  • 双击处理程序映射
  • 在"操作"窗格上单击"还原为父对象">

有没有一种方法可以通过编程实现相同的任务(appcmd.exe、VBScript、C#…(?

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

如何通过代码还原到IIS 7(或更高版本)上应用程序的父处理程序映射

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

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

我永远感激能找到这个话题。我写了一个快速控制台应用程序,可以在我所有的网站上运行并恢复为家长。我每天要花2分钟多一点,2.8小时多一点!我只是想我会分享全部内容,以防其他人遇到这个问题。

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 ");
            }
        }
    }
}

以下适用于该问题:

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();
        }
    }
}