2013-02-24 19 views
0

这是可能的手动按照以下步骤还原为应用程序父处理器映射:如何通过代码恢复IIS 7(或更高版本)上的应用程序的父处理程序映射?

  • IIS管理控制台上选择应用程序
  • 双击处理程序映射
  • 的Clik恢复到家长在操作窗格

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

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

回答

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

     } 
    } 
} 
1

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

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

我非常感谢您发现此主题。我编写了一个快速的控制台应用程序,以便在我的所有站点上运行并恢复为父项。我会在任何一天超过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 "); 
      } 
     } 
    } 
} 
相关问题