ASP网站局域网测试正常,上传到空间就出问题,这种情况太常见了。代码在本地跑得顺,说明逻辑大概率没大毛病,真正变的是运行环境。局域网里你用的是自己电脑的IIS,权限、路径、组件都是你说了算;到了虚拟主机或云服务器,这些条件全换了,问题往往就藏在差异里。
先看权限。ASP站点里只要用到文件写入、Access数据库、FSO生成静态页、上传组件保存文件,就必须有目录写权限。局域网测试时你多半是管理员账户,什么目录都能写;空间上默认只给网站根目录读权限,上传目录、数据库目录、临时目录经常没开写权限。典型报错是“Microsoft VBScript 运行时错误 ''800a0046'' 没有权限”或者“ADODB.Connection 错误 ''800a0e7a'' 未找到提供程序”。Access数据库尤其明显,连接字符串写的是相对路径,数据库文件放在data目录,空间上data目录没有修改权限,读能读,一写入就报错。解决办法不是改代码,而是把数据库所在目录、上传保存目录、FSO输出目录的写权限开给IIS_IUSRS或应用程序池账户。虚拟主机后台一般有“目录权限设置”,找空间商确认更直接。
再看父路径。IIS 7以后默认关闭父路径,很多老ASP项目里写,局域网测试时你手动开过父路径,上传后忘了。空间上父路径一关,页面直接报“Active Server Pages 错误 ''ASP 0131''”或者包含文件找不到。这个设置不在代码里,在IIS的ASP配置里,虚拟主机通常不让你改,只能把include改成虚拟路径,或者用Server.MapPath拼绝对路径。上传前把include语句检查一遍,能少走很多弯路。
路径写法也是重灾区。局域网里有人习惯写“D:\web\data\xxx.mdb”,或者用Server.MapPath("/")取根目录。空间上网站根目录变了,物理路径根本不存在,数据库连接、上传保存、文件读取全挂。ASP里尽量用Server.MapPath("./data/xxx.mdb")这种相对当前文件的方式,别写死盘符。还有大小写,虽然IIS不区分,但有些空间商做了URL重写或静态化,文件名大小写不一致会404。上传前把链接和文件名对一遍,不费事。
组件和位数问题容易被忽略。经典ASP跑在64位Windows上,默认应用程序池没开32位支持,FSO、CDONTS、某些上传组件、老版本ADO驱动可能创建不了对象,报“ActiveX 部件不能创建对象”。局域网测试时你用的是32位模式或者本机注册过组件,空间上没注册,自然报错。虚拟主机后台一般能切“32位应用程序池”,云服务器就在IIS里把“启用32位应用程序”设为True。另外,空间商为了安全常禁用FSO、Shell、WScript.Shell,上传组件如果依赖这些,也会失败。先问清楚空间支持哪些组件,比事后猜强。

上传大小和超时也常被误判成“代码问题”。IIS里ASP的AspMaxRequestEntityAllowed默认200KB,脚本超时默认90秒。局域网传大文件没事,是因为你改过或本地没限制;空间上没改,一传大文件就报“Request 对象 错误 ''ASP 0104 : 80004005''”或者直接500。虚拟主机后台如果有“上传限制”就调大,没有就联系空间商。上传组件本身也有大小限制,代码里检查一下。
最后说调试。空间上出问题别急着改代码,先把IIS的“发送详细错误给客户端”打开,或者让空间商提供详细错误页。在关键位置用Response.Write输出Server.MapPath路径、数据库连接字符串、组件创建结果,看完再删。很多问题一输出就清楚了:路径不对、权限不够、组件没注册。要是空间商把详细错误关了,就看日志,或者写个最简单的测试页,只连数据库、只写文件、只创建FSO对象,逐个排除。
说到底,局域网正常、上传空间出问题,九成是环境差异,不是ASP本身不行。权限、父路径、路径写法、组件位数、上传限制这几项挨个过一遍,大部分故障都能定位。上传前在本地把include改成相对路径、数据库连接改成Server.MapPath、上传目录权限写清楚,能省掉很多来回折腾。