【异常描述】一个ActiveX DLL工程,写出来给 ASP 调用的,功能是用DOMDocument4下载并分析WebService的WSDL页面,生成一个WebMethod以及参数列表(至于怎么调用是后话......)用一个Standart EXE工程测试通过,完全正常,能Load 到 XML 页面,也能取出里面的信息
分析结果一切正常。但是在ASP页面里,一直都无法通过,经过N小时的调试,发现是DOMDoc.Load以后
直接执行下面的过程,而这个时候DOMDoc还没准备好,注:async属性已经设置为 False【我的解决办法】Dim vTimeOut As Long: vTimeOut = 0
m_URL = vURL
'加载文档
'===============================================
'上面已经 Set m_Doc=New DOMDocument40
'已经设置禁止使用异步模式
'===============================================
m_Doc.async = False
m_Doc.Load vURL & "?WSDL"
'------------------------------------------
'我想在这里这里来一个循环,检测是否加载完毕
'超过一定时间就抛出超时错误
'PS : Sleep API 在模块中已经申明
'实事证明:这段语句根本就没有执行!为什么?
'------------------------------------------
Do While m_Doc.readyState <> 4
    Sleep 100
    vTimeOut = vTimeOut + 100
    If vTimeOut > m_Timeout Then
        Err.Raise vbObjectError, "加载 WSDL 数据", "超时 " & vTimeOut & " > " & m_Timeout
    End If
Loop
'============================================
'不管怎样,直接执行这个,下面的判断始终为真
'============================================
If m_Doc.parseError.errorCode <> 0 Then
    Err.Raise vbObjectError, _
            m_Doc.parseError.srcText, _
            "输入路径: " & vURL & "?WSDL" & vbCrLf & _
            "异步模式:" & m_Doc.async & vbCrLf & _
            "返回代码:" & m_Doc.xml & vbCrLf & _
            "是否超时:" & vTimeOut & " : " & m_Timeout & vbCrLf & _
            "错误代码:" & m_Doc.parseError.errorCode & vbCrLf & _
            "错误原因:" & m_Doc.parseError.reason & vbCrLf & _
            "错误位置: [" & m_Doc.parseError.Line & ":" & m_Doc.parseError.linepos & "] @ " & m_Doc.parseError.filepos & vbCrLf & _
            "实际路径:" & m_Doc.parseError.URL
End If【注】
已经测试过:修改 DLL 工程的线程模型为 单线程 和单元线程 都不行【新问题】
1、为何设置了async=False还是不经加载直接进入下一步?
2、为何上面的Sleep循环不执行?难道DOMDocument40.readyState默认就等于4?
3、为何同样代码在Standard EXE程序中能正常运行?期待高手出现(解决后另开贴送200分)

解决方案 »

  1.   

    if m_Doc.Load(vURL & "?WSDL") then 
    这样看是否加载
      

  2.   

    我试过,load是没有问题的,
    我想你的程序是不是load 的路径有问题
    建议你直接在asp中使用xml对象处理,不需要再封装到dll中吧?
      

  3.   

    笨狼的办法搞定了if m_Doc.Load(vURL & "?WSDL") then 
    这样等待返回值就可以了真奇怪,为啥一定要等待返回值呢?不管了,搞定了就行
      

  4.   

    远程的用XMLHTTP取,可以保证网络延迟的情况下取回XML。
    而Dom不能用来取远程的,只能取本地的。