VB.NET - Salesforce POST 请求 returns 400 错误请求错误

VB.NET - Salesforce POST Request returns 400 Bad Request Error

注意:在此之前我从未写过vb.net代码。我已经 google 寻求解决方案,但没有找到任何有效的方法。

我正在尝试从 Salesforce 获取访问令牌。 下面的代码昨天才工作。而且我不知道为什么它今天不起作用。我尝试将内容类型添加为 application/x-www-form-urlencoded 但它也不起作用。当我使用 curl 时,我可以获得访问令牌。此外,我还可以使用 google chrome 中的高级休息客户端获取访问令牌。知道为什么它会返回 400 Bad Request unknown error retry your request?

Imports System.Collections.Specialized
Imports System.Net
Imports System.Text

Module Module1

Sub Main()
    Dim clientId As String = "clientId"
    Dim clientSecret As String = "clientSecret"
    Dim redirectUri As String = "https://test.salesforce.com"
    Dim environment As String = "https://test.salesforce.com"
    Dim tokenUrl As String = ""
    Dim username As String = "username@salesforce.com"
    Dim password As String = "passwordtoken"
    Dim accessToken As String = ""
    Dim instanceUrl As String = ""

    Console.WriteLine("Getting a token")

    tokenUrl = environment + "/services/oauth2/token"
    Dim request As WebRequest = WebRequest.Create(tokenUrl)

    Dim values As NameValueCollection = New NameValueCollection()
    values.Add("grant_type", "password")
    values.Add("client_id", clientId)
    values.Add("client_secret", clientSecret)
    values.Add("redirect_uri", redirectUri)
    values.Add("username", username)
    values.Add("password", password)

    request.Method = "POST"

    Try
        Dim client = New WebClient()
        Dim responseBytes As Byte() = client.UploadValues(tokenUrl, "POST", values)
        Dim response As String = Encoding.UTF8.GetString(responseBytes)
        Console.WriteLine(response)
        Console.ReadKey()
    Catch ex As Exception
        Console.WriteLine(ex.Message)
        Console.WriteLine("Press any key to close")
        Console.ReadKey()
    End Try

End Sub

End Module

嗯,看来问题是关于 TLS 版本不匹配。所有 Salesforce 沙盒都拒绝 TLS 1.0 连接。我们的 vb.net 测试代码使用的是 TLS 1.0,因此 return 出错了。如果 Salesforce return 更好的错误代码,那就太好了。

我需要做的就是在代码块顶部添加一行代码:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11