我试图通过POST方法调用web服务。输入xml是rpc / literal soap消息。
Dim myRequest As Net.HttpWebRequest
Dim objResponse As Net.HttpWebResponse
Dim result As String
Dim data As Byte()
Dim newStream As System.IO.Stream
Dim strURL As String = "https://abxxxx"
strXml.Load("D:\MyXml.xml")
data = System.Text.Encoding.ASCII.GetBytes(strXml.InnerXml)
myRequest = WebRequest.Create(strURL)
myRequest.Method = "POST"
myRequest.ContentType = "application/x-www-form-urlencoded"
myRequest.ContentLength = data.Length
myRequest.Timeout = 125000
newStream = myRequest.GetRequestStream()
newStream.Write(data, 0, data.Length)
newStream.Close()
objResponse = myRequest.GetResponse()
Dim sr As IO.StreamReader = New IO.StreamReader(objResponse.GetResponseStream())
strOutput = sr.ReadToEnd()
'Close connections
sr.Close()
objResponse.Close()
代码抛出异常"远程服务器返回错误:500"在objResponse = myRequest.GetResponse()
这是来自Web服务的实际soap响应:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body>
<soap:Fault>
<faultcode>soap:Client</faultcode>
<faultstring>Unmarshalling Error: unexpected element (uri:"", local:"CONTACT"). Expected elements are (none) </faultstring>
</soap:Fault>
</soap:Body>
</soap:Envelope>
当我使用visual studio(代理类)添加对此Web服务的引用时,这非常有效,但我不需要使用此方法。
请告知我是否遗漏了某些东西!
答案 0 :(得分:1)
在花了一些时间分析和研究我的服务的wsdl之后,我找到了解决这个问题的方法。
我们需要为所有那些在WSDL中没有直接公开的xml节点使用CDATA(即常量数据),因此这个标签应该作为文本发送到服务。此标记位于wsdl中定义的父标记下。我申请CDATA将这些信息发送到我的soap xml中。
<PARENT><![CDATA[<CONTACT>abcd </CONTEXT>]]></PARENT>
我发现了一些有关错误500的有用信息 - 远程服务器返回错误 - 此错误从服务中重现,可能有很多原因。为了得到错误的确切原因,我们需要服务的实际响应作为故障代码和故障字符串。
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body>
<soap:Fault>
<faultcode>soap:Client</faultcode>
<faultstring>Unmarshalling Error: unexpected element (uri:"", local:"CONTACT"). Expected elements are (none) </faultstring>
</soap:Fault>
</soap:Body>
</soap:Envelope>
<faultcode>soap:Client</faultcode>
- 问题来自客户,即客户输入。
<faultstring>Unmarshalling Error: unexpected element (uri:"", local:"CONTACT"). Expected elements are (none) </faultstring>
此错误表明我们正在为元素<CONTACT>
传递空白uri。 uri here表示<CONTACT>
标记的名称空间,该标记应该在相应操作的服务wsdl中可用。此元素在此处称为LOCAL,并且由于服务在wsdl中没有关于此标记的信息,因此它尝试查找此元素的命名空间。
希望这可以帮助更多人面对同样的问题。