一.问题情况
由于一个网站使用老旧的32位win2003系统,迁移到新的64位win2016系统后,access数据库无法读取,所以记录一下
二.解决方法
首先打开错误页-编辑功能设置-详细错误,ASP-调试属性-将错误发送到浏览器True,这样就可以看到asp的报错了.显示为:
1 2 3 4 5 |
Microsoft OLE DB Provider for ODBC Drivers 错误 '80004005' [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序 {文件路径}\../{文件名}.asp,行 X |
百度后发现是64位操作系统不支持Microsoft OLE DB Provider for Jet驱动程序,也不支持更早的Microsoft Access Driver (*.mdb)方式连接。按要求打开应用程序池-设置应用程序池默认设置-启用32位应用程序True
正常到这里就可以了,但是由于我的IIS站点有些不需要执行ASP,所以我删除了默认的应用程序映射的ASP脚本映射,然后去对应站点的应用程序映射手动添加了ASP脚本映射
打开32位应用程序后asp访问变成了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
HTTP 错误 404.17 - Not Found 请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理。 最可能的原因: 请求与通配符 mime 映射相匹配。请求映射到静态文件处理程序。如果有不同的前提条件,请求将映射到另一个处理程序。 可尝试的操作: 如果要将此内容作为静态文件提供,请添加显式 MIME 映射。 详细错误信息: 模块 StaticFileModule 通知 ExecuteRequestHandler 处理程序 StaticFile 错误代码 0x80070032 请求的 URL http://{URL}.asp 物理路径 {文件路径}.asp 登录方法 Negotiate 登录用户 WIN-XXXXX\XXXXX 详细信息: 有时候,前提条件和通配符 MIME 映射可能会意外导致提供脚本源。 查看详细信息 » |
百度后,都是讲怎么注册asp.net的的应用程序池的,其实跟asp.net没啥关系,因为匹配到的是StaticFile模块,其实是ISAPI加载ASP的地方没有匹配到请求.64位IIS在手动处理应用程序映射添加脚本映射asp的时候强制声明了64位应用,只要去掉这个64位程序声明就行,配置可以打开C:\Windows\System32\inetsrv\config\applicationHost.config查看,或者是在站点的web.config里查看(PS:至于IIS如何使用这2个配置文件的我一直没搞懂,站点根目录下web.config好像是实时的,但是applicationHost.config修改保存IIS会根据你的修改实时使用,如果用IIS控制台修改一些设置,在applicationHost.config却查看不到任何变化.)
ASP安装默认添加的ASP脚本支持在applicationHost.config里配置是这样:
1 |
<add name="ASPClassic" path="*.asp" verb="GET,HEAD,POST" modules="IsapiModule" scriptProcessor="%windir%\system32\inetsrv\asp.dll" resourceType="File" /> |
手动添加ASP脚本支持
1 |
<add name="ASP" path="*.asp" verb="GET,POST,HEAD" modules="IsapiModule" scriptProcessor="%windir%\system32\inetsrv\asp.dll" resourceType="File" preCondition="bitness64" /> |
多了一个preCondition="bitness64"就是声明程序是64位的,64位的ASP又不支持Access数据库的读取,就出现上面上面这个404.17的提示了.在配置文件里删除掉preCondition="bitness64"然后保存asp就可以正常使用access数据库读写了.