【发布时间】:2020-06-16 20:56:12
【问题描述】:
我需要使用 Visual Basic NET 连接到本地 Web 服务器。 Web 服务器具有 TLS 1.2。首先,我需要使用用户名和密码连接到页面,然后我需要从将要打开的页面中获取一些值。我知道服务器一切正常,因为我可以连接 python 脚本。因此,不起作用的 Visual Basic 代码是:
Imports System.Net
Imports System.Net.Http
Imports Newtonsoft.Json
Public Class Main
Dim Red As Integer
Private Shared ReadOnly client As HttpClient
Public Function AcceptAllCertificates(ByVal sender As Object, ByVal certification As System.Security.Cryptography.X509Certificates.X509Certificate, ByVal chain As System.Security.Cryptography.X509Certificates.X509Chain, ByVal sslPolicyErrors As System.Net.Security.SslPolicyErrors) As Boolean
Return True
End Function
Shared Sub New()
client = New HttpClient()
End Sub
Private Function GetSessionID() As String
Dim form As MultipartFormDataContent = New MultipartFormDataContent()
form.Add(New StringContent("Login"), "login")
form.Add(New StringContent("Username"), "user")
form.Add(New StringContent("Pasword"), "pwd")
Try
Dim response As HttpResponseMessage = client.PostAsync("main.app", form).Result
Dim content As String = response.Headers.GetValues("Set-Cookie").FirstOrDefault()
Dim parts() As String = content.Split(";")
Dim value As String = parts(0)
If value.Substring(0, 9) = "SessionId" Then
Return value.Substring(10)
End If
Catch exception As Exception
End Try
Throw New Exception("Can't find the session ID")
End Function
Private Function GetTimeStamp() As Integer
Return DateTime.UtcNow.Subtract(New DateTime(1970, 1, 1)).TotalSeconds()
End Function
Private Sub GetValue(ByVal sessionID As String)
Dim response As HttpResponseMessage = client.GetAsync("ajax.app?SessionId=" & sessionID & "&service=getDp&plantItemId=00000&_=" & GetTimeStamp()).Result
Dim data = JsonConvert.DeserializeAnonymousType(response.Content.ReadAsStringAsync().Result, New With {Key .value = "", .unit = ""})
Text1.Text = data.value & " " & data.unit
End Sub
Private Sub Connect_Click(sender As Object, e As EventArgs) Handles Connect.Click
Try
Dim sessionID As String = GetSessionID()
txtSessionID.Text = sessionID
GetTemperature(sessionID)
Catch exception As Exception
MessageBox.Show(exception.ToString())
End Try
End Sub
Private Sub Main_Load(sender As Object, e As EventArgs) Handles MyBase.Load
ServicePointManager.ServerCertificateValidationCallback = AddressOf AcceptAllCertificates
'ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
client.BaseAddress = New Uri("https://xxx.xxx.xxx.xxx/)
End Sub
有效的 Python 代码是:
import requests
urllib3 = requests.urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
session = requests.session()
session.verify=False
response = session.get('https://xxx.xxx.xxx.xxx/main.app?user=Username&pwd=Password')
response = session.get('https://xxx.xxx.xxx.xxx/ajax.app?service=getDp&plantItemId=00000&_=')
print(response.text)
感谢您的帮助。
【问题讨论】:
标签: python visual-studio tls1.2