2017-11-08 8 views
0

VBアプリケーションでXML SOAP呼び出しをWebサービスに対して実行しようとしています。私はこれをSoapUIとXMLSpyを使って動作させることができます。これはXMLが正しいと信じさせます。コードを実行すると、エラー500 Server Internal Errorが発生します。これは私が、コードではなくXMLで何かを見逃していると私に信じさせる。私はServer Referenceを追加しようとしましたが、どちらも役に立たないようです。VB Webサービス用のSOAPと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

いくつか考えてみましょう:1)XmlDocumentにXMLを読み込んで、XMLエラーがないことを再確認してください。文字列のXMLを構築することはしばしば問題です2)ほとんどのSOAPサーバーは、コンテンツの長さを指定する必要があります(あなたのコメントはコメントアウトされています)。 3)サービスプロバイダがWSDLを利用可能にする場合は、それを使用してリクエストを作成します。 –

+0

VBは、私もそれが必要だと思ったので、私は長さにエラーを与えた。 WSDLを使用してリクエストを作成することが意味することを理解していませんか? SoapUIからの要求をコピーして貼り付け、文字列コードを作成しました。 – StephanM

+0

@StephanM - ここにWSDLに関するリンクがあります:https://www.w3.org/TR/2007/REC-wsdl20-20070626/ Web参照を追加すると、Visual Studioはプロキシクラスを作成してそれを作成します電話するのは簡単です。 – N0Alias

答えて

0

実際にあなたの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 
+0

私は昨日発見しましたが、VBでそれらを渡す方法を探していました。 – StephanM

+0

私のコードを読んだら、答えを見つけることができます。 – Bob

0

を私は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 

これは私のために正しく動作するようです。

関連する問題