Javascript 针对IIS的ADSI查询与Vista上的IIS管理器不一致
使用Vista 我有一个使用ADSI在IIS网站上设置脚本映射的脚本。它是javascript,在cscript.exe中运行,代码如下所示:Javascript 针对IIS的ADSI查询与Vista上的IIS管理器不一致,javascript,iis,isapi,adsi,Javascript,Iis,Isapi,Adsi,使用Vista 我有一个使用ADSI在IIS网站上设置脚本映射的脚本。它是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 = map
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管理器时,可以在处理程序映射列表中看到新条目。它有一个奇怪的名字“AboMapperCustom-43155”,我知道它来自ADSI的IIS7兼容层
如果在IIS管理器中删除这些处理程序映射,然后运行另一个ADSI脚本来查询ScriptMaps属性,则脚本中检索到的ScriptMaps仍会列出刚刚删除的条目。ADSI脚本中的结果与IIS管理器中显示的“处理程序映射”列表不一致
即使在IISADMIN和W3SVC启动/停止后,这种情况仍然存在
这是预期的行为吗?在IIS7中,ADSI作为“兼容模式”受到支持。这是它的产物吗
我相信,如果处理程序映射从IIS管理器中删除,那么它实际上就消失了,即使它仍然从ADSI查询返回
有人可以对此进行澄清吗?当您使用ADSI兼容位添加“scriptmap”(出于论证的目的使用默认网站)时,这会为站点添加一个到
applicationHost.config
文件的处理程序映射:
<location path="Default Web Site">
<system.webServer>
<handlers>
<add name="AboMapperCustom-12345678" ... />
</handlers>
</system>
</location>
使用新的托管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
文件,也不会包括其处理程序
和
指令
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
中指定的指令
这就是IIS7 Manager应用程序在查看和修改处理程序映射时所做的操作。它通过在站点根文件夹(或子文件夹)中创建(如有必要)一个web.config
文件并在此级别添加必要的
和
来添加和删除处理程序
IIS6兼容层似乎仅在applicationHost.config
APPHOST级别(上面的选项1)运行,这就是为什么您会看到这些差异
是虫子吗?我不确定这是因为ADSI从一开始就不知道web.config。此外,MS还必须添加一个新的方法或标志,以允许您指定您真正希望在哪个级别进行这些“脚本映射”更改,这可能意味着破坏和测试ADSI组件,这反过来可能会引入错误。这种行为是为了模拟修改旧的IIS6元数据库,而实际上,
applicationHost.config
是对元数据库的一种分析,因此无论正确与否,您都可以认为它做了正确的事情。当您使用ADSI兼容性位添加“scriptmap”时(为了论证而使用默认网站),这会将处理程序映射添加到位于以下位置的站点的applicationHost.config
文件:
<location path="Default Web Site">
<system.webServer>
<handlers>
<add name="AboMapperCustom-12345678" ... />
</handlers>
</system>
</location>
使用新的托管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
文件,也不会包括其处理程序
和
指令
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
中指定的指令
这就是IIS7 Manager应用程序在查看和修改处理程序映射时所做的操作。它通过在站点根文件夹(或子文件夹)中创建(如有必要)一个web.config
文件并在此级别添加必要的
和
来添加和删除处理程序
IIS6兼容层似乎仅在applicationHost.config
APPHOST级别(上面的选项1)运行,这就是为什么您会看到这些差异
是虫子吗?我不确定这是因为ADSI从一开始就不知道web.config。此外,MS还必须添加一个新的方法或标志,以允许您指定您真正希望在哪个级别进行这些“脚本映射”更改,这可能意味着破坏和测试ADSI组件,这反过来可能会引入错误。这种行为是为了模拟修改旧的IIS6元数据库,
applicationHost.config
实际上是对元数据库的一种分析,因此你可以争辩,无论是对是错,它做的是正确的事情。@Cheeso-dunno如果你得到我给出的答案的通知,那么留下一条评论(yep rep whoring:))我错过了它;谢谢@Cheeso-不知道你是否收到我给出的答案的通知,所以留下评论