繁体   English   中英

VB 将 SOAP 和 XML 用于 Web 服务

[英]VB using SOAP & XML for web services

我正在尝试在 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 中,我似乎找不到太多帮助来执行此操作。

我在您的代码中看不到您实际使用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()

所以现在代码看起来像这样:

 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

这对我来说似乎工作正常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM