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

时间:2014-09-18 14:29:07

标签: c# web-services wcf soap vbscript

我有以下代码使用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()

1 个答案:

答案 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