无效的过程调用或参数:'Mid'

时间:2013-09-13 06:59:19

标签: asp-classic vbscript

我有一个功能(见下文),它完美无缺。我最近将我的代码移动到另一台服务器,我没有更改任何内容。它无法在新服务器上运行。

Microsoft VBScript runtime error '800a0005'
Invalid procedure call or argument: 'Mid'
/calculate.asp, line 416 

当我检查416行时,我得到了这个:

Dim result3: result3 = Mid(o3.responseText, Basla3, Bitir3)

这是完整的功能:

<%
    Function xyz()
    Dim o3: Set o3 = Server.CreateObject("MSXML2.ServerXMLHTTP")
    Dim o_date3: o_date3 = split(EndingDate, ".")
    Dim s_date3
    If (Len(o_date3(2)) = 4) Then
        s_date3 = o_date3(2)
    Else
        s_date3 = "20" & o_date3(2)
    End If
    If (Len(o_date3(1)) = 2) Then
        s_date3 = s_date3 & o_date3(1)
    Else
        s_date3 = s_date3 & "0" & o_date3(1)
    End If
    If (Len(o_date3(0)) = 2) Then
        s_date3 = s_date3 & o_date3(0)
    Else
        s_date3 = s_date3 & "0" & o_date3(0)
    End If
    Dim s3: s3 = "<soapenv:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/""         xmlns:urn=""urn:AntTransferWSIntf-IAntTransferWS""><soapenv:Header/><soapenv:Body><urn:EURCurrency soapenv:encodingStyle=""http://schemas.xmlsoap.org/soap/encoding/""><DateStr xsi:type=""xsd:string"">" + s_date3 + "</DateStr></urn:EURCurrency></soapenv:Body></soapenv:Envelope>"
    o3.Open "POST", serviceUrl, False
    o3.setRequestHeader "Content-Type", "text/xml"
    o3.setRequestHeader "Connection", "close"
    o3.setRequestHeader "SOAPAction", " "
    o3.send s3
    Dim hataVarMiBasla3: hataVarMiBasla3 = (InStr(1, o3.responseText, "<faultstring>", vbTextCompare)) + 13
    If (hataVarMiBasla3 > 13) Then
        Dim hataVarMiBitir3: hataVarMiBitir3 = (InStr(1, o3.responseText, "</faultstring>", vbTextCompare)) - hataVarMiBasla3
        Dim hata3: hata3 = Mid(o3.responseText, hataVarMiBasla3, hataVarMiBitir3)
        KurGetir = hata3
    Else
        Dim Basla3: Basla3 = (InStr(1, o3.responseText, """xsd:double"">", vbTextCompare)) + 13
        Dim Bitir3: Bitir3 = (InStr(1, o3.responseText, "</return>", vbTextCompare)) - Basla3
        Dim result3: result3 = Mid(o3.responseText, Basla3, Bitir3)
        xyz = CDbl(Replace(result3, ".", mstrComma))
    End If
    Set o3 = Nothing
End Function
%>

为什么我收到此错误?

2 个答案:

答案 0 :(得分:5)

Mid struct from MSDN

  

中(字符串,开始[,长度])

不是官方参考,但根据我的经验,如果

,则会出现错误
  1. 开始小于或等于零。
  2. 长度小于零(如果在中途通话中没有错过)
  3. 查看错误行和相关错误行。

    Dim Basla3: Basla3 = (InStr(1, o3.responseText, """xsd:double"">", vbTextCompare)) + 13
    Dim Bitir3: Bitir3 = (InStr(1, o3.responseText, "</return>", vbTextCompare)) - Basla3
    Dim result3: result3 = Mid(o3.responseText, Basla3, Bitir3)
    

    假设o3.responseText为空,因为您的代码不会检查响应是否为空。

    根据{{​​1}},Basla3不能小于13,所以这不是问题 然而,根据InStr() + 13(Basla3评估为13),似乎Bitir3可能小于零。
    继续假设,InStr() - Basla3评估为(InStr(1, o3.responseText, "</return>", vbTextCompare)),然后评估为0,评估为- Basla3
    田田!违反规则2 长度不能小于零
    您的代码存在问题,没有检查响应长度和响应状态。 如果响应为空,请考虑以下事项:

    1. 您的新服务器可能存在与旧服务器不同的连接问题。
    2. 您拥有的API仅授权旧服务器的IP地址。

    3. 简而言之,您应优化代码并确保存在xml响应。
      至少使用类似的东西:

      -13
      顺便说一句,由于您的请求是肥皂调用,我强烈建议您使用DomDocument等解析xml响应来完成工作。
      更换小数点,使用o3.Send If o3.readyState = 4 And o3.status = 200 Then If Len(o3.responseText) > 0 Then 'response is ready to parse Else 'response status is ok but empty End If Else 'request failed End If 对来检查节点是否存在只是麻烦和坏习惯。

答案 1 :(得分:4)

如果我猜猜。

当你的“MID”函数必须处理特殊字符或它认为是非字符串值时,VBScript会给出奇怪的错误。

因此,o3.responseText可能包含它不喜欢的文本。