【发布时间】:2018-04-21 17:26:37
【问题描述】:
我正在尝试在 VB 应用程序中对 Web 服务执行 XML Soap 调用。我可以使用 SoapUI 和 XMLSpy 让它工作,这让我相信 XML 是正确的。当我执行代码时,我收到错误 500 服务器内部错误。这让我相信我在代码中而不是在 XML 中遗漏了一些东西。我确实尝试添加服务器引用,但这似乎也没有帮助。
我将此视频用作参考:"Visual Basic - WebRequests VB.net Intermediate" 我的代码如下所示:
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
结束类
我似乎在 Visual Basic / VB 中找不到太多帮助。
【问题讨论】:
-
一些想法: 1) 重新考虑将您的 XML 加载到 XmlDocument 中,可以肯定的是,您没有 XML 错误。在字符串中构建 XML 通常是一个问题 2) 大多数 SOAP 服务器需要提供内容长度(您的已被注释掉)。 3) 如果服务提供者提供了一个可用的 WSDL,用它来构建你的请求。
-
VB 在长度上给了我一个错误,因为我认为我也需要它。我不明白您所说的使用 WSDL 来构建我的请求是什么意思?我从 SoapUI 复制并粘贴了请求并创建了字符串代码。
-
@StephanM - 这是一个关于 WSDL 的链接:w3.org/TR/2007/REC-wsdl20-20070626 您可以使用它添加一个 Web 引用,Visual Studio 将连接代理类以便于调用。
-
我有网络参考 我没有任何使用它的 VB 示例。我尝试使用 SoapUI 创建 VB,这让我对你从哪里开始感到困惑。在我发布的从视频中提取的代码中,我认为我缺少将我的 xml SoapStr 传递给请求的地方。
-
我测试了你的代码并且得到了同样的错误。我用wireshark(一个嗅探器)捕获了http消息,但没有得到任何额外的信息。看起来您在 http 请求中缺少标头(或错误标头)。网页上的文档需要登录,因此我无法验证您的初始请求是否包含正确的标题。需要服务器文档中的标头样本。调试代码的最佳方法是免费下载诸如wireshark 或fiddler 之类的嗅探器。我会将您的代码修改为仅包含供应商文档中显示的 http 标头,而不是 U-TUBE 中的示例
标签: asp.net xml vb.net web-services soap