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

C# 如何通过代码还原IIS 7(或更高版本)上应用程序的父处理程序映射?,c#,iis-7,vbscript,iis-7.5,appcmd,C#,Iis 7,Vbscript,Iis 7.5,Appcmd,可以通过以下步骤手动将应用程序的处理程序映射还原到父级: 在IIS管理控制台上选择应用程序 双击处理程序映射 在“操作”窗格上单击“还原到父级” 是否有方法通过编程方式实现相同的任务appcmd.exe、VBScript、C 注: 如果已经为应用程序定义了自定义设置,则aspnet_regiis-i命令不起作用。 到目前为止,我找到的唯一方法是从IIS中删除应用程序,然后通过代码再次添加它。以下方法可以解决这个问题: using System; using System.Text; using

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

在IIS管理控制台上选择应用程序 双击处理程序映射 在“操作”窗格上单击“还原到父级” 是否有方法通过编程方式实现相同的任务appcmd.exe、VBScript、C

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

以下方法可以解决这个问题:

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

        }
    }
}

我有一个不幸的任务,将几个IIS6服务器迁移到IIS8.5。我上周的试运行非常好,只是使用WebDeploy复制了所有内容。我只有几个烦人的问题,可以通过修复一两个网站轻松解决。在上周运行web deploy之前,我将IIS备份还原为,然后重新运行web deploy,将所有内容复制回上个工作日,并将其复制到自上周以来创建的几个新网站。令我震惊的是,我遇到了所有可怕的错误消息,当您在处理程序映射的操作页面上还原到父级时,这些错误消息都已修复

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