对VB6 HTTP请求到VB.Net 2.0的转换HTTP、VB、Net

2023-09-06 09:44:41 作者:等待着不该等待的等待

我试图更新旧式VB6组件(不是我写的)到.NET平台。有一个函数,它的帖子一个XML字符串的URL:

I'm attempting to update a legacy VB6 component (not written by me) to the .NET platform. There is one function which posts an XML string to a URL:

Function PostToUrl(ByRef psUrl, ByRef psData, Byref psResponseText, ByRef psErrorMsg, ByRef psUsername, ByRef psPassword)

	On Error Resume Next	
	Dim objWinHTTP

	PostToUrl = False
	psErrorMsg = ""
	psResponseText = ""
	Dim m_lHTTPREQUEST_SETCREDENTIALS_FOR_SERVER
	m_lHTTPREQUEST_SETCREDENTIALS_FOR_SERVER    =0 	

	Set objWinHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")


	objWinHTTP.Open "POST", psUrl

	If psUsername <> "" Then
		Call objWinHTTP.SetCredentials(psUsername, psPassword, m_lHTTPREQUEST_SETCREDENTIALS_FOR_SERVER)
	End If
	objWinHTTP.SetRequestHeader "Host", "http://www.xxx.com/CSIHTTP.asp"
	objWinHTTP.SetRequestHeader "X-Method", "Submit"
	objWinHTTP.SetRequestHeader "Content-Type", "text/xml"

	objwinHTTP.setTimeouts 3000, 15000, 15000, 120000


	Call objWinHTTP.Send(psData)

	' Handle errors  '


	If Err.Number <> 0 Then

		psErrorMsg = Err.Description & " test"
		PostToUrl = False

	ElseIf objWinHTTP.Status <> 200 AND objWinHTTP.Status <> 202 Then

		psErrorMsg = "(" & objWinHTTP.Status & ") " & objWinHTTP.StatusText
		PostToUrl = False

	Else

		psErrorMsg = objWinHTTP.ResponseText & "(" & objWinHTTP.Status & ") " & objWinHTTP.StatusText
		PostToUrl = True

	End If

	Set objWinHTTP = Nothing
End Function

我已经更新这:

I've updated this to:

Public Function PostXml(ByVal XML As String) As Boolean

        Try
            Dim URL As String = My.Settings.NTSPostURL 
            'TODO: supply username and password!  '
            Dim Bytes As Byte() = Me.Encoding.GetBytes(XML)
            Dim HTTPRequest As HttpWebRequest = DirectCast(WebRequest.Create(Me.PostURL), HttpWebRequest)
            Dim Cred As New NetworkCredential("username", "password", "http://www.xxx.com")

            With HTTPRequest
                .Method = "POST"
                .ContentLength = Bytes.Length
                .ContentType = "text/xml"
                .Credentials = Cred
                .Timeout = 120000
                .Method = "Submit"
            End With

            Using RequestStream As Stream = HTTPRequest.GetRequestStream()
                RequestStream.Write(Bytes, 0, Bytes.Length)
                RequestStream.Close()
            End Using

            Using Response As HttpWebResponse = DirectCast(HTTPRequest.GetResponse(), HttpWebResponse)

                If Response.StatusCode <> HttpStatusCode.OK Then

                    Dim message As String = [String].Format("POST failed. Received HTTP {0}", Response.StatusCode)

                    Throw New ApplicationException(message)

                End If

            End Using

        Catch ex As WebException
            Dim s As String = ex.Response.ToString() & " " & ex.Status.ToString()
            Throw
        End Try

    End Function

然而,当我运行.NET code服务器返回错误 - 就行了403禁止协议错误: 使用响应,HttpWebResponse = DirectCast(HTT prequest.GetResponse(),HttpWebResponse) 。 VB6的code运行良好。任何人都可以找出导致此两者之间有什么差异?它让我难住了......

However when I run the .NET code the server returns the error '403 Forbidden - protocol error' on the line: Using Response As HttpWebResponse = DirectCast(HTTPRequest.GetResponse(), HttpWebResponse) . The VB6 code runs fine. Can anyone identify any discrepancies between the two that might be causing this? It's left me stumped....

推荐答案

在多大的痛苦,我终于设法得到它的工作。问题是与文字编码,我已经改成了ASCII和它的所有作品:

After much pain I've finally managed to get it working. Problem was with the text encoding, I've changed it to ASCII and it all works:

Try
            Dim Bytes As Byte() = Me.Encoding.GetBytes(XML)
            Dim HTTPRequest As HttpWebRequest = DirectCast(WebRequest.Create(Me.PostURL), HttpWebRequest)

            With HTTPRequest
                .Method = "POST"
                .ContentLength = Bytes.Length
                .ContentType = "text/xml"
                .Credentials = New NetworkCredential("user", "password") 'myCache
            End With

            Using RequestStream As Stream = HTTPRequest.GetRequestStream()
                RequestStream.Write(Bytes, 0, Bytes.Length)
                RequestStream.Close()
            End Using

            Using Response As HttpWebResponse = DirectCast(HTTPRequest.GetResponse(), HttpWebResponse)

                Return Response.StatusCode

            End Using

        Catch ex As WebException
            Dim s As String = ex.Status.ToString
            Throw
        End Try

感谢所有谁帮助。 Upvotes全面。

Thanks to all who helped. Upvotes all round.

 
精彩推荐
图片推荐