近期整理一个“年久失修”的站点时发现,asp环境下,所有以POST方式传递表单参数均会提示 '80004005'错误。

于是专门做了一个post_test.asp页面测试:

<html>
<body>
<%
t_data = "test_" & Request.Form("data_test") '提交POST后,本行会出现错误
response.write "Everything is OK without POST<br>" & t_data '未提交POST时,运行正常
%><p>
<FORM action="post_test.asp" method=post>
POST:<INPUT maxLength=25 size=14 name=data_test></TD>
<input type="submit" name="Submit" value="Submit">
</FORM></p>
</body>
</html>

直接打开页面,没有POST传值的时候,语句运行正常;但当向这个页面POST数据时,就会出现提示 '80004005'错误,行4。

查阅相关资料,有以下几种原因:

  1. 权限控制逻辑:服务器可能会根据请求的方式(GET或POST)和请求的内容来执行权限控制逻辑。在未提交表单数据时,服务器可能不执行特定的权限检查,因此Request.Form语句可以正常运行。但在提交表单数据后,服务器执行权限检查,并根据限制策略拒绝访问Request.Form对象,导致出现错误。
  2. 安全设置:服务器可能针对POST请求实施了安全策略,以防止潜在的安全漏洞,如跨站点脚本攻击(XSS)。这些安全设置可能会限制对Request.Form对象的访问,特别是在处理用户输入数据时。未提交表单数据时,服务器可能不执行相关安全检查,因此Request.Form语句可以正常运行。但在提交表单数据后,服务器会执行安全检查并拒绝访问Request.Form对象,导致出现错误。
  3. 请求数据验证:服务器可能在接收到POST数据后执行验证过程,以确保数据的完整性和合法性。如果请求数据未通过验证,服务器可能会拒绝访问Request.Form对象并返回错误。未提交表单数据时,服务器可能不执行此验证过程,因此Request.Form语句可以正常运行。
  4. IIS中的.NET兼容性设置。

整理材料提交工单给了技术,最后发现是IIS程序池的问题,把“集成模式”改为“经典模式”就恢复正常了。

标签: ASP, IIS