使用ADSI以编程方式在IIS 7中添加ISAPI扩展DLL?

我试图以编程方式在IIS中使用ADSI添加ISAPI扩展DLL。 这已经在早期版本的IIS上工作了很长时间,但似乎在IIS 7上失败了。

我正在使用类似的代码,如在这个问题中所示:

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

执行该代码后,我确实在特定虚拟目录的“处理程序映射”中看到特定dll的“AboMapperCustom-12345678”条目,其中添加了脚本映射。 但是当我尝试在浏览器中使用该扩展时,我总是得到

HTTP错误404.2未find
由于Web服务器上的ISAPI和CGI限制列表设置,您所请求的页面无法提供服务。

即使添加一个条目,以允许在“ISAPI和CGI限制”中的特定DLL,我不断收到该错误。

为了使它实际工作,我首先必须撤消这些步骤(遇到像上面提到的问题的OP相同的问题:从IISpipe理器GUI删除脚本映射条目后,我也必须使用ADSI编程删除它之前实际上已经从元数据库中删除了)。

然后手动添加一个这样的条目:

  • inetmgr – > web服务器 – >网站 – >虚拟目录 – >处理程序映射 – >添加脚本映射…
  • path = * .dll,executable = <path to dll> ,name = <doesn't matter, but it's mandatory>
  • 在问题“你想允许这个ISAPI扩展?”上单击“是”。

当我比较两个条目时,他们是完全一样的,除了“条目types”似乎是以编程方式添加一个“inheritance”,手动添加一个“本地”。

奇怪的是,即使它说“inheritance”,我没有看到它在任何地方在更高的级别的IIS。 它从哪里inheritance?

在我的代码中,我将脚本映射添加到特定的虚拟目录,所以它也应该是“本地”。 也许有问题,但我不知道如何使用ADSI添加“本地”脚本映射。

我真的想继续使用ADSI方法,否则在使用IIS 7或以前的版本时,我将不得不在我们的设置中使用不同的方法,我想避免这种情况。

回顾一下:如何以编程方式将脚本映射条目及其伴侣CGI和ISAPI限制条目添加到使用ADSI的IIS 7?

任何人都可以对此有所了解? 任何帮助赞赏。

IIS7不能与以前版本的元数据库结构100%兼容,您需要启用它。 在IIS的“angular色服务”中,确保启用了“IIS6元数据库兼容性”。

有关更多信息,请参阅以下2个网站:
http://learn.iis.net/page.aspx/125/metabase-compatibility-with-iis-7
http://learn.iis.net/page.aspx/126/how-to-use-metabase-compatibility-with-iis-7

据说,我发现ADSI和Metabase的兼容性似乎不是100%可靠的。 一个更好的解决scheme是重新制作你的脚本来使用appcmd.exe。 命令会是这样的:

 appcmd set config /section:handlers /+[name='MyIsapiExtension',path='*.aaa',verb='GET,POST',scriptProcessor='c:\path\to\extension.dll'] 

有关详细信息,请参阅此网站:
http://technet.microsoft.com/en-us/library/cc754147(WS.10).aspx

我最终用appcmd解决了这个问题。 但要添加到@ MattB的答案 ,我需要添加额外的参数modules='IsapiModule' ,使其实际工作:

 appcmd set config 'website/virtualdir' /section:handlers /+[name='a name',path='*.dll',verb='*',scriptProcessor='path\to\webisapi.dll',modules='IsapiModule'] 

而且我还必须添加一个条目到“ISAPI和CGI限制”部分:

 appcmd set config /section:isapiCgiRestriction /+[path='path\to\isapi.dll', description='a description',allowed='True'] 

我检查%windir%\system32\inetsrv\appcmd.exe以确定使用哪种方式。 如果存在,我使用appcmd ,如果不存在,我会回到ADSI

依然对纯粹的ADSI方式感兴趣!