Asp.net VB使用SOAP&;用于web服务的XML
我正在尝试在VB应用程序中对web服务执行XML Soap调用。我可以使用SoapUI和XMLSpy实现这一点,这让我相信XML是正确的。当我执行代码时,我得到一个错误500服务器内部错误。这让我相信我在代码中遗漏了一些东西,而不是在XML中。我确实尝试添加一个服务器引用,但这似乎也没有帮助 我将此视频用作参考: 我的代码如下所示:Asp.net VB使用SOAP&;用于web服务的XML,asp.net,xml,vb.net,web-services,soap,Asp.net,Xml,Vb.net,Web Services,Soap,我正在尝试在VB应用程序中对web服务执行XML Soap调用。我可以使用SoapUI和XMLSpy实现这一点,这让我相信XML是正确的。当我执行代码时,我得到一个错误500服务器内部错误。这让我相信我在代码中遗漏了一些东西,而不是在XML中。我确实尝试添加一个服务器引用,但这似乎也没有帮助 我将此视频用作参考: 我的代码如下所示: Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim SoapByte() As Byte
Dim SoapStr As String = ""
SoapStr = SoapStr & "<?xml version=""1.0"" encoding=""UTF-8""?>"
SoapStr = SoapStr & "<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:web=""http://webservice.lme.com"">"
SoapStr = SoapStr & "<soapenv:Header/>"
SoapStr = SoapStr & "<soapenv:Body>"
SoapStr = SoapStr & "<web:getCustomerRate>"
SoapStr = SoapStr & "<web:criIn>"
SoapStr = SoapStr & "<web:protectFreeze>Y</web:protectFreeze>"
SoapStr = SoapStr & "<web:accountNumber>226744</web:accountNumber>"
SoapStr = SoapStr & "<web:callConsgBfrDel>No</web:callConsgBfrDel>"
SoapStr = SoapStr & "<web:callforAppmnt>No</web:callforAppmnt>"
SoapStr = SoapStr & "<web:callforCarrierConv>No</web:callforCarrierConv>"
SoapStr = SoapStr & "<web:COD>N</web:COD>"
SoapStr = SoapStr & "<web:CODAmount>0</web:CODAmount>"
SoapStr = SoapStr & "<web:CODPayTerms>0</web:CODPayTerms>"
SoapStr = SoapStr & "<!--1 or more repetitions:-->"
SoapStr = SoapStr & "<web:commLines>"
SoapStr = SoapStr & "<web:commClass>100</web:commClass>"
SoapStr = SoapStr & "<web:commweight>1000</web:commweight>"
SoapStr = SoapStr & "</web:commLines>"
SoapStr = SoapStr & "<web:customerType>S</web:customerType>"
SoapStr = SoapStr & "<web:destCity>Lake City</web:destCity>"
SoapStr = SoapStr & "<web:destState>MN</web:destState>"
SoapStr = SoapStr & "<web:destZip>55041</web:destZip>"
SoapStr = SoapStr & "<web:fullValueCoverage>No</web:fullValueCoverage>"
SoapStr = SoapStr & "<web:fvcAmount>0</web:fvcAmount>"
SoapStr = SoapStr & "<web:hazMat>N</web:hazMat>"
SoapStr = SoapStr & "<web:insideDel>No</web:insideDel>"
SoapStr = SoapStr & "<web:insidePckup>No</web:insidePckup>"
SoapStr = SoapStr & "<web:lftgtReqDel>No</web:lftgtReqDel>"
SoapStr = SoapStr & "<web:lftgtRqrdPckup>No</web:lftgtRqrdPckup>"
SoapStr = SoapStr & "<web:lmtAccessDel>No</web:lmtAccessDel>"
SoapStr = SoapStr & "<web:lmtdAccessPckup>No</web:lmtdAccessPckup>"
SoapStr = SoapStr & "<web:origCity>Burnsville</web:origCity>"
SoapStr = SoapStr & "<web:origState>MN</web:origState>"
SoapStr = SoapStr & "<web:origZip>55337</web:origZip>"
SoapStr = SoapStr & "<web:palletCount>1</web:palletCount>"
SoapStr = SoapStr & "<web:palletType>PALLETS</web:palletType>"
SoapStr = SoapStr & "<web:password></web:password>"
SoapStr = SoapStr & "<web:paymentType>P</web:paymentType>"
SoapStr = SoapStr & "<web:prvtRsdncDel>No</web:prvtRsdncDel>"
SoapStr = SoapStr & "<web:prvtRsdncPckup>No</web:prvtRsdncPckup>"
SoapStr = SoapStr & "<web:shipDate>10/02/2017</web:shipDate>"
SoapStr = SoapStr & "<web:usePalletPricing>No</web:usePalletPricing>"
SoapStr = SoapStr & "<web:username></web:username>"
SoapStr = SoapStr & "</web:criIn>"
SoapStr = SoapStr & "</web:getCustomerRate>"
SoapStr = SoapStr & "</soapenv:Body>"
SoapStr = SoapStr & "</soapenv:Envelope>"
goUrl.Text = "Http://www.lme4me.com:80/webapp/CustomPricing/services/CRIMethods"
Try
SoapByte = Encoding.UTF8.GetBytes(SoapStr)
'Create initial request
Dim request As HttpWebRequest = HttpWebRequest.Create(goUrl.Text)
request.Proxy = Nothing 'Speeds up the request by setting the proxies to nothing
request.UserAgent = "Test" 'We should not be worried about this.
request.PreAuthenticate = False
request.Method = "POST"
request.ContentType = "Text/ Xml;charset=UTF-8"
'request.Headers.Add("SOAPAction", "http://www.lme4me.com:80/webapp/CustomPricing/services/CRIMethods/getCustomerRate")
request.Headers.Add("SOAPAction", "getCustomerRate")
'request.ContentLength = 2215
request.Host = "www.lme4me.com:80"
'request.Connection = "Keep-Alive"
request.UserAgent = "Apache-HttpClient / 4.1.1 (java 1.5)"
'Create the Response and reader
Dim response As HttpWebResponse = request.GetResponse()
Dim responseHdr As String = request.GetResponse.ResponseUri.ToString()
Dim responseStream As IO.Stream = response.GetResponseStream()
'Create a new Stream reader
Dim streamReader As New System.IO.StreamReader(responseStream)
Dim Data As String = streamReader.ReadToEnd
streamReader.Close()
' Display the Data on the screen
UrlResponseText.Text = Data
Catch ex As WebException
MsgBox("Inproper input: " + Err.Description)
goUrl.Text = ""
If (ex.Status = WebExceptionStatus.ProtocolError) Then
Dim error1 As String = New IO.StreamReader(ex.Response.GetResponseStream()).ReadToEnd()
MsgBox("Rest of Error: " + error1.ToString())
End If
End Try
End Sub
Private Sub goUrl_TextChanged(sender As Object, e As EventArgs) Handles goUrl.TextChanged
End Sub
SoapByte = System.Text.Encoding.UTF8.GetBytes(SoapStr)
'Create initial request
Request = WebRequest.Create(goUrl.Text)
Request.Headers.Add("SOAPAction", "http://www.lme4me.com:80/webapp/CustomPricing/services/CRIMethods/getCustomerRate")
Request.ContentType = "Text/ Xml; charset=UTF-8"
Request.ContentLength = SoapByte.Length
Request.Method = "POST"
DataStream = Request.GetRequestStream()
DataStream.Write(SoapByte, 0, SoapByte.Length)
DataStream.Close()
Response = Request.GetResponse()
DataStream = Response.GetResponseStream()
Reader = New StreamReader(DataStream)
Dim Data As String = Reader.ReadToEnd()
DataStream.Close()
Reader.Close()
Response.Close()
' Display the Data on the screen
UrlResponseText.Text = Data
Private子按钮1\u单击(发送者作为对象,e作为事件参数)处理按钮1。单击
Dim SoapByte()作为字节
Dim SoapStr As String=“”
SoapStr=SoapStr&“”
SoapStr=SoapStr&“”
SoapStr=SoapStr&“”
SoapStr=SoapStr&“”
SoapStr=SoapStr&“”
SoapStr=SoapStr&“”
SoapStr=SoapStr&“Y”
SoapStr=SoapStr&“226744”
SoapStr=SoapStr&“否”
SoapStr=SoapStr&“否”
SoapStr=SoapStr&“否”
SoapStr=SoapStr&“N”
SoapStr=SoapStr&“0”
SoapStr=SoapStr&“0”
SoapStr=SoapStr&“”
SoapStr=SoapStr&“”
SoapStr=SoapStr&“100”
SoapStr=SoapStr&“1000”
SoapStr=SoapStr&“”
SoapStr=SoapStr&“S”
SoapStr=SoapStr&“湖城”
SoapStr=SoapStr&“MN”
SoapStr=SoapStr&“55041”
SoapStr=SoapStr&“否”
SoapStr=SoapStr&“0”
SoapStr=SoapStr&“N”
SoapStr=SoapStr&“否”
SoapStr=SoapStr&“否”
SoapStr=SoapStr&“否”
SoapStr=SoapStr&“否”
SoapStr=SoapStr&“否”
SoapStr=SoapStr&“否”
SoapStr=SoapStr&“伯恩斯维尔”
SoapStr=SoapStr&“MN”
SoapStr=SoapStr&“55337”
SoapStr=SoapStr&“1”
SoapStr=SoapStr和“托盘”
SoapStr=SoapStr&“”
SoapStr=SoapStr&“P”
SoapStr=SoapStr&“否”
SoapStr=SoapStr&“否”
SoapStr=SoapStr&“10/02/2017”
SoapStr=SoapStr&“否”
SoapStr=SoapStr&“”
SoapStr=SoapStr&“”
SoapStr=SoapStr&“”
SoapStr=SoapStr&“”
SoapStr=SoapStr&“”
goul.Text=“Http://www.lme4me.com:80/webapp/CustomPricing/services/CRIMethods"
尝试
SoapByte=Encoding.UTF8.GetBytes(SoapStr)
'创建初始请求
Dim请求作为HttpWebRequest=HttpWebRequest.Create(goul.Text)
request.Proxy=Nothing'通过将代理设置为Nothing来加速请求
request.UserAgent=“Test”'我们不应该为此担心。
request.PreAuthenticate=False
request.Method=“POST”
request.ContentType=“Text/Xml;charset=UTF-8”
'request.Headers.Add(“SOAPAction”http://www.lme4me.com:80/webapp/CustomPricing/services/CRIMethods/getCustomerRate")
request.Headers.Add(“SOAPAction”、“getCustomerRate”)
'request.ContentLength=2215
request.Host=“www.lme4me.com:80”
'request.Connection=“保持活动状态”
request.UserAgent=“Apache HttpClient/4.1.1(java 1.5)”
'创建响应和读取器
Dim响应为HttpWebResponse=request.GetResponse()
Dim RESPOSSEHDR As String=request.GetResponse.ResponseUri.ToString()
Dim RESPOSSESTREAM As IO.Stream=response.GetResponseStream()
'创建新的流读取器
Dim streamReader作为新的System.IO.streamReader(responseStream)
Dim数据为字符串=streamReader.ReadToEnd
streamReader.Close()
'在屏幕上显示数据
UrlResponseText.Text=数据
捕获ex作为WebException
MsgBox(“输入正确:”+错误说明)
goul.Text=“”
如果(ex.Status=WebExceptionStatus.ProtocolError),则
Dim error1 As String=New IO.StreamReader(ex.Response.GetResponseStream()).ReadToEnd()
MsgBox(“其余错误:+error1.ToString())
如果结束
结束尝试
端接头
私有子goul_TextChanged(发送方作为对象,e作为事件args)处理goul.TextChanged
端接头
末级
在visualbasic/VB中,我似乎找不到太多的帮助 我看不到您的代码中实际使用soapStr/soapByte的地方 下面是我们正在使用的一些通用代码:
Friend Function PostWebservice(soapAction As String, xmlBody As String) As XmlDocument
Dim uTF8Encoding As New UTF8Encoding()
Dim bytes As Byte() = uTF8Encoding.GetBytes(xmlBody)
Dim requestUriString As String = "Whatever.com"
Dim httpWebRequest As HttpWebRequest = CType(WebRequest.Create(requestUriString), HttpWebRequest)
httpWebRequest.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate")
httpWebRequest.Headers.Add("SOAPAction", soapAction)
httpWebRequest.Method = "POST"
httpWebRequest.ContentType = "text/xml; charset=utf-8"
httpWebRequest.ContentLength = CLng(bytes.Length)
Dim requestStream As Stream = httpWebRequest.GetRequestStream()
requestStream.Write(bytes, 0, bytes.Length)
requestStream.Close()
Dim httpWebResponse As HttpWebResponse = CType(httpWebRequest.GetResponse(), HttpWebResponse)
Dim streamReader As StreamReader = New StreamReader(httpWebResponse.GetResponseStream(), uTF8Encoding)
Dim xmlDocument As New XmlDocument()
xmlDocument.LoadXml(streamReader.ReadToEnd())
httpWebResponse.Close()
Return xmlDocument
End Function
我发现我没有传递SoapStr,需要添加一些额外的代码来编写它 DataStream=Request.GetRequestStream() DataStream.Write(SoapByte,0,SoapByte.Length) DataStream.Close() 现在代码如下所示:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim SoapByte() As Byte
Dim SoapStr As String = ""
SoapStr = SoapStr & "<?xml version=""1.0"" encoding=""UTF-8""?>"
SoapStr = SoapStr & "<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:web=""http://webservice.lme.com"">"
SoapStr = SoapStr & "<soapenv:Header/>"
SoapStr = SoapStr & "<soapenv:Body>"
SoapStr = SoapStr & "<web:getCustomerRate>"
SoapStr = SoapStr & "<web:criIn>"
SoapStr = SoapStr & "<web:protectFreeze>Y</web:protectFreeze>"
SoapStr = SoapStr & "<web:accountNumber>226744</web:accountNumber>"
SoapStr = SoapStr & "<web:callConsgBfrDel>No</web:callConsgBfrDel>"
SoapStr = SoapStr & "<web:callforAppmnt>No</web:callforAppmnt>"
SoapStr = SoapStr & "<web:callforCarrierConv>No</web:callforCarrierConv>"
SoapStr = SoapStr & "<web:COD>N</web:COD>"
SoapStr = SoapStr & "<web:CODAmount>0</web:CODAmount>"
SoapStr = SoapStr & "<web:CODPayTerms>0</web:CODPayTerms>"
SoapStr = SoapStr & "<!--1 or more repetitions:-->"
SoapStr = SoapStr & "<web:commLines>"
SoapStr = SoapStr & "<web:commClass>100</web:commClass>"
SoapStr = SoapStr & "<web:commweight>1000</web:commweight>"
SoapStr = SoapStr & "</web:commLines>"
SoapStr = SoapStr & "<web:customerType>S</web:customerType>"
SoapStr = SoapStr & "<web:destCity>Lake City</web:destCity>"
SoapStr = SoapStr & "<web:destState>MN</web:destState>"
SoapStr = SoapStr & "<web:destZip>55041</web:destZip>"
SoapStr = SoapStr & "<web:fullValueCoverage>No</web:fullValueCoverage>"
SoapStr = SoapStr & "<web:fvcAmount>0</web:fvcAmount>"
SoapStr = SoapStr & "<web:hazMat>N</web:hazMat>"
SoapStr = SoapStr & "<web:insideDel>No</web:insideDel>"
SoapStr = SoapStr & "<web:insidePckup>No</web:insidePckup>"
SoapStr = SoapStr & "<web:lftgtReqDel>No</web:lftgtReqDel>"
SoapStr = SoapStr & "<web:lftgtRqrdPckup>No</web:lftgtRqrdPckup>"
SoapStr = SoapStr & "<web:lmtAccessDel>No</web:lmtAccessDel>"
SoapStr = SoapStr & "<web:lmtdAccessPckup>No</web:lmtdAccessPckup>"
SoapStr = SoapStr & "<web:origCity>Burnsville</web:origCity>"
SoapStr = SoapStr & "<web:origState>MN</web:origState>"
SoapStr = SoapStr & "<web:origZip>55337</web:origZip>"
SoapStr = SoapStr & "<web:palletCount>1</web:palletCount>"
SoapStr = SoapStr & "<web:palletType>PALLETS</web:palletType>"
SoapStr = SoapStr & "<web:password></web:password>"
SoapStr = SoapStr & "<web:paymentType>P</web:paymentType>"
SoapStr = SoapStr & "<web:prvtRsdncDel>No</web:prvtRsdncDel>"
SoapStr = SoapStr & "<web:prvtRsdncPckup>No</web:prvtRsdncPckup>"
SoapStr = SoapStr & "<web:shipDate>10/02/2017</web:shipDate>"
SoapStr = SoapStr & "<web:usePalletPricing>No</web:usePalletPricing>"
SoapStr = SoapStr & "<web:username></web:username>"
SoapStr = SoapStr & "</web:criIn>"
SoapStr = SoapStr & "</web:getCustomerRate>"
SoapStr = SoapStr & "</soapenv:Body>"
SoapStr = SoapStr & "</soapenv:Envelope>"
goUrl.Text = "Http://www.lme4me.com:80/webapp/CustomPricing/services/CRIMethods"
Try
SoapByte = Encoding.UTF8.GetBytes(SoapStr)
'Create initial request
Dim request As HttpWebRequest = HttpWebRequest.Create(goUrl.Text)
request.Proxy = Nothing 'Speeds up the request by setting the proxies to nothing
request.UserAgent = "Test" 'We should not be worried about this.
request.PreAuthenticate = False
request.Method = "POST"
request.ContentType = "Text/ Xml;charset=UTF-8"
'request.Headers.Add("SOAPAction", "http://www.lme4me.com:80/webapp/CustomPricing/services/CRIMethods/getCustomerRate")
request.Headers.Add("SOAPAction", "getCustomerRate")
'request.ContentLength = 2215
request.Host = "www.lme4me.com:80"
'request.Connection = "Keep-Alive"
request.UserAgent = "Apache-HttpClient / 4.1.1 (java 1.5)"
'Create the Response and reader
Dim response As HttpWebResponse = request.GetResponse()
Dim responseHdr As String = request.GetResponse.ResponseUri.ToString()
Dim responseStream As IO.Stream = response.GetResponseStream()
'Create a new Stream reader
Dim streamReader As New System.IO.StreamReader(responseStream)
Dim Data As String = streamReader.ReadToEnd
streamReader.Close()
' Display the Data on the screen
UrlResponseText.Text = Data
Catch ex As WebException
MsgBox("Inproper input: " + Err.Description)
goUrl.Text = ""
If (ex.Status = WebExceptionStatus.ProtocolError) Then
Dim error1 As String = New IO.StreamReader(ex.Response.GetResponseStream()).ReadToEnd()
MsgBox("Rest of Error: " + error1.ToString())
End If
End Try
End Sub
Private Sub goUrl_TextChanged(sender As Object, e As EventArgs) Handles goUrl.TextChanged
End Sub
SoapByte = System.Text.Encoding.UTF8.GetBytes(SoapStr)
'Create initial request
Request = WebRequest.Create(goUrl.Text)
Request.Headers.Add("SOAPAction", "http://www.lme4me.com:80/webapp/CustomPricing/services/CRIMethods/getCustomerRate")
Request.ContentType = "Text/ Xml; charset=UTF-8"
Request.ContentLength = SoapByte.Length
Request.Method = "POST"
DataStream = Request.GetRequestStream()
DataStream.Write(SoapByte, 0, SoapByte.Length)
DataStream.Close()
Response = Request.GetResponse()
DataStream = Response.GetResponseStream()
Reader = New StreamReader(DataStream)
Dim Data As String = Reader.ReadToEnd()
DataStream.Close()
Reader.Close()
Response.Close()
' Display the Data on the screen
UrlResponseText.Text = Data
这对我来说似乎是正确的。有几点想法:1)重新考虑将XML加载到XML文档中,可以肯定的是,您没有XML错误。在字符串中构建XML通常是一个问题2)大多数SOAP服务器要求提供内容长度(您的内容长度被注释掉)。3) 如果服务提供商提供WSDL,请使用它来构建您的请求。VB在长度上给了我一个错误,因为我认为我也需要它。我不明白您使用WSDL来构建我的请求是什么意思?我复制并粘贴了来自SoapUI的请求,并创建了字符串代码。@StephanM-这里有一个关于WSDLs的链接:您可以用它添加一个Web引用,Visual Studio将连接代理类以便于调用。我有Web引用,但我没有任何使用它的VB示例。我试着用SoapUI创建VB,这让我对你的起点感到困惑。在我从视频中提取的代码中,我想我缺少了将xml SoapStr传递到请求中的地方。我测试了您的代码,得到了相同的错误。我用wireshark(嗅探器)捕获了http消息,但没有得到任何其他信息。http请求中似乎缺少头(或错误头)。网页上的文档需要登录,因此我无法验证您的初始请求是否包含正确的标题。需要服务器文档中的标题示例。调试代码的最佳方法是免费下载wireshark或fiddler等嗅探器。我会将您的代码修改为o