使用XMLHTTPRequest调用ASP.NET MVC控制器时Classic ASP出现超时错误求助
解决Classic ASP调用ASP.NET MVC控制器时的msxml3.dll超时错误(80072ee2)
你已经精准定位到问题核心了——后台数据库查询耗时过长,导致Classic ASP侧在接收响应前触发超时。你现有的SetTimeouts和waitForResponse设置没生效,大概率是参数配置不匹配,或者忽略了ASP页面本身的超时限制,咱们一步步来解决:
1. 修正SetTimeouts参数的逻辑问题
MSXML2.ServerXMLHTTP的SetTimeouts四个参数顺序是:resolveTimeout(域名解析超时)、connectTimeout(连接超时)、sendTimeout(发送数据超时)、receiveTimeout(接收响应超时)
你当前设置的receiveTimeout只有15秒(15000毫秒),这意味着即使你用waitForResponse(90)等待90秒,一旦超过15秒还没收到响应数据,就会直接触发超时错误。
把receiveTimeout调整为和前两个参数一致的10分钟(600000毫秒),确保接收响应的时间足够覆盖后台查询的耗时:
xmlHttp.SetTimeouts 600000, 600000, 600000, 600000
2. 增加ASP页面本身的脚本超时限制
Classic ASP默认的Server.ScriptTimeout是90秒,就算你的XMLHTTP请求设置了10分钟超时,如果ASP页面本身先到了90秒超时,还是会抛出错误。在你的ASP页面开头加上:
Server.ScriptTimeout = 600 ' 设置为10分钟,单位是秒
3. 优化异步请求的错误处理
你当前的代码只判断了waitForResponse的结果,但没有处理超时失败的情况,也没有检查响应状态。可以补充错误捕获和状态验证:
function getHTML (strUrl) Dim xmlHttp, http_response http_response = "" Set xmlHttp = Server.Createobject("MSXML2.ServerXMLHTTP.3.0") ' 先设置ASP页面超时 Server.ScriptTimeout = 600 ' 统一设置所有超时为10分钟 xmlHttp.SetTimeouts 600000, 600000, 600000, 600000 xmlHttp.Open "GET", strUrl, True xmlHttp.SetRequestHeader "Content-Type", "application/xml; charset=UTF-8" xmlHttp.SetRequestHeader "Accept", "application/xml; charset=UTF-8" On Error Resume Next ' 开启错误捕获 xmlHttp.Send If Err.Number <> 0 Then getHTML = "ERROR: " & Err.Description set xmlHttp = Nothing Exit Function End If On Error Goto 0 ' 关闭错误捕获 ' 等待响应,设置为10分钟(600秒) If xmlHttp.waitForResponse(600) Then ' 验证响应状态是否正常 If xmlHttp.Status = 200 Then http_response = xmlHttp.responseText Else getHTML = "ERROR: Server returned status " & xmlHttp.Status End If Else getHTML = "ERROR: Request timed out" End If getHTML = "COMPLETED" set xmlHttp = Nothing end function
4. 额外调试建议
- 在你的ASP.NET MVC控制器中添加日志,记录每个请求的开始时间、结束时间,精确计算后台查询的实际耗时,这样可以更精准地设置超时值,避免过度设置。
- 如果后台查询确实需要很长时间,考虑把它改成异步任务(比如用后台任务队列),让Classic ASP先拿到一个任务ID,之后轮询获取结果,而不是一直等待响应——这能从根本上避免长时间等待的超时问题。
内容的提问来源于stack exchange,提问作者user11469175
相关产品推荐
相关产品推荐

