我有以下代码使用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()
答案 0 :(得分:0)
我能够解决它。
如果我从IE调用它(当你打开IIS,右键单击Web服务.asmx
文件,然后点击浏览),Web服务总是工作,所以我查看了Fiddler中的调用并发现只有以下工作的SOAP信封:
XmlNode=<samples><sample>
而不是我在原始帖子中使用的整个SOAP信封。所以我发现当你看到服务定义时(当你打开IIS时,右键单击web服务.asmx
文件,然后点击浏览),有三个例子,soap1.1
,{{1}和soap1.2
,所以在这种情况下我不得不使用HTTP Post
示例。所以这就是代码现在的样子:
所以这就是我现在填充信封的方式:
HTTP Post