针对IIS的ADSI查询与Vista上的IIS管理器不一致

时间:2009-11-27 04:55:31

标签: javascript iis isapi adsi

使用Vista ...

我有一个使用ADSI在IIS网站上设置ScriptMaps的脚本。它是javascript,在cscript.exe中运行,代码如下所示:

var web = GetObject("IIS://localhost/W3SVC/1");
var maps = web.ScriptMaps.toArray();
map[maps.length] = ".aaa,c:\\path\\to\\isapi\\extension.dll,1,GET,POST";
web.ScriptMaps = maps.asDictionary();
web.SetInfo();

当我在运行脚本后查看IIS管理器时,我可以在Handler Mappings列表中看到新条目。它有一个奇怪的名字“AboMapperCustom-43155”,据我所知,它来自ADSI的IIS7兼容层。

如果在IIS管理器中我删除了那些处理程序映射,然后运行另一个ADSI脚本来查询ScriptMaps属性,则脚本中检索到的ScriptMaps仍会列出刚刚删除的条目。 ADSI脚本中的结果与IIS管理器中显示的“处理程序映射”列表不一致。

即使在IISADMIN和W3SVC启动/停止后,这仍然存在。

这是预期的行为吗? IIS7中支持ADSI作为“兼容模式”。这是一件神器吗?

我相信如果从IIS MAnager中删除Handler Mapping,那么它确实已经消失了,即使它仍然从ADSI查询返回。

有人可以就此提出任何澄清吗?

1 个答案:

答案 0 :(得分:1)

使用ADSI兼容性位添加“scriptmap”时(为了参数使用默认网站),这会在以下位置添加处理程序映射到站点的applicationHost.config文件:

<location path="Default Web Site">
  <system.webServer>
    <handlers>
        <add name="AboMapperCustom-12345678" ... />
    </handlers>
  </system>
</location>

当您删除IIS7管理器中的处理程序映射时,不会从applicationHost.config文件和上面显示的部分中删除映射,而是将web.config文件添加到站点的根目录中,以下内容:

<configuration>
  <system.webServer>
    <handlers>
        <remove name="AboMapperCustom-12345678" />
    </handlers>
  </system>
</configuration>

使用新的托管Microsoft.Web.Administration .NET API获取网站配置时,您可以在不同级别读取配置,例如:

1:在applicationHost.config或APPHOST级别阅读配置

ServerManager serverManager = new ServerManager();
var site = serverManager.Sites.Where(s => s.Id == 1).SingleOrDefault();
Configuration siteConfig = serverManager.GetApplicationHostConfiguration();
ConfigurationSection handlersSection = 
     siteConfig.GetSection("system.webServer/handlers", site.Name);
ConfigurationElementCollection handlersCollection = 
     handlersSection.GetCollection();

foreach (var item in handlersCollection)
{
    Console.WriteLine(item.Attributes["name"].Value);
}

在上面的示例中,即使您已删除映射,在迭代处理程序映射集合时仍会列出它。这是因为您已经要求在应用程序主机级别进行配置。不会读取站点根目录或更低版本中存在的任何web.config文件,并且不会包含其处理程序<add/><remove/>指令。

2:您可以阅读特定于网站(或网站中的子文件夹)的配置:

ServerManager serverManager = new ServerManager();
Configuration siteConfig = serverManager.GetWebConfiguration("Default Web Site");    
ConfigurationSection handlersSection = 
    siteConfig.GetSection("system.webServer/handlers");
ConfigurationElementCollection handlersCollection = 
    handlersSection.GetCollection();

foreach (var item in handlersCollection)
{
    Console.WriteLine(item.Attributes["name"].Value);
}

这也将读取网站web.config文件,并将返回一个处理程序映射列表,该列表记录了<add/>中指定的<remove/>web.config指令。

这是IIS7管理器应用程序在查看和修改处理程序映射时所执行的操作。它通过在站点根文件夹(或子文件夹)中创建(如果需要)web.config文件并在此级别添加必需的<add/><remove/>来添加和删除处理程序。

IIS6兼容层似乎仅在applicationHost.config APPHOST级别(上面的选项1)运行,这就是您看到这些差异的原因。

这是一个错误吗?我不确定是不是因为最初ADSI从来没有web.config知道。此外,MS必须添加一个新方法或标志,以允许您指定您真正想要在哪个级别进行这些“脚本映射”更改,这可能意味着破坏和测试ADSI组件,这反过来可能会引入错误。行为是为了模拟修改旧的IIS6元数据库,applicationHost.config实际上与元数据库类似,所以你可以辩解,无论是正确还是错误,它正在做正确的事情。