我试图以编程方式在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编程删除它之前实际上已经从元数据库中删除了)。
然后手动添加一个这样的条目:
<path to dll> ,name = <doesn't matter, but it's mandatory> 当我比较两个条目时,他们是完全一样的,除了“条目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方式感兴趣!