如何使用客户端vb.net程序将数据上载到具有有效SSL证书的服务器?

时间:2014-09-13 00:01:56

标签: vb.net ssl https vb.net-2010

我正在制作一个程序,并将运送清单上传到托运人网站。当我尝试上传时,我从他们的服务器收到一个不明显的错误,当与托运人核实时,他们告诉我“SSL存在问题”我正在使用。

我花了很多时间拼凑代码,从我似乎理解的那些代码可以起作用,但我没有取得任何进展。据我所知,上传其他一切都很好,但我的SSL证书存在问题

如果我理解这段代码应该正确执行的操作,我应该从托运人网站获得证书,该证书允许我的程序认证一段时间我可以上传数据。我真的不确定这是我的代码在做什么,但我见过的唯一代码示例就是这样的。

以下是更改网址的代码:

    'This references a custom class that compiles the manifest I'm going to upload
    Dim StringToUpload As String = Compile_Manifest(MyDate, UseTestDB)

    Dim webClient As New System.Net.WebClient
    webClient.Credentials = System.Net.CredentialCache.DefaultCredentials

    'From what I understand, 
    'this is supposed to set up properties used in next section of code
    System.Net.ServicePointManager.SecurityProtocol = Net.SecurityProtocolType.Ssl3
    System.Net.ServicePointManager.ServerCertificateValidationCallback = _
        AddressOf AcceptAllCertifications

    'I can see that this reaches the server, 
    'but I don't know how it relates to the next section of code 
    'that actually uploads the manifest
    Dim ServerRequest As System.Net.WebRequest = _
        System.Net.WebRequest.Create("https://www.certify.some-shippper.com:443/somefolder")
    Dim ServerResponse As System.Net.WebResponse
    ServerResponse = ServerRequest.GetResponse()
    ServerResponse.Close()

    'This code works for the upload of the manifest, 
    'and it seems the above code is unrelated and does not use a SSL certificate.
    'When this code runs I get the same error back from the shippers server, 
    'indicating an issue with my SSL, with or without the two sections of code above.
    Dim StrResult As String = ""
    Dim WrappedString As String = TransmitPLD.WrapPldFile(StringToUpload)
    'This references a custom class that wraps the data to upload 
    'in information from the shipper.
    Dim ByesToUpload As Byte() = _
        System.Web.HttpUtility.UrlEncodeToBytes(WrappedString, _
                                System.Text.ASCIIEncoding.ASCII)
    Dim Result As Byte() = _
        webClient.UploadData("https://www.certify.some-shippper.com:443/somefolder", _
                             ByesToUpload)

    StrResult = System.Web.HttpUtility.UrlDecode(Result, _
                        System.Text.ASCIIEncoding.ASCII)

    MessageBox.Show(StrResult)

1 个答案:

答案 0 :(得分:0)

事实证明我走错了方向。我需要通过System.Net.WebRequest上传我的数据,它会为我处理证书。没有实现我需要的所有代码部分,它没有处理托运人证书的检索。

如果其他人对此事感到困惑,那就是我的工作代码,供所有人查看,改编和使用。我修复代码的资源(我的意思是从头开始)是WebRequest类的MSDN页面,它的代码示例与我在C ++,C#和VB.NET中的代码示例大致相同,{{ 3}}

首先,需要设置一些全局变量,并且需要创建类来存储上传响应:

' This is set in the function that Upload function 
'  and uploads the data in the ReadCallback sub
Private Shared WrappedString As String
' This is used to wait for the callback in the Upload function
Private Shared allDone As New Threading.ManualResetEvent(False)

Friend Class RequestState
    ' This class stores the request state of the request. 
    Public request As Net.WebRequest

    Public Sub New()
        request = Nothing
    End Sub ' New 
End Class ' RequestState

然后上传部分网页请求需要一个子网站,将在下面的上传功能中进一步调用:

Private Shared Sub ReadCallback(asynchronousResult As IAsyncResult)
    Try
        Dim myRequestState As RequestState = CType(asynchronousResult.AsyncState, RequestState)
        Dim myWebRequest As Net.WebRequest = myRequestState.request
        ' End the request. 
        Dim streamResponse As IO.Stream = myWebRequest.EndGetRequestStream(asynchronousResult)
        ' Convert  the string into a byte array. 
        Dim byteArray As Byte() = System.Text.Encoding.ASCII.GetBytes(WrappedString)
        ' Write the data to the stream.
        streamResponse.Write(byteArray, 0, byteArray.Length)
        streamResponse.Close()
        ' Allow the main thread to resume.
        allDone.Set()

    Catch ex As Exception
        Throw New Exception("Error in " & Reflection.MethodBase.GetCurrentMethod.Name.ToString & " **" & ex.Message, ex)
    End Try
End Sub ' ReadCallback 

最后,这是应该调用上传数据的函数,它使用上面的所有代码:

Public Shared Function Upload(ByVal MyDate As Date) As String

    Dim StrResult As String = ""
    UploadSucess = False

    Try

        ' This is my code that builds the manifest that I want to upload
        Dim StringToUpload As String = Compile_PLD200(MyDate)
        WrappedString = TransmitPLD.WrapPldFile(StringToUpload)

        Dim myWebRequest As Net.WebRequest
        myWebRequest = Net.WebRequest.Create("https://www.some.website.com:443/someplace")

        ' Create an instance of the RequestState and assign 
        '  myWebRequest to it's request field.
        Dim myRequestState As New RequestState()
        myRequestState.request = myWebRequest
        myWebRequest.ContentType = "multipart/mixed; boundary=BOUNDARY"
        myRequestState.request.Method = "POST"

        ' Start the asynchronous 'BeginGetRequestStream' method call. 
        Dim r As IAsyncResult = CType(myWebRequest.BeginGetRequestStream(AddressOf ReadCallback, myRequestState), IAsyncResult)
        ' Pause the current thread until the async operation completes.
        allDone.WaitOne()

        ' Send the Post and get the response. 
        Dim myWebResponse As Net.WebResponse = myWebRequest.GetResponse()
        Dim streamResponse As IO.Stream = myWebResponse.GetResponseStream()
        Dim streamRead As New IO.StreamReader(streamResponse)
        Dim readBuff(256) As [Char]
        Dim count As Integer = streamRead.Read(readBuff, 0, 256)

        While count > 0
            Dim outputData As New [String](readBuff, 0, count)
            Console.WriteLine(outputData)
            count = streamRead.Read(readBuff, 0, 256)
            StrResult += outputData 
        End While

        ' Close the Stream Object.
        streamResponse.Close()
        streamRead.Close()
        ' Release the HttpWebResponse Resource.
        myWebResponse.Close()

    Catch ex As Exception
        Throw New Exception("Error in " & Reflection.MethodBase.GetCurrentMethod.Name.ToString & " **" & ex.Message, ex)
    End Try

    Return StrResult
End Function ' Upload

再次here is the link也有代码示例。

希望这有助于任何像我一样被困的人。任何对代码实施的批评都是值得欢迎的。这恰好符合我的要求,我不能说这是最有效的实施方式。