【问题标题】:ADSI Query against IIS does not agree with IIS Manager, on Vista针对 IIS 的 ADSI 查询与 Vista 上的 IIS 管理器不一致
【发布时间】:2009-11-27 04:55:30
【问题描述】:

使用 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 启动/停止后,这种情况仍然存在。

这是预期的行为吗? ADSI 在 IIS7 中被支持为“兼容模式”。这是那个神器吗?

我相信,如果处理程序映射从 IIS 管理器中删除,那么它就真的消失了,即使它仍然从 ADSI 查询中返回。

谁能对此提供任何澄清?

【问题讨论】:

    标签: javascript iis isapi adsi


    【解决方案1】:

    当您使用 ADSI 兼容性位添加“脚本映射”时(使用默认网站作为参数),这会将处理程序映射添加到以下站点的 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 文件都不会被读取,它们的处理程序 &lt;add/&gt;&lt;remove/&gt; 指令也不会被包含在内。

    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 文件,并将返回一个处理程序映射列表,该列表说明web.config 中指定的&lt;add/&gt;&lt;remove/&gt; 指令。

    这是 IIS7 管理器应用程序在您查看和修改处理程序映射时所做的事情。它通过在站点根文件夹(或子文件夹)中创建(如有必要)web.config 文件并在此级别添加必要的 &lt;add/&gt;&lt;remove/&gt; 来添加和删除处理程序。

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

    这是一个错误吗?我不确定这是因为最终 ADSI 从一开始就从未意识到 web.config。此外,MS 还必须添加一个新方法或标志,以允许您指定您真正希望在哪个级别进行这些“脚本映射”更改,这可能意味着破坏和测试 ADSI 组件,这反过来可能会引入错误。该行为用于模拟修改旧的 IIS6 元数据库,applicationHost.config 实际上类似于元数据库,因此您可以争论,无论对错,它都在做正确的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-02
      • 2015-12-06
      • 1970-01-01
      • 1970-01-01
      • 2011-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多