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

时间:2013-02-24 18:18:33

标签: c# iis-7 vbscript iis-7.5 appcmd

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

  • 在IIS管理控制台上选择应用程序
  • 双击“处理程序映射”
  • Clik在“操作”面板上恢复为“父级”

有没有办法以编程方式实现相同的任务(appcmd.exe,VBScript,C#..)?

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

2 个答案:

答案 0 :(得分:1)

我遇到了将多个IIS6服务器迁移到IIS8.5的不幸任务。上周我的干运行工作得很好,只是使用web部署来复制一切。我只有一些唠叨的问题可以通过修复一个或两个网站轻松解决。在我上周运行Web部署之前,我恢复了我的IIS备份,然后重新进行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 ");
            }
        }
    }
}

答案 1 :(得分: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();

        }
    }
}