System.InvalidOperationException:尝试从vbscript使用web服务时缺少参数错误

本文关键字:服务 错误 参数 web 使用 InvalidOperationException vbscript System | 更新日期: 2023-09-27 18:22:50

我有下面的代码来使用javascript使用web服务。当我调用一个没有参数、只返回字符串的Dummy方法时,代码运行良好,但当我试图调用一个只有一个参数的方法时,在本例中为XmlNode,我会得到以下错误:

System.InvalidOperationException: Missing parameter: XmlNode.
   at System.Web.Services.Protocols.ValueCollectionParameterReader.Read(NameValueCollection collection)
   at System.Web.Services.Protocols.HtmlFormParameterReader.Read(HttpRequest request)
   at System.Web.Services.Protocols.HttpServerProtocol.ReadParameters()
   at System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest()

VBScript函数:

Function ConsumeWebService(SamplePlan)
    Dim oXML_Aux
    Dim strURL
    Dim logger:Set logger = New EMR_Logging
    Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP.3.0")
    Dim strEnvelope
    logger.LogInfo "Invoking ConsumeWebService - StartTime: " &  Now
    Set oXML_Aux = CreateObject(DOMDocument)
    strEnvelope = "<soap:Envelope xmlns:soap=""http://www.w3.org/2003/05/soap-envelope"" xmlns:tem=""http://tempuri.org/"">" _
       & " <soap:Header/>" _
       & " <soap:Body>" _
       & "   <tem:SyncSamplePlan_DCA>" _
       & "       <tem:XmlNode><![CDATA[" & SamplePlan & "]]></tem:XmlNode>" _
       & "    </tem:SyncSamplePlan_DCA>" _
       & " </soap:Body>" _
       & " </soap:Envelope>"
    Set oXMLDoc = CreateObject("MSXML2.DOMDocument")
    oXMLHTTP.onreadystatechange = GetRef("HandleStateChange")
    strURL = "http://ocn-da2.lsecmes.rvoaustin.local/GNE_OCN_Webparts/QC_Sampling_Plan_Import/QC_Sample_Plan_Import.asmx/SyncSamplePlan_DCA"
    call oXMLHTTP.open("POST", strURL, False)
    call oXMLHTTP.setRequestHeader("Content-Type","application/x-www-form-urlencoded") 'orig
    oXML_Aux.loadXml strEnvelope
    call oXMLHTTP.send(oXML_Aux.xml)
    logger.LogInfo "Invoking Web Service- strSoapEnvelope: " & strEnvelope
End Function
Sub HandleStateChange
    if(oXMLHTTP.readyState = 4) then
        dim szResponse: szResponse = oXMLHTTP.responseText
       call oXMLDoc.loadXML(szResponse)
       if (oXMLDoc.parseError.errorCode <> 0) then
           call msgbox(oXMLDoc.parseError.reason)
       else
           call msgbox(oXMLDoc.getElementsByTagName("string")(0).childNodes(0).text)
       end if
   end If
End Sub

所以基本上我的问题是我做错了什么?如果您检查我填充strEnvelope变量的行,则我明确地填充了XmlNode参数。我使用Soap UI为这个web服务方法获取了Soap信封,如果转到日志(你可以看到我在第一个函数的末尾记录了strEnvelope变量的值),并从这个strEnvelope变量中获取值并将其放入Soap UI中,它就可以正常工作,因此我可以确认我为这个方法使用的Soap信封是可以的。我怀疑这个问题可能与我正在使用的SetRequestHeader属性有关,但我不确定。

有人能帮我吗?

注意:我在承载web服务的同一服务器中执行vbscript。这是我在Fiddler上得到的回应:

HTTP/1.1 500 Internal Server Error
Cache-Control: private
Content-Type: text/plain; charset=utf-8
Server: Microsoft-IIS/7.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Wed, 17 Sep 2014 21:48:23 GMT
Connection: close
Content-Length: 404
System.InvalidOperationException: Missing parameter: XmlNode.
   at System.Web.Services.Protocols.ValueCollectionParameterReader.Read(NameValueCollection collection)
   at System.Web.Services.Protocols.HtmlFormParameterReader.Read(HttpRequest request)
   at System.Web.Services.Protocols.HttpServerProtocol.ReadParameters()
   at System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest()

System.InvalidOperationException:尝试从vbscript使用web服务时缺少参数错误

我能够解决它。如果我从IE调用web服务(打开IIS时,右键单击web服务.asmx文件,然后单击浏览),则该web服务始终可以工作,因此我查看了Fiddler中的调用,发现工作的SOAP信封只有:XmlNode=<samples><sample>

而不是我在最初的帖子中使用的整个SOAP信封。因此,我发现当您看到服务定义时(当您打开IIS时,右键单击web服务.asmx文件,然后单击浏览),有三个示例,soap1.1soap1.2HTTP Post,所以在这个场景中,我不得不使用HTTP Post示例。这就是代码现在的样子:

这就是我现在填充信封的方式:

Dim strEnvelope:strEnvelope = "XmlNode=" & SamplePlan