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()
我能够解决它。如果我从IE调用web服务(打开IIS时,右键单击web服务.asmx
文件,然后单击浏览),则该web服务始终可以工作,因此我查看了Fiddler中的调用,发现工作的SOAP信封只有:XmlNode=<samples><sample>
而不是我在最初的帖子中使用的整个SOAP信封。因此,我发现当您看到服务定义时(当您打开IIS时,右键单击web服务.asmx
文件,然后单击浏览),有三个示例,soap1.1
、soap1.2
和HTTP Post
,所以在这个场景中,我不得不使用HTTP Post
示例。这就是代码现在的样子:
这就是我现在填充信封的方式:
Dim strEnvelope:strEnvelope = "XmlNode=" & SamplePlan